0
<< предыдущая заметкаследующая заметка >>
08 октября 2018
Дроны, лампы, шашлыки

Отпраздновали день рождения нашего друга Юры Ильина, снова разжигали шашлык дронами, уже тремя.

Из любопытных технических новинок: поизучали «умную лампу» Сяоми-Филипс (полное имя Xiaomi Mi Philips Eyecare Smart Lamp 2).

Это настольная лампа, очень милая вещь по доступной цене (около 3000 руб). Немного сложна в настройке: требуется поставить приложение Mi-home, в нем заводить аккаунт (если заведен — вспоминать пароль), но и потом ничего не заработает. И штрих-код с коробки для обнаружения устройства тоже не будет сканироваться. Тогда надо переставить в приложении регион на материковый Китай вместо России, приложение обрастет иероглифами, но работать с этого момента начнет. Видимо, погоня за Телеграмом заставила Роскомнадзор заблокировать и российские сервера Сяоми ;) Лампа управляется с приложения из любого места, в том числе можно давать доступ друзьям, чтоб они включали ее и регулировали яркость из Минска, например. Только не спрашивайте меня, для чего регулировать настольную лампу дистанционно через приложение. Это глобальная интеллектуальная проблема человечества, дело не в лампе — такова сама философия Умного Дома, бессмысленная и беспощадная. Разработчики соединили лампу и приложение просто потому что могут. Но у них нет для вас других идей, как это еще можно использовать. Гораздо интереснее, что у лампы внутри. Мы полезли:

Видно, что основное управление берет на себя банальный чип (вот мне подсказывает Паша) новой серии Атмела 32-битный Кортекc М0+ Акоммуникации обеспечиваются чипом WiFi. Мы с Пашей чуть было не поспорили на 100$, там ESP8266 или другое. Уже собирались сдуть термофеном металлические заглушки и посмотреть, но обратили внимание, как устройство получает IP в домашней сетке, и оказалось, что 10.8.0.172 представляется как ESP-0905CB (что-то типа этого, сегодня уже перестал рисовать свое имя в логах dhcp почему-то).

Но заинтересовало меня другое, и вот тут хотелось бы вашего совета. Лампа управляется через сервер Mi, в ждущем режиме там что-то мелко ходит:

# sudo tcpdump -n -vv -i br0 net 10.8.0.172

13:46:45.725152 IP (tos 0x0ttl 255id 495offset 0flags [none], proto UDP (17), length 60)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 32
13
:46:45.941787 IP (tos 0x0ttl 47id 61421offset 0flags [DF], proto UDP (17), length 60)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 32

13
:47:00.975581 IP (tos 0x0ttl 255id 496offset 0flags [none], proto UDP (17), length 60)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 32
13
:47:01.192115 IP (tos 0x0ttl 47id 3490offset 0flags [DF], proto UDP (17), length 60)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 32

13
:47:06.199815 ARPEthernet (len 6), IPv4 (len 4), Request who-has 10.8.0.172 tell 10.8.0.1length 28
13
:47:06.259667 ARPEthernet (len 6), IPv4 (len 4), Reply 10.8.0.172 is-at 78:11:dc:09:08:celength 28

13
:47:16.238874 IP (tos 0x0ttl 255id 497offset 0flags [none], proto UDP (17), length 60)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 32
13
:47:16.455341 IP (tos 0x0ttl 47id 10340offset 0flags [DF], proto UDP (17), length 60)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 32

13
:47:31.510591 IP (tos 0x0ttl 255id 498offset 0flags [none], proto UDP (17), length 60)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 32
13
:47:31.727284 IP (tos 0x0ttl 47id 18016offset 0flags [DF], proto UDP (17), length 60)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 32

13
:47:36.729771 ARPEthernet (len 6), IPv4 (len 4), Request who-has 10.8.0.172 tell 10.8.0.1length 28
13
:47:36.777096 ARPEthernet (len 6), IPv4 (len 4), Reply 10.8.0.172 is-at 78:11:dc:09:08:celength 28

13
:47:46.756520 IP (tos 0x0ttl 255id 499offset 0flags [none], proto UDP (17), length 60)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 32
13
:47:46.973216 IP (tos 0x0ttl 47id 24535offset 0flags [DF], proto UDP (17), length 60)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 32

