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

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

Модератор: immortal

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

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

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

miIO - проприетарный шифрованный сетевой протокол Xiaomi, по которому взаимодействуют между собой wifi-устройства из экосистемы Xiaomi (Mi Home). Используется транспорт UDP и порт 54321. Ключ шифрования формируется на основе уникального токена, который есть у каждого устройства.

Использование этого протокола позволяет управлять теми устройствами, которые не имеют открытого api (режима разработчика). Например, Xiaomi Mi Robot Vacuum, Xiaomi Mi Smart WiFi Socket, Xiaomi Philips LED Ceiling Lamp и многие другие. Также позволяет расширить имеющиеся возможности открытого api у xiaomi-шлюза, в частности переводить его в режим сопряжения, привязывать и отвязывать к нему датчики, получать список датчиков и др.

Чтобы совместно с MajorDoMo не использовать дополнительные прокладки в виде python и nodejs, начал работу по реализации библиотеки на php. Основа уже написана и работает.

Функционал разделен и описан классами.
miio.class.php - класс для сетевого взаимодействия по протоколу miIO:
  • прием udp-пакетов из сокета
  • отправка udp-пакетов в сокет
  • процедура рукопожатия (handshake)
  • отправка сообщений устройству
  • прием ответов от устройства
  • поиск устройств (handshake-discovery)
mipacket.class.php - класс для работы с сетевыми udp-пакетами по протоколу miIO:
  • генерация ключа и вектора инициализации из токена
  • расшифровка
  • шифрование
  • парсинг udp-пакета
  • сборка udp-пакета
