Вступление
Недавно я купил себе Mi band 7, по началу хотел купить 6-ую версию, пока не узнал, что на 7-ой обновилась операционная система и теперь она поддерживает установку приложений. Да, официально они об этом не заявили, но умельцы уже сделали множество приложений. Они ставят их как циферблаты, и это вполне обычные приложения. Но все эти приложения работают только локально на самом MiBand 7, не имея возможности взаимодействовать ни с телефоном, ни с интернетом. Я углубился в байткод приложения и документацию по Zepp OS чтобы найти способ создавать приложения, взаимодействующие с интернетом, в этой статье я опишу свой путь. В итоге у меня получилось сделать запрос в интернет с часов и даже запустить мост для отладки приложений.
Эта статья написана чисто в ознакомительных целях. Я не призываю никого к переработке кода для добавления новых функций с целью использования и распространения переделанного ПО.
Почему приложения официально не поддерживаются?
Мне интересен этот вопрос, но к сожалению я не знаю причин. Похоже что Xiaomi Band 7 сделала для xiaomi компания zepp. И им было проще не поддерживать другую операционную систему, а использовать уже имеющиеся наработки для часов zepp. Поэтому на этих часах стоит система ZeppOS. Вероятно Xiaomi решила не платить за все фишки системы и поэтому функционал часов программно ограничен.
Начало
Для начала, чтобы разобраться как работает система, я попробовал поставить пару приложений от MelianMiko. Ставил самым простым способом, через приложение для установки циферблатов, подробности можете почитать на 4PDA. Я немного поразбирался в структуре приложений и вот что я понял: приложение это bin файл, который является простым zip архивом с, как минимум, несколькими файлами: app.json(Manifest), app.js(Код инициализации и деинициализации приложения при запуске), index.js(Код страницы),icon.png. Далее я пошел на сайт официальной документации по ZeppOS, там описано как включать режим отладки через приложение ZeppApp. Но попробовав подключить часы через это приложения я получил ошибку:
Я решил на этом не останавливаться, скачал это приложение версии 7.0.1, декомпилировал через apktool в байткод и через jadx в java код:
apktool d com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk
jadx com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk -d com.huami.watch.hmwatchmanager_7.0.1-play_100802_JADX
Далее для исследование кода проще использовать результат jadx, но скомпилировать обратно получится только результат apktool, поэтому изменения придется делать в байткоде.
Для начала я убедился что это приложение поддерживает ну или когда-то поддерживало MiBand. Для этого я нашел несколько упоминаний MiBand 7 (Официально он называется Xiaomi Smart Band 7). Его кодовое название в приложении “MILI_L66”.
Далее я решил обмануть приложение(пока без его изменения) и попробовал подключить свои часы к приложению, притворившись другими часами. Для этого я отсканировал qr для сетапа на своих часах я получил такую ссылку:
https://hlth.io.mi.com/download?redir=7800&mac=CE82E4D50231&pnpNumber=103&pnpVersion=258
В ней указан мак адресс, pnpNumber, pnpVersion - это похоже какие-то идентификаторы устройства. Я пробовал их заменить, но это не помогло, поэтому я решил посмотреть, какие qr коды у других устройств zepp при сетапе. В гугл я нашел видео в привязкой Amazfit Band 7, отсканировал код, получил такую ссылку:
https://api-watch.huami.com/forwarding/watchUS?macAddress=C9EC6C59A185&pnpNumber=117&pnpVersion=259
Эта ссылка ссылается совсем на другое доменное имя. Далее я решил попробовать просто подставить в этот URL macAddress из своего qr кода и сделать с этого url qr код. И это помогло, мои часы подключились, приложение засетапило их как Amazfit Band 7.
Я обнаружил что весь функционал из приложения Xiaomi здесь есть и я могу полноценно настраивать свои часы. Но после сетапа приложения понимало что у меня не Amazfit а Mi Band и не давало возможности ставить никакие приложения и циферблаты для Amazfit. Поэтому дальше я решил переделать приложение.
Перекомпиляция приложения
Чтобы приложение дало мне возможность ставить mini apps на часы, я решил заставить его думать что у меня не Xiaomi Smart Band 7, а Amazfit Band 7. Для этого таже как и для Mi Band 7, нашел кодовое название для Amazfit Band 7 - “MiliBari”:
Далее нашел все упоминания MILI_L66 и MILI_BARI. Самым интересным показался класс HMDeviceSource:
Вы можете в нем увидеть коды соответствующие разным типам устройств - их идентификаторы.
Далее необходимо переключиться на байткод, который нам выдал apktools.
Здесь я тоже нашел байткод класса HMDeviceSource$a.smali и изменил в нем 3 строки как на скриншотах:
Теперь можно собрать его обратно, подписать, установить. Оригинальное приложение придется сначала удалить, так как подпись теперь не оригинальная.
apktool b com.huami.watch.hmwatchmanager_7.0.1-play_100802 --use-aapt2
apksigner sign --ks-key-alias alias_name --ks-pass pass:123456 --ks release-key.keystore com.huami.watch.hmwatchmanager_7.0.1-play_100802/dist/com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk
adb install com.huami.watch.hmwatchmanager_7.0.1-play_100802/dist/com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk
Теперь можно снова логиниться в приложении и подключать Mi Band как я описывал выше, изменяя qr код.
Работа перекомпилированного приложения
После этих манипуляций приложение начало отображать функционал как для amazfit band 7! Ура! На изображении сначала будет Mi Band 7, но если поменять циферблат, то оно сменится на amazfit band 7. У меня циферблат от Аmazfit встал как родной.
Также теперь появилась кнопка App Store, там можно поставить приложения из магазина для amazfit band 7. Не все заработали идеально, но большинство. Их почему-то в магазине пока только 5. Видимо пока весьма маленькое сообщество разработчиков)
Далее я уже пытался поставить свое приложение, с сервисной частью, сначала я пошел по сложному пути, подменяя файлы приложения. Позже понял, что можно воспользоваться мостом в режиме разработчика на приложении, что гораздо проще и позволяет выводить логи. Вероятно разработчики могут прекратить поддерживать отладку через мост, когда эта версия приложения устареет. Но в этой статье я опишу только путь попроще, через мост. Если вам будет интересно, могу потом описать второй путь.
Создание проекта
На 4PDA я нашел проекты пользователя MelianMiko. Он сделал и симулятор mi band, и множество приложений, и утилиту для сборки проектов - zmake. Можете ими воспользоваться для создания простых приложений, но как я понял zmake создает проекты только без сервисной части, выполняемой на телефоне. Еще в отличии от официального сборщика он, не сжимает код в bin файл, а оставляет в формате js(Тут может ошибаюсь, поправьте если не так). Симулятор к сожалению не работает под Linux и MacOS, поэтому я им не пользовался, вместо него использовал официальный симулятор Amazfit band 7.
Для создания проекта я использовал официальную утилиту zeus для ZeppOS. Новый проект можно создать командой zeus create project-name. Необходимо выбрать “1.0 API”, апи второй версии MiBand 7 не поддерживает.
Далее опишу содержимое собранного приложения, это не очень нужная информация, просто для общего ознакомления.
Когда проект будет готов, его можно собрать командой zeus build. В папке dist появится архив в формате zab, его можно открыть как простой zip архив. В нем манифест с описанием приложения и архив common.zpk, который тоже открывается как zip архив. В нем уже можно увидите основные составляющие приложения:
Файл device.zip содержит код выполняемый на часах, ему можно сменить формат на bin и поставить даже через приложение для установки циферблатов.
Файл app-side.zip сожержит код выполняемый на стороне телефона.
Вроде еще может быть файл, описывающий настройку mini app с помощью приложения телефона.
Отличный набор примеров приложений, в том числе с сервисной частью, есть на github. Я, как основу, взял пример “fetch-api”.
Настройка моста
Тут нет ничего особенного, все из документации ZeppOS. Необходимо залогиниться в один аккаунт в приложении на телефоне и в приложении симуляторе. Включить режим разработчика в приложении и потом выбрать часы в списке устройств, открыть внизу настройки разработчика и в выпадающем списка нажать кнопку включения моста. После подключиться к мосту надо и в приложении симуляторе, нажав кнопку Bridge.
Теперь можно пользоваться консольной утилитой zeus для отладки проекта:
zeus bridge
сonnect
install
Запрос в интернет по кнопке на часах.
Как я уже писал выше, я взял за основу пример проекта с официального гитхаб аккаунта zepp os, “fetch-api”. Изменив код в app-side, я сделал запрос с телефона на домен ident.me, чтобы получить мой текущий внешний ip, ради примера.
Вывод
В итоге я получил небольшое приложение на часах, которое может когда угодно выводить мне мой внешний ip. Это конечно не та цель, к которой я стремился. Моей целью было продемонстрировать, то что на самом деле у часов Mi Band 7 есть скрытый, программно ограниченный функционал. Эти часы могут не просто менять циферблаты, но и работать с приложениями. И даже отправлять данные через телефон в интернет и получать ответ. Такие приложения можно использовать например для управления умным домом) Вероятно в будущих версиях часов об этом официально заявят, но пока такого нет. Даже на Band 7 Pro официально не стоит zepp os.
P.S. Это была моя первая статья. Надеюсь вам было интересно, пишите комментарии, буду рад любой критике!
Комментарии (17)
DeNcHiK3713
15.11.2022 09:51+4Спасибо за статью! У меня изначально была идея сделать приложение, которое создаёт уведомление и с которым можно взаимодействовать с помощью быстрых ответов. Теперь появился куда больший простор для фантазии. Можете пожалуйста опубликовать apk и bin приложения для получения ip адреса?
Vadim170 Автор
15.11.2022 11:41+8Проект приложения на часы залил на GitHub https://github.com/Vadim170/zepp-fetch-ident-me/tree/main там в папке dist скомпилированное приложение. И вот ссылка на перекомпилированный apk https://disk.yandex.ru/d/kwOfa0LPm2N3CQ
Kanut
15.11.2022 10:29+6Небольшой оффтоп: а как Mi Band 7 держит батарейку? А то я долгое время был фанатом Mi Band(с 1 по 5), но пятёрка очень плохо держала батарейку и шестой я себе уже не стал покупать. Но теперь на фоне возможности установки приложений подумываю опять вернуться :)
Vadim170 Автор
15.11.2022 10:51+3Я пока не очень долго ими пользуюсь, как я понял от 2-3 дней до примерно двух недель. Зависит от того какие функции включены. Да, прошлые модели, вроде, дольше держали
DYPA
15.11.2022 12:10+3~ 3 дня при использовании always on display (AOD) и всех "жрущих батарейку" опций мониторинга, возможно без AOD и мониторинга можно добиться и заявленных 14 дней, но тогда уж лучше купить кварцевые часы которые 2 года не садятся.
AlexeyUral
16.11.2022 09:22+2Жена пересела с Band 3(не пережили турецкий бассейн летом), не жалуется, так же плюс минус.
eji
16.11.2022 09:22+2Около недели. Включён вывод уведомлений о звонках, почте, смс, от мессенджеров, браузеров. Шагомер, измерение пульса с настройками по умолчанию, включение при повороте запястья. Яркость экрана - около трети шкалы.
Stazz
16.11.2022 13:39+16ка держит примерно пару недель. 4ка конечно заметно лучше держала, но у 6ки и экран в два раза больше.
ahimenid
15.11.2022 12:59+2Доброго. в процессе не попадалось библиотек, или иных вариантов взаимодействия с часами\браслетом ? например к той же малинке прицепить и управлять.
Vadim170 Автор
15.11.2022 17:04+2Добрый вечер, нет, не попадалось. Но я и не искал особо) В теории, думаю, у них должно быть реализовано взаимодействие через какую-то интегрированную либу, но я не пытался понять так ли это. Может еще на гитхабе кто-то выкладывал опенсорс приложения.. вроде есть сильно ограниченные по функционалу, неофициальные приложухи в плей маркете.
Vadim170 Автор
15.11.2022 17:07+2Вообще можно на малинке прослушивать какой-то порт, часы законектить к телефону, cделать приложуху как в статье, и тогда часы смогут кидать на малинку запросы по fetch api через телефон. А так чтобы напрямую, без особых заморочек - хз, только если андроид на малинку поставить)
michael108
15.11.2022 14:43+2А можно ли на этой версии сделать постоянный мониторинг частоты пульса и передавать данные на свой смартфон? В сети пишут, что есть функция суточного мониторинга пульса и уровня кислорода. Мне бы хотелось сохранять соответствующие временные ряды для дальнейшей обработки.
Vadim170 Автор
15.11.2022 17:10+1Да, можно или подписаться на события замеров или просто раз в сутки скидывать всю историю замеров, вот тут есть описание апи https://docs.zepp.com/docs/1.0/reference/device-app-api/hmSensor/sensorId/HEART/
Единственно у них фиговоею, весьма, апи для взаимодействия с другими приложениями на телефоне. Точнее его нет. Можно использовать для этого FetchApi, но тогда ваше приложение должно будет постоянно слушать порт. Я не нашел в документации способа создавать системные Intent-ы(
BigDflz
15.11.2022 18:25+2мониторинг пульса лучше производить из показаний измерений фотоплетизмограммы , точнее из множества измерений из которых и строится Фотоплетизмограмма. будет намного больше информации для размышления о здоровье сосудов и сердца.
mishailovic
15.11.2022 17:56+5Жду продолжения статьи, являюсь продвинутым потрошителем техники Xiaomi, но об этой фиче но разу не слышал. Было бы очень интересно
JagaJaga
Старый добрых хабр. Огромное спасибо за статью, было очень интересно читать!
Vadim170 Автор
Очень рад что вам понравилось)