13
:48:02.018330 IP (tos 0x0ttl 255id 500offset 0flags [none], proto UDP (17), length 60)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 32
13
:48:02.234890 IP (tos 0x0ttl 47id 32240offset 0flags [DF], proto UDP (17), length 60)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 32
13
:48:07.239761 ARPEthernet (len 6), IPv4 (len 4), Request who-has 10.8.0.172
?>


_}

Если же на приложении (подключенном через другую сеть, например, мобильную) потыкать включение лампы, трафик усиливается:


<?php
13
:54:02.774269 IP (tos 0x0ttl 47id 18602offset 0flags [DF], proto UDP (17), length 220)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 192
13
:54:02.895747 IP (tos 0x0ttl 255id 595offset 0flags [none], proto UDP (17), length 124)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 96

13
:54:05.413343 IP (tos 0x0ttl 47id 19911offset 0flags [DF], proto UDP (17), length 124)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 96
13
:54:05.513889 IP (tos 0x0ttl 255id 596offset 0flags [none], proto UDP (17), length 92)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 64
13
:54:05.518579 IP (tos 0x0ttl 255id 597offset 0flags [none], proto UDP (17), length 124)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 96
13
:54:05.735244 IP (tos 0x0ttl 47id 19986offset 0flags [DF], proto UDP (17), length 92)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 64
13
:54:05.829529 IP (tos 0x0ttl 47id 20019offset 0flags [DF], proto UDP (17), length 124)    120.131.15.130.8053 10.8.0.172.54321: [udp sum okUDPlength 96
13
:54:05.915266 IP (tos 0x0ttl 255id 598offset 0flags [none], proto UDP (17), length 92)    10.8.0.172.54321 120.131.15.130.8053: [udp sum okUDPlength 64
?>


Поскольку я плохо себе представляю, что означают эти строки и как работает UDP, то сформулирую вопрос так: мне при разработке своих девайсов тоже нужно, чтобы сервер что-то посылал девайсу. Сервер, понятное дело, открыт в сети и там можно установить любой софт, не только Nginx для веба. Девайсы обычно сидят где-то глубоко за NAT (чип WiFi или чип с симкартой), и не существует возможности залезть в настройки NAT и прописать какие-то переадресации портов для этих девайсов.

Мои девайсы, разумеется, умеют пингать сервер раз в две секунды по TCP/IP, спрашивая, нет ли новых команд. Но мне все-таки хочется добиться максимальной экономии трафика. В идеале — чтобы сервер сам мог прислать своему девайсу команду, это может случиться раз в час или неделю. Без всяких постоянных пингов. Но чтобы система не висла, не теряла соединение, а приняла эту команду. Для удобства понимания задачи представим, что мы сделали лампу на симкарте в роуминге, где порог тарификации 1мб, и он стоит 100$, а зажигать-тушить ее надо всего несколько раз в сутки ;)

Сердцем я чувствую, что это должно быть возможно. Умом понимаю, что такого пока в мире нет, если каждая такая лампа, пока горит, всё равно раз в пять секунд обменивается трафиком с сервером, хотя информации друг для друга у них нет. Что скажете? Есть ли примеры удачных реализаций, когда сервер способен быстро передать девайсу актуальную информацию по своей инициативе без вот такого регулярного обмана пакетами?

UPD: Спасибо всем, кто ответил. Вкратце: задача эта известная, считается болезненной и решения не имеет. В качестве костыля применяется пингование сервера с большой регулярностью (что мы наблюдаем и в лампе, и сам я в своих проектах это использую). Пинговать можно по TCP, чуть экономичнее по UDP, а можно держать открытым TCP-соединение, но его тоже придется часто пинговать и переустанавливать, иначе закроется. Ну в качестве надежд — фантазии и прогнозы, что в далеком будущем IPv4 разложился на плесень и на липовый мед, все перейдут на IPv6, и тогда этой проблемы не будет. Но это мы слышим последние 20 лет, из них последние 15 понимаем, что оно никогда не случится ;)

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок

Комментарии к этой заметке скрываются - они будут видны только вам и мне.

Оставить комментарий