使用bluez / bluetoothctl / gatttool

时间:2015-12-14 15:49:54

标签: bluetooth bluetooth-lowenergy bluez

我想做什么:

我想将我的Raspberry Pi 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,看看相应的应用程序如何与我的规模进行通信。

  1. 写0200 - > 0x1f(使能指示0x1d)
  2. 读取0x21 - > 0x21(值:37fb)
  3. 写0200 - > 0x1c(使能指示0x1a)
  4. 写0200 - > 0x26(使能指示0x24)
  5. 写02a31e2c0b - > 0x23(我在这里不完全理解这一点,但是我知道你是否在02之后取字节(a3 1e 2c 0b - > 0b 2c 1e a3 - >这是当前的Unix时间戳但是今年? 1975年?)
  6. 在第4步之后,有第一个指示(句柄0x25),它给我存储的个人数据(我的身高,性别,年龄等)

    在第5步之后,有一些指示(句柄0x1b和句柄0x1e),它们应该传输我的测量数据。 (此时没有分析十六进制值)

    我做了什么:

    我在我的raspi (内核4.1.13)上安装了 bluez.5.32 ,然后用gatttool执行了步骤1 - 5,一切正常,直到第5步。我不知道#39; t从句柄0x1b和0x1e获取任何指示消息)在步骤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-timestamp做事情 - 1975年......没有成功)

    经过数十亿小时后,我在我的raspi上得到bluetoothctl工作(有一个dbus问题),我尝试使用bluetoothctl。我启用了所有指示并将0000000000写入hnd = 0x23。切换到处理0x1a,它工作!我收到许多十六进制值,这些值应该是我搜索的数据。

    那么问题是什么? 我想为我的目的使用gatttool或至少我想了解,为什么它没有用gatttool

    当我使用bluetoothctl时,我只能选择并观看一个属性,并且在收到数据后,我的比例自动断开连接到我的覆盆子。因此,当我选择特征0x1a时,我无法看到特征0x01d的指示消息,反之亦然。

    当我使用gatttool或我使用bluetoothctl时,我的Pi和我的Scale之间是否有另一个连接?或者他们如何与我的规模沟通方式有所不同?

2 个答案:

答案 0 :(得分:4)

在测量了重量等后,刻度似乎可以连接很短的时间我在bash脚本中使用gatttool的非交互模式,如下所示:

gatttool -t random -b F1:37:57:XX:XX:XX --char-write --handle 0x001f -n 0200
gatttool -t random -b F1:37:57:XX:XX:XX --char-read --handle 0x0021
gatttool -t random -b F1:37:57:XX:XX:XX --char-write --handle 0x001c -n 0200
gatttool -t random -b F1:37:57:XX:XX:XX --char-write --handle 0x0026 -n 0200
gatttool -t random -b F1:37:57:XX:XX:XX --char-write-req --handle 0x0023 -n 0000000000 --listen

信息取自Pratik Sinha here。 为了显示响应,显然需要给出 - 之后接收大约25行数据(交替1b和1e响应)。 感谢您的信息,节省了我几天的工作!

新年快乐!

编辑:

使用Python和pygatt module归结为:

import pygatt.backends
from binascii import hexlify

def printIndication(handle, value):
    print('Indication received {} : {}'.format(hex(handle), hexlify(str(value))))

adapter = pygatt.backends.GATTToolBackend()
adapter.start()
# wait for someone to step on the scale
while True:  
    try:
        device = adapter.connect('f1:37:57:xx:xx:xx', 5, 'random')
        break
    except pygatt.exceptions.NotConnectedError:
        print('Waiting...')
device.subscribe('00008a22-0000-1000-8000-00805f9b34fb', callback = printIndication, indication = True)
device.subscribe('00008a21-0000-1000-8000-00805f9b34fb', callback = printIndication, indication = True)
device.subscribe('00008a82-0000-1000-8000-00805f9b34fb', callback = printIndication, indication = True)
try:
    device.char_write_handle(0x23, [02,00,00,00,00], True)
except pygatt.exceptions.NotificationTimeout:
    pass
device.disconnect()
adapter.stop()

注意:

  • 根据我的经验,阅读句柄0x21没有任何意义
  • 使用02编写句柄0x23,然后使用unix时间戳同步缩放的RTC
  • 使用多字节修改的pygatt(pull 34)可以在Indication中接收多个字节
  • 虽然写入0x23不会产生任何通知,但是需要等待通知能够接收0x1b和0x1e指示。收到最后一个指示后,将收到NotificationTimeout异常。

答案 1 :(得分:3)

好吧..我通过我的自我解决了这个...我需要做的就是改变,char-write-cmd“to ,, char-write-req”..在我的Android-Hci的日志文件中-Snoop它始终是一个写请求。不知道为什么我一直都不认识它......

如果有人遇到bluez / bluetoothd / bluetoothctl&像我一样的dbus (要在bluetoothctl中使用命令“list-attributes”,“select”“write”,你必须在实验模式中执行bluetoothd,如“bluetoothd -n -E”,但每次我这样做时都会收到一些错误消息,如“ D-Bus:已使用的名称“或类似”总线设置失败:由于安全性,不允许连接拥有该服务......“(不记得确切的错误消息))

我做了什么:

  • 使用./configure安装bluez [...] - 启用实验(阅读自述文件)

  • sudo nano /etc/dbus-1/system.d/bluetooth.conf

    - >复制以> policy user =“root”>开头的整个块,并将其粘贴到此块下方。然后我在两个块中的一个中将“root”改为“pi”

如果有人想知道此比例如何提供测量结果,请查看以下链接: A little Game/Quiz: Do you see my values? (Interpreting Hex-Values)