Как узнать токен xiaomi mi robot vacuum ios
Перейти к содержимому

Как узнать токен xiaomi mi robot vacuum ios

  • автор:

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

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

В целом процедура добавления нового устройства в приложение Mihome выглядит так:

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

Исходя из вышеуказанной процедуры, можно рассмотреть несколько базовых подходов получения токенов устройств.

  1. Произвести поиск устройств в сети с помощью отправки широковещательного hello-пакета (handshake discover) и получить токен в ответном пакете от устройства.
  2. Извлечь токены из базы данных или кеш-файлов приложения Mihome на смартфоне.
  3. Сбросить устройство (или удалить из 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-радио и, возможно, еще какие-то другие.

Катаемся на Xiaomi Vacuum Cleaner

Вот и пришли новогодние праздники, а с ними и куча свободного времени, да еще и умный пылесос угодил ко мне в руки. Как только я увидел в приложении MiHome ручное управление, я сразу понял, что хочу сделать: будем управлять пылесосом с помощью геймпада Dualshock v4!

Шаг 1, тащим токен, прошиваем (опционально)

Ставим пропатченное приложение MiHome, которое будет показывать нам токен, далее выбираем рутованную прошивку, скачиваем, ставим python-miio (pip install python-miio), пробуем установить прошивку с помощью mirobo —ip %ip% —token %token% update-firmware %filename% и на этом моменте у меня все сломалось. Пылесос отчаянно отказывался обновляться, после нескольких часов гугления я попробовал посмотреть отладочный вывод mirobo и о чудо! Из-за того, что у меня на ноутбуке установлено несколько адаптеров, он пытался раздать прошивку в сети адаптера VirtualBox Host-Only. Далее я просто поднял файловый сервер и выполнил эту команду: mirobo —ip=%ip% —token=%token% raw-command miIO.ota » . Прошивка встала где-то за 10 минут, доступ по ssh работал

Шаг 2, пытаемся покататься на роботе

import miio ip = '' token = '' bot = miio.vacuum.Vacuum(ip, token) bot.manual_start() bot.manual_control(0, 0.3, 2000) # move forward with max speed for 2 seconds bot.manual_control(90, 0, 1000) # rotate bot.manual_stop()

На этом этапе пылесос должен сказать Using remote controls (или что-то подобное в зависимости от прошивки), подергаться и остановиться

Шаг 3, подключаем Dualshock

После небольшого исследования было решено использовать pygame
Смотрим, какие кнопки/стикеры за что отвечают

 BUTTON_SQUARE = 0 BUTTON_X = 1 BUTTON_CIRCLE = 2 BUTTON_TRIANGLE = 3 def init_joystick(): pygame.init() pygame.joystick.init() controller = pygame.joystick.Joystick(0) controller.init() return controller def main(): controller = init_joystick() bot = miio.vacuum.Vacuum(ip, token) modes = ['manual', 'home', 'spot', 'cleaning', 'unk'] mode = 'unk' axis = [0.00 for _ in range(6)] flag = True button = [False for _ in range(14)] print('Press start to start!') while flag: for event in pygame.event.get(): if event.type == pygame.JOYAXISMOTION: axis[event.axis] = round(event.value,2) elif event.type == pygame.JOYBUTTONDOWN: button[event.button] = True # Touchpad to exit if event.button == 13: flag = False elif event.type == pygame.JOYBUTTONUP: if mode == 'unk': print('Ready to go! Press X to start manual mode') if event.button == BUTTON_X: mode = 'manual' bot.manual_start() elif mode == 'manual': if event.button == BUTTON_TRIANGLE: bot.manual_stop() mode = 'unk' elif event.button == BUTTON_X: play_sound('http://192.168.1.43:8080/dejavu.mp3') # see ya later elif event.button == BUTTON_CIRCLE: # stop sound play_sound(';') if mode == 'manual': try: move_robot(bot, button, axis) # see ya in the next step except: bot.manual_start() pass time.sleep(0.01) 

Пока в move_robot можно сделать просто print(axis) и проверить, что джойстик работает.
Далее нам нужно сделать так, чтобы робот ездил при нажатии на кнопки/стики, я выбрал левый стик по оси Y (вверх -1, вниз 1) для скорости и правый стик по оси X для угла, получилась примерно такая функция

 def translate(value, leftMin, leftMax, rightMin, rightMax): leftSpan = leftMax - leftMin rightSpan = rightMax - rightMin valueScaled = float(value - leftMin) / float(leftSpan) return rightMin + (valueScaled * rightSpan) def move_robot(bot, buttons, axis): rot = 0 val = 0 to_min, to_max = -0.3, 0.3 # Right stick X if axis[2] != 0: rot = -translate(axis[2], -1, 1, -90, 90) if abs(rot) < 8: rot = 0 # Left stick Y, -1 up, 1 down if axis[1] != 0: val = -translate(axis[1], -1, 1, to_min, to_max) if abs(val) < 0.07: val = 0 if rot or val: bot.manual_control(rot, val, 150) 

Запускаем скрипт, жмем Х на контроллере и робот должен ездить и поворачивать
На этом этапе у меня возникла проблема: почему-то если нажать левый стик вперед до конца и попытаться повернуть, он не будет поворачивать, придется сначала сбросить скорость, если попытаться уменьшить значения маппинга, например поставить -0.29, 0.29, он начнет ездить по кругу, пока не изменится положение левого стикера, я так и не разобрался, в чем тут проблема

Шаг 4, добавим музыки

Заходим по ssh на нашего робота и смотрим, какие скриптовые языки тут есть.

Питона не было, а устанавливать его я смысла не видел, зато нашел перл, для нашей небольшой задачки подойдет.

Далее устанавливаем sox:

sudo apt-get install sox, libsox-fmt-mp3

и пишем небольшой сервер на перле:

#!/usr/bin/perl use IO::Socket::INET; $| = 1; my $socket = new IO::Socket::INET ( LocalHost => '0.0.0.0', LocalPort => '7777', Proto => 'tcp', Listen => 2, Reuse => 1 ); die "cannot create socket $!\n" unless $socket; print "server waiting for client connection on port 7777\n"; while(1) < my $client_socket = $socket->accept(); my $client_address = $client_socket->peerhost(); my $client_port = $client_socket->peerport(); print "connection from $client_address:$client_port\n"; my $data = ""; $client_socket->recv($data, 256); print "received data: $data\n"; my @urls = split /;/, $data; system("killall play > /dev/null"); $data = "ok"; $client_socket->send($data); shutdown($client_socket, 1); if ( $urls[0] ne "") < system("play -q -v 0.4 " . $urls[0] . " &"); >> $socket->close(); 
sudo perl sound_server.pl

у себя в консольке делаем что-то вроде

import socket ip = '' s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip, 7777)) s.sendall(b'http://%local_ip%:%local_port%/test.mp3;') s.close()

