miIO - протокол для Xiaomi (Mi Home) устройств

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Aven
Сообщения: 529
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 3 раза
Поблагодарили: 154 раза

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение Aven » Чт окт 05, 2017 9:47 am

Включил Yeelight лампочку, не находит.
Она же тоже должна находится?
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Чт окт 05, 2017 9:52 am

Aven писал(а):апач тут нипричем, т.к. запускаю из командной строки...
Да, затупил, сорри.

Код: Выделить всё

Ошибка чтения из сокета [11] Resource temporarily unavailable
у меня бывало, когда не получает ответ от устройства. Попробуй в miio-class.php

Код: Выделить всё

public     $disc_timeout = 2; 
увеличить этот таймаут до 10, например.
Aven писал(а):Включил Yeelight лампочку, не находит. Она же тоже должна находится?
Должна. Я именно на ней и тестил.

Если у кого есть желание подебажить, то крайне полезно смотреть реальный трафик на интерфейсе сервера.
У себя в одной консоли запускаю

Код: Выделить всё

 tcpdump -i eth0 -n udp dst port 54321 or src port 54321
а в другой уже отправляю команды.

В захваченном трафике должны увидеть:
tcpdump.png
tcpdump.png (22.78 КБ) 6237 просмотров
За это сообщение автора skysilver поблагодарил:
Петр (Ср ноя 15, 2017 6:51 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Aven
Сообщения: 529
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 3 раза
Поблагодарили: 154 раза

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение Aven » Чт окт 05, 2017 12:53 pm

Да, видна проблема, скрипт отправляет трафик с неправильного интерфейса.

Код: Выделить всё

# tcpdump -i enp1s0 -n udp dst port 54321 or src port 54321
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp1s0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:48:34.941708 IP 172.16.1.11.54321 > 58.83.200.12.8053: UDP, length 32
12:48:35.211312 IP 58.83.200.12.8053 > 172.16.1.11.54321: UDP, length 32
12:48:40.596837 IP X.X.X.X.59089 > 172.16.1.11.54321: UDP, length 32
12:48:50.578899 IP 172.16.1.11.54321 > 58.83.200.12.8053: UDP, length 32
12:48:50.848457 IP 58.83.200.12.8053 > 172.16.1.11.54321: UDP, length 32
X.X.X.X - это мой белый IP адрес, смотрящий в интернет.
172.16.1.1 - смотрящий в локальную сеть.
172.16.1.11 - шлюз сяоми
Aven
Сообщения: 529
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 3 раза
Поблагодарили: 154 раза

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение Aven » Чт окт 05, 2017 12:57 pm

58.83.200.12 - я так понимаю облако сяоми
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Чт окт 05, 2017 1:09 pm

Aven писал(а):58.83.200.12 - я так понимаю облако сяоми
Именно. У меня туда же идет шифрованный трафик от шлюза и от приложения Mihome на смарте.

По поводу проблемы с неверным интерфейсом пока не могу ничего посоветовать, кроме как попробовать добавить в miio.class.php в функцию public function discover($ip = NULL) {} после строки 79 такой код:

Код: Выделить всё

if( !socket_bind($sock, '172.16.1.1' , 0) ) {
      $errorcode = socket_last_error();
      $errormsg = socket_strerror($errorcode);
      if ($this->debug) echo "Не удалось привязать сокет [$errorcode] $errormsg" . PHP_EOL;
}
if ($this->debug) echo 'Сокет успешно привязан' . PHP_EOL;
Проверять командой php miio-cli.php --discover 172.16.1.11 --debug

Знающие комрады, м.б., позже предложать что-то дельное.

Aven, сервак с MJD в роли роутера еще выступает, аха?
За это сообщение автора skysilver поблагодарил:
Петр (Ср ноя 15, 2017 6:51 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение Gelezako » Чт окт 05, 2017 1:55 pm

Устройством XIAOMI IR Mi Remote 360 с помощью вашего модуля можно будет управлять? У него тоже со сих пор нет режима разработчика и наверно не будет.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Чт окт 05, 2017 2:22 pm

Gelezako писал(а):Устройством XIAOMI IR Mi Remote 360 с помощью вашего модуля можно будет управлять? У него тоже со сих пор нет режима разработчика и наверно не будет.
Модуля пока нет. ))
В питоновской библиотеке есть базовая поддержка Xiaomi Universal IR Remote Controller (Chuangmi IR), если это то же самое, то можно будет реализовать. В каком объеме получится - тут уж надо исследовать вопрос. Лично у меня из wifi-девайсов сяоми только шлюз и лампочки yeelight, philips.
За это сообщение автора skysilver поблагодарил:
Петр (Ср ноя 15, 2017 6:51 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Aven
Сообщения: 529
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 3 раза
Поблагодарили: 154 раза

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение Aven » Чт окт 05, 2017 5:01 pm

skysilver писал(а): Знающие комрады, м.б., позже предложать что-то дельное.

Aven, сервак с MJD в роли роутера еще выступает, аха?
Нет у меня MJD =) самописные скрипты. да, этот сервер маршрутизатором выступает.
это не помогло:
СпойлерПоказать

