Подробности работы
Этот раздел сейчас дорабатывается. Приносим извинения за неудобства. Если вам нужна срочная помощь, обратитесь в службу поддержки Tibbo.
Клиент DHCP, запущенный на конкретном интерфейсе вызовом dhcp_start(), работает непрерывно, пока не будет остановлен вызовом dhcp_stop(). За работой библиотеки можно наблюдать в режиме отладки, добавив #define DHCP_DEBUG_PRINT 1 в раздел определений файла global.tbh проекта. Тогда в панели консоли во время работы библиотеки DHCP будет выводиться масса сведений о состоянии.
После успешного вызова dhcp_start() (а он может завершиться ошибкой - проверяйте возвращаемый код!) библиотека пытается получить от сервера DHCP IP-адрес, маску сети и IP-адрес шлюза. Если процесс не удался, библиотека повторяет попытки. Всего выполняется DHCP_MAX_RETRIES попыток (со случайными паузами между ними, не превышающими DHCP_MAX_RETRY_DELAY секунд), после чего вызывается callback_dhcp_failure() и библиотека уходит в ожидание на DHCP_POST_FAIL_DELAY секунд. По окончании паузы выполняется очередная серия из DHCP_MAX_RETRIES попыток, и так до бесконечности, пока не будет вызван dhcp_stop() или настройка по DHCP не удастся.
Для настройки по DHCP исходный IP-адрес клиентского устройства должен быть 0.0.0.0. Если IP-адрес указанного интерфейса другой, библиотека установит его в 0.0.0.0. Чтобы сменить IP-адрес интерфейса, нужно сначала закрыть все соединения сокетов на этом интерфейсе. Библиотека DHCP делает это сама, вызывая sock.discard для каждого задействованного сокета. Перед этим библиотека DHCP вызывает callback_dhcp_pre_clear_ip(). Так приложение может «подготовиться» к тому, что будет дальше. Например, можно добавить код для аккуратного закрытия соединений TCP (вместо грубого сброса библиотекой DHCP).
Пока на любом из сетевых интерфейсов выполняется серия из DHCP_MAX_RETRIES попыток, требуется 6 страниц буфера. Библиотека проверяет, есть ли нужное место, и вызывает callback_dhcp_pre_buffrq(), если нужно больше. Когда серия попыток заканчивается (успешно или нет), место под буферы больше не нужно, и библиотека его освобождает. Об этом система узнаёт по вызову callback_dhcp_buff_released(). После этого система может проверить общее число доступных свободных страниц (теперь, когда библиотека DHCP освободила часть страниц) через свойство sys.freebuffpages (только чтение).
Библиотека может настраивать DHCP на интерфейсах Ethernet (net.) и Wi-Fi (wln.) одновременно. Требования к месту под буферы при этом не растут. Библиотека займёт страницы буфера, когда они понадобятся любому из интерфейсов, и освободит их, когда ни одному из сетевых интерфейсов они больше не нужны.
Когда настройка по DHCP на конкретном сетевом интерфейсе успешно завершена, вызывается callback_dhcp_ok(). Тогда можно записать новые IP-адрес (а также маску сети и IP-адрес шлюза) в объект net. или wln. Сделать это можно, только когда на интерфейсе, свойства которого вы собираетесь менять, нет активных сокетов.
После успешной настройки по DHCP библиотека начинает отсчитывать время аренды. Когда проходит 90% времени аренды, библиотека пытается её продлить. Для этого снова понадобятся страницы буфера. Для продления аренды IP-адрес сбрасывать в 0.0.0.0 не нужно, поэтому callback_dhcp_pre_clear_ip() тоже не вызывается.
Учтите, что даже при продлении аренды IP-адрес, предложенный сервером DHCP, может измениться. Не забудьте это обработать! Вообще говоря, проще перезагрузить устройство, чем разбираться со всеми последствиями смены IP-адреса. Как с этим справиться, показано в разделе «Примеры кода».
Библиотека также следит за состоянием связи сетевых интерфейсов. Если кабель Ethernet отсоединили и снова подключили (это отслеживается через свойство net.linstate, только чтение), процесс DHCP (если он включён) автоматически перезапустится для интерфейса Ethernet. Аналогично, если ассоциация с точкой доступа потеряна и затем восстановлена (wln.associationstate), процесс DHCP (если он включён) автоматически перезапустится для интерфейса Wi-Fi.