В качестве примера взаимодействия с устройствами написан скрипт для командной строки miio-cli.php.
Принимаемые параметры:
  • --discover all поиск устройств в локальной сети и вывод информации о них
    --discover IP проверка доступности конкретного устройства и вывод информации о нем
    --info получить информацию об устройстве (аналог --discover IP)
    --sendcmd отправить команду (д.б. заключена в одинарные кавычки
    --ip IP-адрес устройства
    --token токен устройства (не обязательно)
    --debug включает вывод отладочной информации
    --help справка по командам
Примеры:

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

php miio-cli.php --discover all
php miio-cli.php --discover 192.168.1.45 --debug
php miio-cli.php --ip 192.168.1.45 --info
php miio-cli.php --ip 192.168.1.45 --sendcmd '{"method":"toggle",,"params":[],"id":1}'
php miio-cli.php --ip 192.168.1.47 --sendcmd '{"id":1,"method":"get_prop","params":["power"]}'
Команды управления конкретными устройствами можно узнать в проектах python-miio, nodejs-miio, которые я брал за основу. В них уже реализована поддержка многих популярных девайсов. Либо из дампа трафика, захваченного Wireshark-ом.

Актуальный код брать на гитхабе.
Проект в Connect.

С уважением, skysilver.
За это сообщение автора skysilver поблагодарили (всего 58):
Amarok (Чт окт 05, 2017 7:10 am) • localhost (Чт окт 05, 2017 7:33 pm) • Tehnik053 (Пт окт 06, 2017 12:09 pm) • Dark_Veter (Вт окт 10, 2017 10:40 am) • Gelezako (Вс окт 15, 2017 8:58 pm) • webms (Пт окт 20, 2017 3:14 pm) • landgraf (Вт окт 31, 2017 8:57 pm) • ysanjok (Чт ноя 02, 2017 1:24 am) • Петр (Ср ноя 15, 2017 4:16 pm) • Paly4 (Ср ноя 29, 2017 2:53 pm) и ещё 48
Рейтинг: 67.44%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1754 раза
Контактная информация:

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

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

Описание протокола miIO

1. Общие положения
miIO - проприетарный шифрованный сетевой протокол Xiaomi, по которому взаимодействуют wifi-устройства из экосистемы Xiaomi и приложение Mihome на смартфоне. В качествет транспорта используется UDP и порт 54321. Содержимое пакетов шифруется. Для контроля корректности принимаемых пакетов используется контрольная сумма на основе алгоритма MD5.

Данный протокол используется только при взаимодействии в пределах локальной сети! Взаимодействие между устройствами, приложением Mihome и облаком Xiaomi осуществляется по другому протоколу, расшифровать который пока никому не удалось.

2. Структура пакета
В протоколе miIO различают два типа пакетов - основной и hello-пакет. Hello-пакет применяется для поиска устройств в сети путем его широковещательной рассылки, либо для начала сессии с конкретным устройством. Для отправки устройству непосредственно команд используется основной пакет.

Пакет формируется из данных в hex-формате, состоит из заголовка (header) и полезной нагрузки (data).

Структура полей пакета приведена на схеме:
miIO_пакет.png
miIO_пакет.png (25.52 КБ) 29049 просмотров
  • Magic - "магическое" число, всегда равно 0х2131 (2 байта).
    Length - длина пакета в байтах(заголовок+данные) (2 байта).
    Unknown - поле неизвестного назначения. Всегда заполнено нулями 0х00000000, а у hello-пакета 0хFFFFFFFF (4 байта).
    Device type - тип устройства (2 байта).
    Device ID - идентификатор устройства (2 байта).
    Time stamp - временная отметка, время работы устройства в секундах (4 байта).
    Checksum - контрольная сумма всего пакета по алгоритму MD5. Перед расчетом КС это поле временно заполняется нулями (16 байт).
    Data - полезная нагрузка произвольной длины - зашифрованные данные, отправляемые устройству. В hello-пакете это поле отсутствует.
В hello-пакете все поля, кроме Magic и Length, принимают значение 0хFF.
miIO_hello.png
miIO_hello.png (15.8 КБ) 29049 просмотров
В особом случае, при ответе на hello-пакет, поле Checksum будет содержать 128-битное уникальное значение токена устройства. Это правило всегда актуально для новых, еще не привязанных к wifi устройств. В остальных случаях все зависит от прошивки устройства.

3. Сессия
Любое взаимодействие клиента и устройства начинается с "рукопожатия" (handshake). Клиент отправляет hello-пакет устройству и ждет от него ответ. Устройство в ответном пакете (длиной также 32 байта) отправляет свой тип, идентификатор, время работы в секундах и токен (либо нули вместо него). На основе полученных данных клиент формирует основной пакет с зашифрованной командой и отправляет устройству. Получив и выполнив команду от клиента, устройство отправляет ответный пакет с результатом выполнения принятой команды либо с ошибкой ее выполнения.

Процедура "рукопожатия" также используется для поиска устройств в локальной сети (discover). При этом hello-пакет отправляется не на конкретный IP, а на широковещательный адрес сегмента сети. Таким образом hello-пакеты получают все устройства, находящиеся в этом сегменте сети, и соответственно сообщают обратно клиенту о своем существовании.

4. Шифрование
Для шифрования отправляемых данных используется симметричный алгоритм шифрование AES128 в режиме CBC. 128-битные ключ шифрования (Key) и вектор инициализации (IV) формируются из уникального токена устройства по следующим формулам:
  • Key = MD5(Token);
    IV = MD5(Token+IV);
Перед шифрованием необходимо выполнить процедуру дополнения данных PKCS#7 padding, а после расшифровки - обратную процедуру.

5. Формат команд (api)
Команды, отправляемые устройству и принимаемые от него, представлены в формате JSON.
  • Запрос --> {"id":1,"method":"get_prop","params":["power"]}
    Ответ <-- {"id":1,"result":["ok"]}
Основные поля - это:
  • id - идентификатор запроса. Его значение не является обязательным для большинства, поэтому можно всегда выставлять равным 1. Но может быть полезен, когда одному и тому же устройству одновременно отправляются команды с разных клиентов. Для некоторых устройств (например, пылесос) данный параметр должен уникальным при каждом запросе.
    method - метод, действие. Возможные варианты зависят от конкретного устройства, но есть и общие для всех.
    params - массив свойств, параметров. Возможные варианты зависят от конкретного устройства.
Последний раз редактировалось skysilver Ср ноя 01, 2017 12:57 am, всего редактировалось 4 раза.
За это сообщение автора skysilver поблагодарили (всего 45):
Tehnik053 (Пт окт 06, 2017 12:09 pm) • Gelezako (Пн окт 16, 2017 7:04 pm) • ysanjok (Чт ноя 02, 2017 1:24 am) • Петр (Ср ноя 15, 2017 4:16 pm) • triada13 (Ср дек 06, 2017 2:27 pm) • horas (Сб дек 16, 2017 10:43 pm) • sieger (Вт янв 02, 2018 2:35 pm) • ypiter2006 (Пт янв 05, 2018 1:30 pm) • Dicont (Сб янв 13, 2018 8:27 pm) • maryan (Чт янв 18, 2018 10:24 pm) и ещё 35
Рейтинг: 52.33%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1754 раза
Контактная информация:

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

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

Токен miIO-устройства

Токен - это уникальная 32-ухзначная последовательность символов, используемая для формирования ключа шифрования.
Наличие и знание токена - это обязательное условие успешного управления miIO-устройством (далее устройство).

В целом процедура добавления нового устройства в приложение Mihome выглядит так:
  • 1. Включаем новое устройство в сеть. Оно создает свою открытую точку доступа.
    2. Приложение Mihome производит поиск новых wifi-сетей, и если находит, то предлагает добавить устройство.
    3. При добавлении телефон подключается к точке доступа, созданной устройством.
    4. Mihome посылает hello-пакет устройству.
    5. Устройство, получив hello-пакет, отправляет ответ на него, в котором содержится токен.
    6. Mihome получает ответ, сохраняет токен в свою базу данных и отправляет устройству команду на подключение к wifi-сети и пароль от нее.
    7. Устройство перезагружается и цепляется к целевой wifi-сети. Телефон также переключается обратно на основную точку доступа.
    8. Mihome и устройство обмениваются пакетами по протоколу miIO, зашифрованного на основе полученного ранее токена.
После привязки устройства к Mihome устройства в большинтсве случаев перестают транслировать свой токен в ответ на hello-пакеты. Это зависит от логики, зашитой в прошивку устройства, и версии этой прошивки. Одни устройства всегда, на любой версии прошивки, открыто отдают свой токен. Вторые отдают токен только до определенной версии прошивки, а после обновления перестают. Ну а третьи сообщают свой токен только в режиме инициализации, т.е. до привязки к Mihome и подключения к wifi-сети.

Исходя из вышеуказанной процедуры, можно рассмотреть несколько вариантов получения токена устройства.
  • 1. Произвести поиск устройств в сети с помощью handshake discover.
    2. Извлечь токены из базы данных или кеш-файлов приложения Mihome на смартфоне.
    3. Сбросить устройство (или удалить из Mihome) и получить токен в режиме инициализации устройства.
Обновлено 20.03.2018.
4-ый простой способ получить токены - воспользоваться сборкой Mihome от vevs. (только для андроида)
Брать здесь http://www.kapiba.ru/2017/11/mi-home.html Если зайти в раздел "Информация о сети" нужного устройства, то увидим там заветный токен. Бонусом получаем руссифицированный Mihome.

Рассмотрим эти варианты подробнее.

1. Поиск устройств в сети (handshake discover)

При наличии ПК с Windows самый простой способ - это поиск через приложение MiHomeAdmin https://majordomo.smartliving.ru/forum/ ... 190#p72228.

Другой способ - через консольную php-утилиту. Для поиска miIO-устройств необходимо на компьютере с установленным PHP и подключенном к локальной сети выполнить в консоли команду:

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

php miio-cli.php --discover all
Результатом команды будет список найденных устройств и в случае успеха их токенов. Если устройство не транслирует свой токен, то значение будет заполнено нулями, и в таком случае выяснять токен придется другими способами.
СпойлерПоказать
discoverall.png
discoverall.png (8.5 КБ) 28995 просмотров
Можно не опрашивать все устройства в сети, а отправить запрос адресно на конкретный IP:

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

php miio-cli.php --discover 192.168.1.47 --debug
Помимо консольной утилиты miio-cli.php можно воспользоваться кросс-платформенным приложением Packet Sender или аналогичными утилитами для смартфонов (например Packet Handler для андроида). В качестве отправляемого сообщения указать "21310020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF". Остальные настройки наглядно представлены на скриншотах.
СпойлерПоказать
packsender1.png
packsender1.png (208.63 КБ) 28995 просмотров
packethandler1.png
packethandler1.png (78.24 КБ) 28995 просмотров
packethandler2.png
packethandler2.png (85.8 КБ) 28995 просмотров
2. База данных и кеш-файлы Mihome

Внимание! Для этого способа версия Mihome д.б. 5.0.29 и ниже.

На андроид смартфоне с рутом в папке /data/data/com.xiaomi.smarthome/databases/ нужно найти файл базы данных приложения miio2.db и скопировать его в любую пользовательскую папку. Затем с помощью приложения aSQLiteManager открыть эту базу и в таблице devicerecord найти столбец token. В нем и будут токены всех устройств.

Чтобы скопировать файл базы данных на нерутованных смартфонах, нужно включить режим USB-отладки и подключиться по ADB. Затем в консоли ADB сделать резервную копию приложения Mihome командой

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

adb backup -noapk com.xiaomi.smarthome -f backup.ab
Полученный архив распаковывается java-утилитой ADB Backup Extractor

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

java.exe -jar abe.jar unpack backup.ab backup.tar
Файл backup.tar открываем обычным архиватором (7-zip) и ищем там базу miio2.db. Для просмотра базы на ПК можно воспользоваться SQLite browser.
СпойлерПоказать
miio2db.png
miio2db.png (52.83 КБ) 28995 просмотров
sqlite.png
sqlite.png (97.96 КБ) 28995 просмотров
Аналогичную процедуру можно выполнить с помощью утилиты MiToolkit. Суть та же, что и через ADB, только через windows-приложение, чтобы не ковыряться в консоли.

Условия:
  1. Установленные на ПК ADB-драйвера смартфона.
  2. Установленная на ПК Java.
  3. На смартфоне включена отладка через USB и разрешено подключение с ПК.
  4. И, разумеется, смартфон подключен по USB к ПК.
Скачиваем на ПК утилиту MiToolkit 1.5 и распаковываем архив. Запускаем MiToolkit.exe.

Переключаем на английский язык и нажимаем Extract Token.
СпойлерПоказать
mitoolkit_1.png
mitoolkit_1.png (12.28 КБ) 28574 просмотра
Появится окно с описанием процесса. В нем снова нажимаем Extract Token.
СпойлерПоказать
mitoolkit_2.png
mitoolkit_2.png (22.05 КБ) 28574 просмотра
Через некоторое время на телефоне запустится приложение Mihome, а на ПК появится предупреждение, что ни в коем случае не ставить пароль на резервную копию приложения Mihome. Нажимаем ОК.
СпойлерПоказать
mitoolkit_3.png
mitoolkit_3.png (6.28 КБ) 28574 просмотра
Далее на смартфоне появится сообщение о подтверждении создания резервной копии приложения Mihome. Оставляем поле ввода пароля пустым и тапаем Создать резервную копию данных.
СпойлерПоказать
mitoolkit_6.png
mitoolkit_6.png (72.29 КБ) 28574 просмотра
После успешной архивации на ПК появится соответствующее сообщение. Нажимаем ОК и ждем результата.
СпойлерПоказать
mitoolkit_4.png
mitoolkit_4.png (8.38 КБ) 28574 просмотра
По окончанию экспорта устройств из базы приложения в основном окне будет заполнено соответствующее поле. Если устройство много, то нужно прокрутить список вниз. Полоса прокрутки при этом не отображается, но они там есть. ))
СпойлерПоказать
mitoolkit_5.png
mitoolkit_5.png (30.68 КБ) 28574 просмотра
На рутованных смартфонах токены также можно найти в файлах кеша /data/data/com.xiaomi.smarthome/cache/smrc4-cache. Например, через тот же ADB это выглядит так:

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

