我的需求:
我想将我的树莓派2连接到一个蓝牙智能体重秤(Medisana BS440),并接收我的数据。
我所知道的:
只有一个有趣的主服务和5个特征:
- handle: 0x001a
- properties: 0x20 (Indication), char value handle: 0x1b uuid:00008a21-0000-1000-8000-00805f9b34fb
- handle: 0x001d
- properties: 0x20 (Indication), char value handle: 0x1e uuid:00008a22-0000-1000-8000-00805f9b34fb
- handle: 0x0020
- properties: 0x02 (Read-Only), char value handle: 0x21 uuid:00008a20-00..
- handle: 0x0022
- properties: 0x08 (Write-Only), char value handle: 0x23 uuid:00008a81-00..
- handle: 0x0024
- properties: 0x20 (Indication), char value handle: 0x25 uuid:00008a82-00..
我使用我的Android手机的HCI-Snoop-Developer-Funktion,以了解相应应用程序如何与我的体重秤通信。
- 写入0200 -> 0x1f(启用Indication 0x1d)
- 读取0x21 -> 0x21(值:37fb)
- 写入0200 -> 0x1c(启用Indication 0x1a)
- 写入0200 -> 0x26(启用Indication 0x24)
- 写入02a31e2c0b -> 0x23(我不完全理解这里,但我知道如果你取02后面的字节(a3 1e 2c 0b -> 0b 2c 1e a3)这是当前Unix时间戳,但是年份是1975年?)
第4步之后,将出现第一个Indication(句柄0x25),该Indication会向我提供存储的个人数据(我的身高、性别、年龄等) 。
第5步之后,会有一些Indications(句柄0x1b和句柄0x1e),它们应该传输我的测量数据。 (此时没有分析十六进制值)
我的做法:
我在我的树莓派上安装了bluez.5.32 (内核4.1.13),并使用gatttool完成了步骤1-5,在步骤5之后,我没有收到来自句柄0x1b和0x1e的Indication消息)在第5步之后什么都不发生。
gatttool -t random -b DE:70:4A:XX:XX:XX -I
char-write-cmd 0x1f 0200
char-read-hnd 0x21 (37fb)
char-write-cmd 0x1c 0200
char-write-cmd 0x26 0200
char-write-cmd 0x23 0000000000
我甚至尝试了使用Unix时间戳来表示1975年,但并没有成功。
经过数十亿小时的努力,我终于在我的树莓派上让bluetoothctl工作了(出现了一个dbus问题),然后我又尝试了同样的方法用bluetoothctl。我启用了所有的Indications,并向hnd=0x23写入0000000000。切换到handle 0x1a,它起作用了!我收到了许多十六进制值,应该就是我正在寻找的数据。
那么问题来了: 我想要使用gatttool来完成我的目的,或者至少我想要理解为什么gatttool不能正常工作。
当我使用bluetoothctl时,我只能选择和查看一个属性,接收数据后,我的秤自动与我的树莓派断开连接。因此,当我选择特征0x1a时,我无法看到特征0x01d的指示消息,反之亦然。
当我使用gatttool或bluetoothctl时,我的Pi和Scale之间是否有其他连接?或者它们与我的秤通信的方式有所不同吗?