miIO - протокол для Xiaomi (Mi Home) устройств
Добавлено: Чт окт 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:
Принимаемые параметры:
Команды управления конкретными устройствами можно узнать в проектах python-miio, nodejs-miio, которые я брал за основу. В них уже реализована поддержка многих популярных девайсов. Либо из дампа трафика, захваченного Wireshark-ом.
Актуальный код брать на гитхабе.
Проект в Connect.
С уважением, skysilver.
Использование этого протокола позволяет управлять теми устройствами, которые не имеют открытого 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)
- генерация ключа и вектора инициализации из токена
- расшифровка
- шифрование
- парсинг udp-пакета
- сборка udp-пакета
Принимаемые параметры:
- --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"]}'
Актуальный код брать на гитхабе.
Проект в Connect.
С уважением, skysilver.