adb root
adb shell
cd /data/data/com.xiaomi.smarthome/cache/smrc4-cache
grep -nr token . 
3. Сброс устройства и последующая инициализация
Здесь все то же самое, что и в первом варианте. За исключением того, что предварительно нужно подключиться к открытой точке доступа, которую создает не настроенное miIO-устройство, и выяснить какие IP-адреса выданы.

Также есть приложение для Windows MiHomeAdmin https://majordomo.smartliving.ru/forum/ ... 190#p72228.

Но у этого способа есть один нюанс - некоторые хитрожопые девайсы меняют свой токен в момент привязки к Mihome. Для таких только один вариант - база Mihome. Так отличаются пылесос, вайфай-радио, и возможно какие-то другие.
СпойлерПоказать
wifi_ap.png
wifi_ap.png (43.9 КБ) 28995 просмотров
Последний раз редактировалось skysilver Пт мар 23, 2018 12:39 am, всего редактировалось 7 раз.
За это сообщение автора skysilver поблагодарили (всего 44):
Tehnik053 (Ср ноя 01, 2017 9:09 pm) • ysanjok (Чт ноя 02, 2017 1:24 am) • Петр (Ср ноя 15, 2017 4:16 pm) • triada13 (Ср дек 06, 2017 2:27 pm) • horas (Сб дек 16, 2017 10:43 pm) • sieger (Вт янв 02, 2018 2:35 pm) • ypiter2006 (Пт янв 05, 2018 1:30 pm) • Dicont (Сб янв 13, 2018 8:26 pm) • maryan (Чт янв 18, 2018 10:24 pm) • confessor (Пн янв 22, 2018 9:30 pm) и ещё 34
Рейтинг: 51.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Чт окт 05, 2017 6:13 am