Код: Выделить всё

# php miio-cli.php --discover 172.16.1.11 --debug
array(2) {
  ["discover"]=>
  string(11) "172.16.1.11"
  ["debug"]=>
  bool(false)
}
Поиск 172.16.1.11
Взаимодействие с устройством IP 172.16.1.11
Статус отладки [1]

Проверяем доступность устройства 172.16.1.11
Сокет успешно создан
Сокет успешно привязан
Отправляем hello-пакет на 172.16.1.11 с таймаутом 10
Ошибка чтения из сокета [11] Resource temporarily unavailable
Поиск выполнен. Устройств не найдено.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение skysilver » Пт окт 06, 2017 12:05 am

Помимо своего боевого сервера на кубике (Debian 7, PHP 5.4, один eth-порт), смоделировал два варианта:
1. Виртуалка Debian 9, PHP 7.0, три eth-порта (два бриджа в реальные сети хостовой машины - eth и wifi, и один nat), шлюз по умолчанию в подсеть отличную от целевой подсети, где находятся сяоми девайсы.
2. Хост Windows 7 x64 Pro, PHP 7.0, три сетевых интерфейса (eth, wifi, вирт. eth для VirtualBox), шлюз по умолчанию аналогично в подсеть отличную от целевой подсети.
СпойлерПоказать
01.png
01.png (30.31 КБ) 6163 просмотра
02.png
02.png (7.25 КБ) 6163 просмотра
Во всех трех случаях поиск устройств как по ip, так и по броадкасту работает штатно. Даже биндить сокеты не приходится, если в качестве броадкаста указать 192.168.1.255 вместо 255.255.255.255.
Если все же оставлять 255.255.255.255, то для корректной работы нужно забиндить сокет к нужному интерфейсу. Пожалуй, пока остановлюсь на втором варианте и вынесу ip-адрес сетевого интерфейса, смотрящего в целевую подсеть, в настройки.

Код: Выделить всё

 php miio-cli.php --discover all --debug --bindip 192.168.1.36
Поиск всех
Режим широковещательного поиска устройств
Статус отладки [1]

Поиск доступных устройств в локальной сети (handshake discovery)
Сокет успешно создан
Параметр SO_RCVTIMEO сокета успешно задан
Параметр SO_BROADCAST сокета успешно задан
Сокет успешно привязан к адресу 192.168.1.36
Отправляем hello-пакет на 255.255.255.255 с таймаутом 15
Отправлено в сокет 32 байт
1  Получен ответ от IP 192.168.1.47 с порта 54321
Прочитано 32 байта из сокета
magic: 2131
length: 0020 --> 32 байт
unknown1: 00000000
devicetype: 035a
serial: fe8e
ts: 000704ad --> 459949 секунд
checksum: b31c928032e6a4afc898c5c8768a518f  <-- may be token
2  Получен ответ от IP 192.168.1.45 с порта 54321
Прочитано 32 байта из сокета
magic: 2131
length: 0020 --> 32 байт
unknown1: 00000000
devicetype: 035f
serial: 8589
ts: 00162352 --> 1450834 секунд
checksum: c3d059d8e949382cef2c2f31c7f27799  <-- may be token
Поиск выполнен.
Найдено 2 устройств.
 IP 192.168.1.47 DevType 035a Serial fe8e Token b31c928032e6a4afc898c5c8768a518f
 IP 192.168.1.45 DevType 035f Serial 8589 Token c3d059d8e949382cef2c2f31c7f27799
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

Re: miIO - протокол для Xiaomi (Mi Home) устройств

Сообщение alekszander » Пт окт 06, 2017 7:19 am

коллеги успешно отработал поиск шлюза, но почему то токен одни нули. Это нормально?

Код: Выделить всё

IP 192.168.1.80 DevType 02d3 Serial 292c Token 00000000000000000000000000000000
Ответить