Токены miIO-устройств
Токен - это уникальная 32-ухзначная последовательность символов, используемая для формирования ключа шифрования. Наличие и знание токена - это обязательное условие успешного управления miIO-устройством средствами модуля.
В целом процедура добавления нового устройства в приложение Mihome выглядит так:
- Включаем новое устройство в сеть. Оно создает свою открытую точку доступа.
- Приложение Mihome производит поиск новых wifi-сетей, и если находит, то предлагает добавить устройство.
- При добавлении телефон подключается к точке доступа, созданной устройством.
- Mihome посылает hello-пакет устройству.
- Устройство, получив hello-пакет, отправляет ответ на него, в котором содержится токен.
- Mihome получает ответ, сохраняет токен в свою базу данных и отправляет устройству команду на подключение к wifi-сети и пароль от нее.
- Устройство перезагружается и цепляется к целевой wifi-сети. Телефон также переключается обратно на основную точку доступа.
- Mihome и устройство обмениваются пакетами по протоколу miIO, зашифрованного на основе полученного ранее токена.
- После привязки устройства к Mihome устройства в большинстве случаев перестают транслировать свой токен в ответ на hello-пакеты. Это зависит от логики, зашитой в прошивку устройства, и версии этой прошивки. Одни устройства всегда, на любой версии прошивки, открыто отдают свой токен. Вторые отдают токен только до определенной версии прошивки, а после обновления перестают. Ну а третьи сообщают свой токен только в режиме инициализации, т.е. до привязки к Mihome и подключения к wifi-сети.
Исходя из вышеуказанной процедуры, можно рассмотреть несколько базовых подходов получения токенов устройств.
- Произвести поиск устройств в сети с помощью отправки широковещательного hello-пакета (handshake discover) и получить токен в ответном пакете от устройства.
- Извлечь токены из базы данных или кеш-файлов приложения Mihome на смартфоне.
- Сбросить устройство (или удалить из Mihome) и получить токен в режиме инициализации устройства аналогично первому способу через handshake discover.
Рассмотрим эти подходы подробнее.
Поиск устройств в сети (handshake discover)
Данный способ штатно предусмотрен в модуле Xiaomi miIO. Модуль выполняет периодический (или ручной) поиск устройств в домашней локальной сети, и если в ответных сообщениях от найденных устройств содержатся их токены, то модуль автоматически их получает и сохраняет в своих настройках.
Но, как было сказано ранее, не все так хорошо, как хотелось бы. Большинство устройств не сообщают открыто свои токены, поэтому приходится пользоваться другими способами.
База данных и кеш-файлы Mihome
Самый простой вариант - это воспользоваться кастомной сборкой Mihome от vevs (только для андроида).
Брать здесь http://www.kapiba.ru/2017/11/mi-home.html
В Mihome нужно зайти в раздел Информация о сети нужного устройства, в котором наряду с информацией о подключении к wifi точке доступа также будет строка с токеном. Бонусом получаем руссифицированный Mihome.
С другими вариациями этого подхода можно ознакомиться на Форуме.
Сброс устройства и последующая инициализация
Суть заключается в том, что предварительно нужно сбросить устройство (если оно уже было подключено к домашней сети), а затем подключиться к открытой точке доступа, которую оно создает в режиме инициализации.
В этом случае лучше воспользоваться ПК с wifi-адаптером и приложением для Windows MiHomeAdmin, которое можно скачать на Форуме.
Если Windows не подходит, то можно воспользоваться утилитой miio-cli.php в составе библиотеки php-miio. Или кросс-платформенными приложениями (в т.ч. под iOS, Android), которые позволяют отправить UDP-пакет нужной нам структуры. Примерами таким приложений могут быть Packet Sender, Packet Handler. Подробно эти варианты расписаны на Форуме.
Но у этого способа есть один нюанс - некоторые хитрые устройства меняют свой токен в момент последующей привязки к Mihome. Для таких устройств подойдет только вариант №2 - база Mihome. Так отличаются пылесос, wifi-радио и, возможно, еще какие-то другие.