Модуль net предоставляет ICMP-проверку доступности узла. Разрешение доменных имён также доступно через socket.gethostbyname.

ping

  net.ping(addr, size=32, timeout=0.2)
  

Отправляет один ICMP Echo Request через локальный Ethernet-интерфейс и ожидает соответствующий Echo Reply. Возвращает кортеж (elapsed_ms, result):

  • elapsed_ms — время ожидания/обмена в целых миллисекундах;
  • result — код lwIP: 0 при успехе, отрицательное число при сетевой ошибке.

Аргументы можно передать позиционно или по имени:

  • addr — обязательная строка с числовым IPv4-адресом либо доменным именем;
  • size — размер данных ICMP, целое от 1 до 128 байт, по умолчанию 32. Дополнительно передаются 8 байт заголовка ICMP и заголовок IP;
  • timeout — ожидание в секундах, по умолчанию 0.2. После перевода в миллисекунды допустимо 1…4294967295; дробная часть миллисекунды отбрасывается. Ноль, отрицательные значения, NaN и бесконечность вызывают ValueError.

Неверный размер вызывает ValueError. Ошибки обмена обычно возвращаются в result, поэтому их нужно проверять явно. Основные коды: -1 — не удалось выделить память, -3 — таймаут, -4 — ошибка маршрута, -8 — ресурс ping занят. Это коды lwIP, они не совпадают с положительными номерами errno сокетов.

  import net
from time import sleep

# Замените адрес на доступный узел вашей сети, отвечающий на ICMP.
for _ in range(3):
    elapsed_ms, result = net.ping('192.168.50.1', size=32, timeout=0.5)
    if result == 0:
        print('Ответ за', elapsed_ms, 'мс')
    else:
        print('Ошибка ping:', result)
    sleep(1)
  

Отсутствие ответа не означает, что узел выключен: ICMP может фильтроваться. Доступность HTTP/TCP также не гарантирует ответ на ping.

Для доменного имени сначала выполняется DNS-разрешение. Его время не включается в elapsed_ms, а timeout ограничивает ожидание ICMP, не DNS. Нужны корректные сетевые настройки и DNS-сервер. При необходимости разрешайте адрес отдельно:

  import socket
import net

# Требуется работающий DNS.
address = socket.gethostbyname('telematic.dev')
print(net.ping(address, size=32, timeout=0.5))
  

В модуле net нет gethostbyname: импортируйте эту функцию из socket. На контроллере X0 проверен обмен со шлюзом для размеров данных 1, 7, 32 и 128 байт, а также отклонение недопустимых аргументов. Это не проверка доступности любого внешнего домена.