Mi Band 2 последние данные - PullRequest
0 голосов
/ 05 мая 2018

Я пишу свою диссертацию о том, как получить данные из разных фитнес-групп. В настоящее время я провожу некоторые исследования Mi Band 2, используя соединение Bluetooth с моим ПК, к сожалению, BLE - это новое поле для меня.

Глядя на такие проекты, как Gadgetbridge или miband2-python-test Я пытаюсь понять протокол. Я понимаю, как работает аутентификация и как извлекать данные, такие как информация о батарее или времени. Тем не менее, я не понимаю протокол для получения прошлых данных, как мелкие шаги от двух дней назад до настоящего времени.

Я был бы рад, если бы кто-нибудь мог помочь мне, дав совет или объяснив шаги протокола. Заранее спасибо!

Это мой код, насколько я понял протокол:

UUID_CHAR_ACTIVITY_DATA = "00000005-0000-3512-2118-0009af100700"
UUID_CHAR_FETCH = "00000004-0000-3512-2118-0009af100700"
CCCD_UUID = 0x2902

class MiBand2(Peripheral):
    [...]
    self.char_activity_data =   self.getCharacteristics(uuid=UUID_CHAR_ACTIVITY_DATA)[0]
    self.char_fetch = self.getCharacteristics(uuid=UUID_CHAR_FETCH)[0]
    self.cccd_fetch = self.char_fetch.getDescriptors(forUUID=CCCD_UUID)[0]
    def fetch_activity_data(self):
        # \x01\x01  key?
        # \xe2\x07  2018 year
        # \x05      month
        # \x03      year
        # \x11      hour
        # \x2f      minute
        # \x00\x08 timezone
        value = b'\x01\x01\xe2\x07\x05\x03\x11\x2f\x00\x08'     
        self.cccd_fetch.write(b'\x01\x00', False)
        self.char_fetch.write(value_from_wireshark, False)
        for i in range(30):
            self.waitForNotifications(1.0)


class AuthenticationDelegate(DefaultDelegate):
    [...]
    def handleNotification(self, hnd, data):
        [...]
        if hnd == self.device.char_fetch.getHandle():
            if data[:3] == b'\x10\x01\x01':
                self.device.char_activity_data.write(b'\x01\x00', False)
                # After \x02 I receive \x10\x02\x01 instead of fitness data as I thought
                self.device.char_fetch.write(b'\x02', False)

1 Ответ

0 голосов
/ 17 октября 2018

Нужно проанализировать btsnoop_hci.log

Каждые 30 минут устройство отправляет уведомление со значением 0x0e от 00000010-0000-3512-2118-0009af100700. Тогда вы должны начать принимать ваши прошлые данные. Во-первых, вам нужно включить дескрипторы уведомлений для UUID_CHAR_ACTIVITY_DATA и так называемого UUID_CHAR_FETCH. Затем вам нужно получить количество пакетов из вашего последнего успешного получения данных. Таким образом, вы отправляете значение 0x0101 + datatime + tz в UUID_CHAR_FETCH. Ответ устройства со значением 0x100101 + packages_count + 1st_package_datetimetz, если нет пробелов, то 1st_package_datetimetz вы отправили ранее. Теперь вам нужно начать передачу прошлых данных, просто отправьте одно байтовое значение 0x02 в UUID_CHAR_FETCH, и устройство отправит уведомления от UUID_CHAR_ACTIVITY_DATA. Каждое значение уведомления о данных активности имеет номер очереди в первом байте и максимум 4 пакета данных в оставшихся байтах. Каждый отдельный пакет прошлых данных состоит из 4 байтов и имеет такой формат: активность_тип, интенсивность, шаги, сердечная скорость. Устройство хранит данные за каждую минуту. Как правило, на каждом событии 0x0e большую часть времени вы получаете 30 пакетов с 8 значениями уведомлений по 4 пакетам. После получения последнего уведомления устройство отправит уведомление об успехе 0x100201 из UUID_CHAR_FETCH. Я не знаю почему, но это нужно сделать на последнем 3-м шаге: отправить один байт 0x03 в UUID_CHAR_FETCH, а затем получить ответ об успешном завершении 0x100301. Это фактически все, что вам нужно, но Mi Fit дважды проверяет наличие новых пакетов данных, затем получает нулевой счет и затем выполняет третий 3-й шаг. Теперь необходимо отключить дескрипторы уведомлений со значением 0x0000. После всего этого ваш успех синхронизации данных будет больше для количества прошедших пакетов данных, которые вы получили * 60 секунд.

Если после команды 0x0101 у вас есть количество пакетов ответов = 0, устройство, очевидно, ничего не отправит вам после команды 0x02, а затем отправит сообщение 0x100201 :))

Я не знаю, что за 0x0102 + datatimetz. В моих btsnoop_hci.logs ответных пакетах count = 0 всегда.

Я думаю, что нет необходимости синхронизировать по событию 0x0e.

https://gist.github.com/Roxxor91/0d3ff17153270e447d01e7afd0c54e0f

...