Task owner: skysilver, Киров - Россия
Current state:
Support
Портирую проекты python-miio и js-miio на php для дальнейшей нативной поддержки в MajorDoMo.
Пруф оф концепт уже есть - https://github.com/skysilver-lab/php-miio
miIO - проприетарный шифрованный сетевой протокол xiaomi, по которому взаимодействуют между собой устройства из экосистемы xiaomi. Транспорт UDP, порт 54321.
Реализация этого проекта позволит добавить в MajorDoMo поддержку тех устройств, которые не имеют открытого api (режима разработчика).
Например, Xiaomi Mi Robot Vacuum, Xiaomi Mi Smart WiFi Socket, Xiaomi Philips LED Ceiling Lamp и др.
Тема на форуме http://majordomo.smartliving.ru/forum/viewtopic.ph...
Исходная информация:
https://github.com/OpenMiHome/mihome-binary-protoc...
https://github.com/aholstenson/miio
https://github.com/rytilahti/python-miio
https://github.com/marcelrv/XiaomiRobotVacuumProto...
Перевод в статус "Поддержка"
В связи с выходом модуля Xiaomi miIO, который успешной функционирует на данной библиотеке, текущий проект переводится в статус "Поддержка".
Использование библиотеки php-miio в MajorDoMo на примере Philips Light Bulb
На форуме добавлен пример использования библиотеки php-miio в MajorDoMo на примере лампочек Philips Light Bulb.
Ссылка на пост:
http://majordomo.smartliving.ru/forum/viewtopic.ph...
Обновление ядра библиотеки (версия 0.2.6)
Актуальная версия https://github.com/skysilver-lab/php-miio/releases...
Обновления ядра библиотеки
В функцию отправки команды устройствам добавлен аргумент для задания уникального идентификатора сообщения.
Добавлена функция getMsgID($ip) для формирования и хранения в файле идентификаторов команд для устройств.
Добавлены варианты использования автоматического и ручного формирования идентификатора сообщения.
Обновления ядра библиотеки
Добавлена коррекция разницы времени между сервером и устройством.
Оптимизирован вызов функций работы с сокетами.
Добавлена функция fastDiscover() для отправки широковещательного hello-пакета без ожидания ответа от miIO-устройств.
Улучшен вывод отладочных сообщений.
Токен miIO-устройства
На форуме добавил сведения о токенах miIO-устройств - описание, способы получения и др.
Ссылка на пост http://majordomo.smartliving.ru/forum/viewtopic.ph...
Описание протокола miIO
Разработка библиотеки php-miio практически завершена. Остается немного задокументировать основные моменты.
В связи с этим в теме на форуме добавил описание протокола miIO - типы и структуру пакетов, построение сессии, шифрование и др.
Ссылка на пост http://majordomo.smartliving.ru/forum/viewtopic.ph...
Класс с api-функциями и пример его применения для управления лампочками Philips Light Bulb
Написал класс с api-функциями (philipsbulb.class.php) и пример его применения (philipsbulb-sample.php) для управления лампочками Philips Light Bulb.
Возможности:
Процедура инициализации новых miIO-устройств
Поразбирался на примере лампочки Philips с привязыванием к wifi и Mihome.
В целом алгоритм поиска и добавления нового wifi-устройства в Mihome выглядит так:
Данную процедуру можно выполнить и без Mihome с помощью метода miIO.config_router, который принимает следующие параметры:
Пример команды в консоли:
php miio-cli.php --ip 192.168.4.1 --debug --sendcmd {"id":1,"method":"miIO.config_router","params":{"ssid":"wifipointname","passwd":"wifipassword","uid":1549521xxx}}
Важно! Любое wifi-устройство в заводском состоянии шлет в ответах свой токен. Поэтому будет логично прежде, чем привязывать устройство к Mihome, узнать и записать этот токен.
Опция расшифровки пакетов в консоли
Добавлена опция расшифровки пакета --decode.
Для расшифровки требуется обязательно указать токен через параметр --token.
Примеры:
php miio-cli.php --token b31c928032e6a4afc898c5c8768a518f --decode 2131004000000000035afe8e0015866408eba3ebad7d9172ddc455d80da59372378c0735ee553f7a4116d050711867e047a0852862801fe8cc7dff5b99bea030
Расшифрованные данные: {"result":["ok"],"id":2}
php miio-cli.php --token b31c928032e6a4afc898c5c8768a518f --decode 2131006000000000035afe8e00158664308bc9afd0c2f446837a99bb303b4050bd7f4a7087ef07ca58a35f88626fb84a66044e10f3478ebde2bcd2bf1ed537aab5d20606507ef573a5c8463c5865cb86dd31336b231fc3f139131d79b5ebc8d0
Расшифрованные данные: {"id": 2, "params": ["off"], "method": "set_power"}
Улучшение работы с сокетами и тестирование библиотеки
Улучшена работа с сокетами, расширены обработка ошибок, вывод отладочной информации.
Добавлена возможность указать ip-адрес сервера, к которому привязывается сокет (актуально при наличии нескольких сетевых интерфейсов). В командной строке ip сервера указывается через параметр --bindip
Проведено тестирование на трех разных платформах - ARM (cubitruck), x86-x64 (неттоп с Windows) и виртуальная машина (Debian).
Во всех трех случаях поиск устройств как по 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
Классы miPacket и miIO. Пример работы с функциями класса miIO. Интерфейс командной строки.
Продолжаю развитие проекта.
Функционал разделен и описан классами.
miio.class.php - класс для сетевого взаимодействия по протоколу miIO:
mipacket.class.php - класс для работы с сетевыми udp-пакетами по протоколу miIO:
В качестве примера взаимодействия с устройствами написан скрипт для командной строки miio-cli.php.
Принимаемые параметры:
Актуальные исходники здесь https://github.com/skysilver-lab/php-miio