我想做什么:
我想将我的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,看看相应的应用程序如何与我的规模进行通信。
在第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之间是否有另一个连接?或者他们如何与我的规模沟通方式有所不同?
答案 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()
注意:
答案 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)