Надо модуль бы оформить =D удобнее ведь будет.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Aven
Сообщения: 529
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 3 раза
Поблагодарили: 154 раза

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

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

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

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

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

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

j1800 /usr/src/miio/php-miio-master # php miio-cli.php --discover all
array(1) {
  ["discover"]=>
  string(3) "all"
}
Поиск всех
Поиск выполнен. Устройств не найдено.
j1800 /usr/src/miio/php-miio-master # php miio-cli.php --discover 172.16.1.1
array(1) {
  ["discover"]=>
  string(10) "172.16.1.1"
}
Поиск 172.16.1.1
Поиск выполнен. Устройств не найдено.
j1800 /usr/src/miio/php-miio-master # php miio-cli.php --discover 172.16.1.11
array(1) {
  ["discover"]=>
  string(11) "172.16.1.11"
}
Поиск 172.16.1.11
Поиск выполнен. Устройств не найдено.
j1800 /usr/src/miio/php-miio-master # php miio-cli.php --discover 172.16.1.11 debug
array(1) {
  ["discover"]=>
  string(11) "172.16.1.11"
}
Поиск 172.16.1.11
Поиск выполнен. Устройств не найдено.
j1800 /usr/src/miio/php-miio-master # php miio-cli.php --ip 172.16.1.11 --info
array(2) {
  ["ip"]=>
  string(11) "172.16.1.11"
  ["info"]=>
  bool(false)
}
Устройств не отвечает.
Необходимо указать команду
        php miio-cli.php --ip 192.168.1.45 --sendcmd '{'method': 'get_status', 'id': 1}' 
