Пошаговая инструкция по использованию
Этот раздел сейчас дорабатывается. Приносим извинения за неудобства. Если вам нужна срочная помощь, обратитесь в службу поддержки Tibbo.
Минимальные шаги
1. Убедитесь, что в проекте есть библиотека SOCK.
2. Добавьте в проект файлы dhcp.tbs и dhcp.tbh (они находятся в current_library_set\dhcp\trunk).
3. Добавьте #define DHCP_DEBUG_PRINT 1 в раздел определений файла global.tbh вашего проекта. Так вы «увидите, что происходит». Не забудьте убрать эту строку позже, когда убедитесь, что библиотека работает как ожидалось.
4. Добавьте include "dhcp\trunk\dhcp.tbh" в раздел подключаемых файлов global.tbh.
5. Добавьте dhcp_proc_timer() в код обработчика события on_sys_timer() (см. «Дополнительные замечания» ниже).
6. Добавьте dhcp_proc_data() в код обработчика события on_sock_data_arrival().
7. Создайте пустые тела функций обратного вызова (предположительно, в device.tbs): callback_dhcp_ok(), callback_dhcp_failure(), callback_dhcp_pre_clear_ip(), callback_dhcp_pre_buffrq() и callback_dhcp_buff_released(). Подсказка: скопируйте их из объявлений в dhcp.tbh или из примера кода.
8. Вызовите dhcp_start() откуда-нибудь - по одному разу для каждого интерфейса, на котором нужен DHCP. Как это сделать, зависит от логики вашей программы. Очевидное решение - вызвать из обработчика события on_sys_init(). В простейшем случае оставьте аргументы suggested_ip и host_name пустыми. Учтите, что dhcp_start() может завершиться ошибкой, поэтому разумно проверить возвращаемый код состояния.
9. Напишите осмысленный код для функции callback_dhcp_ok(). Как правило, когда процесс DHCP завершён, нужно обновить IP-адрес, маску сети и IP-адрес шлюза соответствующего интерфейса.
Всё перечисленное выше показано в примерах кода.
Дополнительные рекомендуемые шаги
1. Сохраняйте полученный IP-адрес в EEPROM и передавайте его в dhcp_start(). Здесь пригодится библиотека STG - см. наш пример. Так устройство (в основном) сможет продолжать использовать тот же IP-адрес.
2. По желанию передавайте в dhcp_start() имя устройства (хоста). Некоторые серверы DHCP связаны с серверами DNS, и отправка имени хоста автоматически зарегистрирует устройство на сервере DNS. По умолчанию имена устройств отключены. Чтобы включить их, добавьте в global.tbh строку: #define DHCP_MAX_HOST_NAME_LEN 32 (это разрешит имена длиной до 32 символов).
3. Использовать dhcp_stop() необязательно. В обычных условиях клиент DHCP лучше оставлять работать постоянно: библиотеке нужно следить за «истечением аренды» и вовремя её продлевать (см. «Подробности работы»). Однако вы можете остановить клиент DHCP на конкретном интерфейсе, если настройка по DHCP не удаётся (слишком много раз).
4. Использовать callback_dhcp_failure() необязательно. Процедуру можно оставить пустой. Либо, когда DHCP не удался (слишком много раз), можно задать для соответствующего сетевого интерфейса устройства запасные IP-адрес, маску сети и IP-адрес шлюза.
5. Callback_dhcp_pre_buffrq() вызывается, только когда свободного места под буферы не хватает для нужд библиотеки DHCP. Оставьте процедуру пустой, если вы абсолютно уверены, что свободного места всегда достаточно. Иначе освободите требуемое место по запросу, или DHCP не сработает.
6. Callback_dhcp_buff_released() вызывается, когда библиотеке DHCP место под буферы больше не нужно. Грамотное приложение воспользуется случаем и перераспределит освободившиеся страницы буфера между другими нуждающимися частями системы. Впрочем, этой возможностью можно и пренебречь.
Иллюстрации к перечисленным пунктам см. в примерах кода.
Не хватает места под буферы для запуска DHCP? Отберите немного у буферов сокетов. Без правильно настроенного IP-адреса от сокетов всё равно нет толку, верно? Так что освободите место под буферы сокетов в callback_dhcp_pre_buffalloc() и верните буферы сокетам в callback_dhcp_buff_released().
Дополнительные замечания
Библиотека DHCP рассчитывает, что dhcp_proc_timer() вызывается с интервалом 0,5 с. Это значение по умолчанию, его можно изменить через свойство sys.onsystimerperiod. Если вашему проекту нужно, чтобы событие on_sys_timer() происходило с другой частотой, следите, чтобы dhcp_proc_timer() по-прежнему вызывалась 2 раза в секунду. Например, если on_sys_timer() настроено на срабатывание 4 раза в секунду, нужно добавить код-«делитель», который вызывает dhcp_proc_timer() только при каждом втором срабатывании on_sys_timer().