Mi Band 2过去的数据

时间:2018-05-05 13:36:37

标签: android python bluetooth gatt xiaomi

我正在撰写关于如何从不同健身带获取数据的论文。 目前我正在使用与我的PC的蓝牙连接对Mi Band 2进行一些研究,不幸的是BLE对我来说是一个新领域。

通过查看Gadgetbridgemiband2-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 :(得分:0)

需要分析btsnoop_hci.log

每30分钟,设备会从00000010-0000-3512-2118-0009af100700发送一个通知值0x0e。然后,您必须开始获取过去的数据。首先,您需要为UUID_CHAR_ACTIVITY_DATA启用通知描述符,即所谓的UUID_CHAR_FETCH。然后,您需要从最近一次成功获取数据的过程中获取软件包的计数。因此,您将值0x0101 + datatime + tz发送到UUID_CHAR_FETCH。如果之前发送的1st_package_datetimetz没有间隔,则设备对您的响应值为0x100101 + packages_count + 1st_package_datetimetz。现在您需要开始传输过去的数据,只需将一个字节值0x02发送到UUID_CHAR_FETCH,设备就会从UUID_CHAR_ACTIVITY_DATA发送通知。每个活动数据通知值的第一个字节都有一个队列号,其余字节最多有4个数据包。每个过去的数据包都由4个字节组成,并具有以下格式:activity_type,intensity,steps,heart_rate。设备每分钟存储一次数据。因此,通常在每个0x0e事件中,大多数情况下,您会在8个通知消息值中得到30个包,最多4个包。在收到最后一个通知后,设备将从UUID_CHAR_FETCH发送成功通知0x100201。我不知道为什么,但是需要在最后的第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