Что-то не работает, ни поиск, ни получение информации по IP.
Мультикаст сообщения при этом от шлюза (172.16.1.11) я принимаю нормально.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1754 раза
Контактная информация:

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

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

Aven писал(а):Хороший проект, откуда исходная информация о протоколе?
Первоисточник https://github.com/OpenMiHome/mihome-binary-protocol
За это сообщение автора skysilver поблагодарили (всего 4):
Tehnik053 (Пт окт 06, 2017 12:09 pm) • Петр (Ср ноя 15, 2017 6:47 pm) • aprioriface (Сб апр 14, 2018 1:08 am) • VAndrey (Пт май 11, 2018 10:18 pm)
Рейтинг: 4.65%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1754 раза
Контактная информация:

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

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

nick7zmail писал(а):Надо модуль бы оформить =D удобнее ведь будет.
Аха, модуль напрашивается. Надо сначала основные вопросы решить, а потом уж попробую модулем заняться, если толку хватит у меня. ))
За это сообщение автора skysilver поблагодарили (всего 3):
Tehnik053 (Ср ноя 01, 2017 9:09 pm) • Петр (Ср ноя 15, 2017 6:47 pm) • directman66 (Ср янв 03, 2018 10:23 am)
Рейтинг: 3.49%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1754 раза
Контактная информация:

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

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

Aven писал(а):Что-то не работает, ни поиск, ни получение информации по IP.
Мультикаст сообщения при этом от шлюза (172.16.1.11) я принимаю нормально.
Попробуй такие команды:

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

php miio-cli.php --discover 172.16.1.11 --debug
php miio-cli.php --discover all --debug
Сколько сетевых интерфейсов на компе? В логе апача есть какие-то варнинги и ошибки?

У себя тестил на PHP 5.4.45, Debian 7, один сетевой интерфейс.

В шатном режиме выглядит так:
СпойлерПоказать

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