И через пылесос должен заиграть наш test.mp3 (соответственно, нужно поднять файловый сервер на нашей локальной машине).

Наша функция play_sound() будет делать практически то же самое, только будет sendall(url+';'), url — аргумент функции.

Как узнать токен пылесоса Xiaomi Roborock?

Хотел поменять языковой пакет, в инструкциях, которые в интернете, токен можно было посмотреть прямо в приложении на телефоне, сейчас же узкоглазые косорезы убрали эту возможность. Через MiTool тоже не получается т. к. программа не находит телефон, отладку настраивал как положено. Как еще можно узнать токен или может есть другой способ установки русскоязычного языкового пакета?

Лучший ответ

А что, робот не сертифицирован для использования на территории РФ? Вот что отвечают на официальном сайте поддержки: "Робот, который вы приобрели, не сертифицирован и не может быть использован. Пожалуйста, приобретите его по обычным каналам. Если у вас есть какие-либо вопросы, пожалуйста, свяжитесь с дилером."
Так что, оскорбления производителя неуместны.

Задавать подобные вопросы необходимо на ресурсах, где хотя бы понимают, что такое "токен"
"Копайте" глубже мегабайты опыта "самоделкиных" с самого "продвинутого" портала по бытовой электронике
https://4pda.ru/forum/index.php?showtopic=881982&st=3720
https://yandex.ru/turbo?text=https://sprut.ai/client/article/759&d=1

Остальные ответы
отпишите плз, удалось ли как-то сделать
NonameУченик (85) 4 года назад
Так и не разобрался

Александр Жуков Знаток (280) Я смотри как сделал, скачал на телефон программу XVacuum Firmware, на комп утилиту win-mirobo и несколько голосовых пакетов. сбрасываешь настройки сети на пылесосе (пылесос создает свою точку wi-fi) подключаешься к ней и с телефона и с компьютера. на телефоне в программе смотришь токен. потом уже меняешь озвучку в win-mirobo вставляя в файл конфига его ip(в свойствах сети смотришь) и полученный на телефоне токен и вуаля

До сих пор не понятно как узнать token

Пламенные товарищи из Поднебесной совершенно сознательно продают в Россию версии Сяомососов, предназначенные для продажи на территории континентального Китая. У них перепроизводство, а у нас пипл всё схавает и обладая природным талантом обойдет любые запреты. Да вот только бытовая техника не то поприще на котором стоит так изголяться. Вы сделали большую ошибку купив пылесос Сяоми. Нужно было покупать нечто по-надежнее, например iRobot

Добываем токен (Token) Xiaomi MiHome с iOS устройств через MacBook

На портале уже есть статьи о извлечении токена через командную строку Raspberry, и с Android устройств. Чтобы эта тема была освящена со всех сторон, опишу как получить токен, если у вас есть только iOS и Mac устройства.

Бэкапим

В начале нам необходимо сделать незашифрованную локальную резервную копию телефона с помощью iTunes.

Ищем базу

Далее открываем бэкап с помощью программы iBackupViewer, нам достаточно бесплатной версии. На Mac OS начиная с Mojave для корректной работы программе необходимо дать разрешение на "Полный доступ к диску"

После открытия выбираем режим просмотра файловой системы. Ищем приложение Xiaomi MiHome (com.xiaomi.mihome). Извлекаем файл названием вида _mihome.sqlite

Вытаскиваем токен

Открываем файл при помощи просмотрщика баз данных DB Browser for SQLite. Там можно посмотреть параметры всех устройств, нас интересует поле ZTOKEN, в котором хранится искомый токен.

Дальше приводим токен в необходимый нам формат. Делается это с помощью следующей функции

echo '0: your_ztoken' | xxd -r -p | openssl enc -d -aes-128-ecb -nopad -nosalt -K 00000000000000000000000000000000

Все, можно использовать полученный токен для добавления устройства в HomeBridge или иные системы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *