Аутентификация MiBand3 с помощью Dart Language и библиотеки Flutter_Blue

Две недели назад я нахожусь в эпической саге, чтобы разгадать микшер сбоя связи с подключением miband bluetooth. Я новичок в флаттере, но видимо это что-то новое в сообществе, я не нашел конкретного материала по языку.

Перейдем к проблеме!

Задача: Считать и записать данные на умном браслете xiaomi (MiBand3) через гибридное приложение (В случае флаттера).

Ошибка:

Браслет отключается через 30 секунд, при отправке данные не принимаются.

Файл Pubspec.yaml:

environment:
  sdk: "> = 2.7.0 <3.0.0"
dependencies:
  flutter:
    sdk: flutter
  flutter_blue: ^ 0.7.2
  typed_data: ^ 1.2.0
  encrypt: ^ 4.0.3
  cupertino_icons: ^ 0.1.3
  byte_data_wrapper:
    git: git: //github.com/Taym95/byte_data_wrapper.git

dev_dependencies:
  flutter_test:
    sdk: flutter

Причина возникшей ошибки:

Согласно некоторым материалам на других языках, которые я нашел в Интернете, мне нужно выполнить процесс аутентификации с помощью браслета. Эта ссылка содержит наиболее полное объяснение, которое я нашел https://leojrfs.github.io/writing/miband2-part1-auth/

ВОПРОС:

Как мне реализовать это во флаттере? Этот процесс отправки на определенный UUID, затем получение байтов и чтение только начала, затем получение только последних 16 байтов и шифрование, отправка снова ... Это очень запутано в моей голове! И ничем не могло быть иначе для новичка во флаттере. Хороший! Мне удалось отобразить весь процесс аутентификации и описать краткое изложение ниже. Я хотел бы, чтобы вы помогли мне понять, как это реализовать и отправить с помощью flutter_blue?

Шаги по аутентификации:

  1. Создайте ключ размером 16 байт. Пример: {0x30, 0x31, ..., 0x46, 0x45}
  2. Включите уведомления на miband, отправив TRUE сервису UUID 0x0009
  3. Отправьте {0x01, 0x08, KEY} на UUID 0x0009.
  4. Убедитесь, что первые три байта возврата были {0x10, 0x01, 0x01}, что означает успешное получение.
  5. Отправьте еще один запрос сейчас с дополнительным битом в первом элементе и без ключа {0x02, 0x08}
  6. Проверьте возврат еще раз, если значение {0x10, 0x02, 0x01} означает успех.
  7. Возьмите последние 16 байтов ответа с шага 6 и зашифруйте его с помощью AES / ECB / NoPadding, используя ключ, созданный на первом шаге. Сохраните в переменной RESPONSE_KEY.
  8. Отправьте еще один запрос с зашифрованным ответом, созданным выше. Пример: {0x03, 0x08, RESPONSE_KEY}, аналогично шагу 3.
  9. Проверьте возврат, если он равен {0x10, 0x03, 0x01}, данные, вероятно, уже были отправлены.

person Clayton Sandes Monteiro    schedule 02.10.2020    source источник
comment
Кажется, вы красиво разбили это на 9 шагов. Сможете ли вы написать код для любого из этих шагов? Шаг 1 кажется простым случаем создания списка. Шаг 2 должен быть похож на пример библиотек. Шаг 3 - это wirte. Если бы это было полезно, вы могли бы более конкретно указать, какой фрагмент кода оказывается для вас проблематичным.   -  person ukBaz    schedule 03.10.2020