skysilver@ihome:~$ php miio-cli.php --discover all
array(1) {
  'discover' =>
  string(3) "all"
}
Поиск всех
Поиск выполнен.
Найдено 2 устройств.
 IP 192.168.1.47 DevType 035a Serial fe8e Token b31c928032e6a4afc898c5c8768a518f
{"result":{"life":400724,"cfg_time":0,"token":"b31c928032e6a4afc898c5c8768a518f","mac":"34:CE:00:81:21:2F","fw_ver":"1.4.1_48","hw_ver":"MW300","model":"yeelink.light.mono1","wifi_fw_ver":"SD878x-14.76.36.p84-702.1.0-WM","ap":{"rssi":-58,"ssid":"wifipoint","bssid":"EC:43:F6:04:48:10"},"netif":{"localIp":"192.168.1.47","mask":"255.255.255.0","gw":"192.168.1.1","gw_mac":"EC:43:F6:04:48:10"},"mmfree":233856,"ot":"otu","otu_stat":[434,352,397,4,381,783],"ott_stat":[0, 0, 0, 0]},"id":1}
 IP 192.168.1.45 DevType 035f Serial 8589 Token c3d059d8e949382cef2c2f31c7f27799
{"result":{"life":1391574,"cfg_time":0,"token":"c3d059d8e949382cef2c2f31c7f27799","mac":"34:CE:00:85:A8:2A","fw_ver":"1.4.1_147","hw_ver":"MW300","model":"lumi.gateway.v3","mcu_fw_ver":"0143","wifi_fw_ver":"SD878x-14.76.36.p84-702.1.0-WM","ap":{"rssi":-49,"ssid":"wifipoint","bssid":"EC:43:F6:04:48:10"},"netif":{"localIp":"192.168.1.45","mask":"255.255.255.0","gw":"192.168.1.1","gw_mac":"EC:43:F6:04:48:10"},"mmfree":168520,"ot":"otu","otu_stat":[579,523,44092,52,43479,393],"ott_stat":[9, 0, 212, 1515]},"id":1}

skysilver@ihome:~$ php miio-cli.php --ip 192.168.1.47 --info
array(2) {
  'ip' =>
  string(12) "192.168.1.47"
  'info' =>
  bool(false)
}
Информация об устройстве:
{"result":{"life":400764,"cfg_time":0,"token":"b31c928032e6a4afc898c5c8768a518f","mac":"34:CE:00:81:21:2F","fw_ver":"1.4.1_48","hw_ver":"MW300","model":"yeelink.light.mono1","wifi_fw_ver":"SD878x-14.76.36.p84-702.1.0-WM","ap":{"rssi":-57,"ssid":"wifipoint","bssid":"EC:43:F6:04:48:10"},"netif":{"localIp":"192.168.1.47","mask":"255.255.255.0","gw":"192.168.1.1","gw_mac":"EC:43:F6:04:48:10"},"mmfree":233848,"ot":"otu","otu_stat":[434,352,398,4,382,783],"ott_stat":[0, 0, 0, 0]},"id":1}
192.168.1.45 - шлюз
192.168.1.47 - белая лампочка yeelight
Последний раз редактировалось skysilver Чт окт 05, 2017 9:39 am, всего редактировалось 1 раз.
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 9:38 am

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

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

Поиск доступных устройств в локальной сети (handshake discovery)
Сокет успешно создан
Отправляем hello-пакет на 255.255.255.255 с таймаутом 2
Поиск выполнен. Устройств не найдено.
j1800 /usr/src/miio/php-miio-master # 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 с таймаутом 2
Ошибка чтения из сокета [11] Resource temporarily unavailable
Поиск выполнен. Устройств не найдено.
j1800 /usr/src/miio/php-miio-master # php -v
PHP 7.0.21 (cli) (built: Aug  2 2017 15:03:05) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.21, Copyright (c) 1999-2017, by Zend Technologies
j1800 /usr/src/miio/php-miio-master # uname -a
Linux j1800 4.9.34-gentoo #1 SMP Thu Aug 3 20:26:33 MSK 2017 i686 Intel(R) Celeron(R) CPU J1800 @ 2.41GHz GenuineIntel GNU/Linux
j1800 /usr/src/miio/php-miio-master # ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 0a:e8:4c:68:19:f3 brd ff:ff:ff:ff:ff:ff
3: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 0a:e8:4c:68:19:f4 brd ff:ff:ff:ff:ff:ff
4: enp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 0a:e8:4c:68:19:f5 brd ff:ff:ff:ff:ff:ff
5: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:19:db:3c:f3:8d brd ff:ff:ff:ff:ff:ff
апач тут нипричем, т.к. запускаю из командной строки...
Ответить