Ладно, закончу ныть и начну ленивое, довольно техническое и не очень связанное повествование про всякие интересные штуки, которые встретились на пути (поскольку в реальной жизни слушать про это никто не хочет). Занятно, что первая функция “мама должна знать, где сын” так до сих пор и не заработала нормально. Казалось бы, всё тривиально. Если телефон подключен к домашнему WiFi, то я дома. Проверять подключение можно двумя способами: в телефоне через Automate или с сервера через ping. Оба способа кривы. Automate не умеет определять момент подключения/отключения для любой сети. Так что теперь телефон пускают только в одну - 5GHz. C ping всё смешнее. Казалось бы, простейшая вещь. И на юниксах, включая MacOS, работает ожидаемым образом. А вот на Windows ping возвращает 0 (то есть, всё хорошо) в случае получения ЛЮБОГО ответа. ЛЮБОГО, КАРЛ! В том числе ответа Destination Unreachable, который мы получаем при пинге устройства в локальной сети, которого нет в ARP таблицах. Итого, если errorlevel != 0, то телефона в сети нет. А если errorlevel == 0, то телефон в сети может есть, а может и нет. УДОБНО. В результате на свет рождается pinger.bat “ping -n 1 %1 | find “TTL=” >nul”, который проверяет наличие в ответе TTL (что не работает для IPv6). По-хорошему, надо бы не ping, а на роутере проверять, но это TODO не первого приоритета, поскольку хоть как-то, но определение телефона в домашней сети довольно стабильно работает. А на скриншоте Яша и дом переговариваются #Jarvis
arping же есть: http://freecode.com/projects/arping/
ОтветитьУдалитьМожно пинговать телефон по МАК-адресу.
Да, с него всё и начиналось. Но на винде он опять же чудит. ЕМНЕП, винда возвращает IP из кэша, а чистит этот кэш иногда. Это прекрасно для определения IP по MAC, но прошедший пинг (точнее, resolve) совершенно не означает подключенный телефон. Чистить кэш перед запросом требует рутовых прав. Ну и реализация для винды (http://www.elifulkerson.com/projects/arp-ping.php) страдает от того, что у SendArp() нет способа указать таймаут. Не сложилось, короче
Удалить