Многие из тех кто общается с Виртурилкой часто матерятся из-за того устройство фиг найдёшь в сетке. Когда ip статичный - всё понятно, адрес известен, вбил в браузере и готово, админка вот она. Когда устройств много - уже сложнее, надо помнить у кого какой адрес. А когда ip динамический - начинаются проблемы, т.к. неизвестно какой именно айпишник девайс получит. Можно, конечно, посмотреть в логах роутера, какой адрес был выделен, но это изврат полный.
Давно собирался попробовать решить эту проблему да руки не доходили, а тут вот сам столкнулся с тем что консоль (которая через UART) отключена, адрес динамический и чёрт знает где девайс искать. Аж сканером хостов приходилось пользоваться. Короче, неприлично выругался и полез искать варианты.
Изначально была идея сделать обнаружение через обычные широковещательные запросы (в рцборде именно так обнаружение работает), тем более что кто-то на форуме именно так и делал. Но есть неудобство - для обнаружения необходимо отдельную софтину ставить, а лишний софт это не есть гут.
Тут очень вовремя вспомнилась технология UPnP (и SSDP - Simple Service Discovery Protocol), тем более что винда именно с помощью них девайсы в локалке и ищет. Про другие операционки не парюсь - у большинства всё-таки винда в качестве основной оси (у меня, кстати, тоже). Так что если сделать обнаружение виртурилки хотя бы для винды - уже красота будет.
В общем, стал искать примеры серверов UPnP и SSDP. Серверов UPnP нашлось вагон и маленькая тележка, но они все заточены под медиа, а, следовательно, довольно громоздки. А мне-то только обнаружение требуется. Проштудировал описание протокола SSDP, начал свой сервер писать (люблю я велосипеды). Сервер заработал, но винда его видеть отказывалась, видимо что-то неправильно сделал.
Но в процессе отладки, при просмотре сообщений от всех UPnP устройств в локалке, увидел нотификационный пакет от моего роутера породы "Зухель", где в служебных полях фигурировало что-то вроде miniupnpd. Вспомнил что у нас в файловой системе давно уже есть miniupnpc, клиент UPnP. А это, видимо, сервер.
Полез в/на гитхаб, к автору miniupnpc, и обнаружил там как раз этот самый miniupnpd. Дальше уже дело техники, теперь всё это у нас в составе SDK имеется.
Но есть одна проблемка - сервер этот (да и клиент) изначально предназначены для роутерных целей, т.е. видится он как устройство типа IGD (Internet Gateway Device) и поменять тип просто так не получится. Но это фигня, пока так оставлю. Но в будущем надо бы нормальным сервером обзавестись.
В общем, теперь лепота - железка загружается, в винде (проверял на семёрке, на восьмёрке тоже должно работать, а вот XP скорее всего в пролёте) открываем обычный проводник и видим
Название девайса берётся как обычно, из идентификатора (можно в админке редактировать на начальной странице) /etc/virt2real/deviceid
При щелчке правой кнопкой мыши, в контекстном меню есть ссылочка "Просмотр веб-страницы устройства". Если нажать - сразу откроется админка в браузере. Офигенно удобно, сам уж второй день не нарадуюсь.
Ну и в инфе об устройстве несколько полей, из которых самое важное это поле с ip адресом. Собссно, ради чего всё и делалось.
Но есть некоторые нюансы, как же без них. Сервер upnp умеет работать только на одном интерфейсе, т.е. если активны сразу два - обнаружение будет работать только на одном. Сейчас в прошивке по умолчанию сервер стартует на интерфейсе wlan0 (неважно, динамический там ip или статический). А затем, если какой-то интерфейс настроен на динамический адрес - сервер перезапустится уже на этом интерфейсе. Сложновато, но работает.
У меня динамический ip на виртурилке. Написал простой bash скрипт, который определяет свой ip с помощью wpa_cli и выводит espeak'ом или google воисом на динамик.
Footniko Суббота, 20 Декабря, 2014 19:23 цитировать ссылка на коммент