低功耗蓝牙:在 linux 中监听通知/指示

Posted

技术标签:

【中文标题】低功耗蓝牙:在 linux 中监听通知/指示【英文标题】:Bluetooth Low Energy: listening for notifications/indications in linux 【发布时间】:2013-03-17 10:12:24 【问题描述】:

我正在尝试通过 Linux 机器与 BLE 模块通信(该模块正在运行心率配置文件)。到目前为止,除了收听通知和指示(例如收听心率测量通知)之外,我已经能够做所有我需要的事情。我正在使用内核版本 3.5 和 bluez-5.3。

目前使用的成功命令:

hcitool lescan
hcitool lecc
gatttool -b <Mac Address> --primary
gatttool -b <MAC Address> --characteristics
gatttool -b <MAC Address> --char-read
gatttool -b <MAC Address> --char-desc
gatttool -b <MAC Address> --interactive

失败的命令:

gatttool -b <MAC Address> --listen

非常感谢任何帮助。

【问题讨论】:

您是否设置了 CCC 值来获取通知/指示? 我找不到任何关于 CCC 值的信息。我唯一能控制的是psm和mtu。那么如何设置 CCC 值呢? 【参考方案1】:

试试这个...

像以前一样运行gatttool -b &lt;MAC Address&gt; --interactive。你会得到一个提示,然后你输入connect。您应该会在提示中看到 CON,表明您已连接到设备。然后输入char-read-uuid 2902。您应该获得设备上所有 CCC(客户端特征配置)属性的列表。 You can try setting them all to 0100 to get notifications, 0200 for indications, 0300 for both, or 0000 for everything off. 键入 help 以查看所有命令及其参数。

编辑:

--listen 参数的使用要求您将它与其他命令结合使用以打开通知和/或指示。下面是一个适用于 Bluez 4.101 的示例:

gatttool -b <MAC Address> --char-write-req --handle=0x0031 --value=0100 --listen

显然,您需要将句柄更改为要为其打开通知的 CCC 的句柄。但是,我仍然觉得只使用交互模式更容易。

【讨论】:

顺便说一句,标准规定应该在连接之间保留 CCC 值,但我使用了一些蓝牙加密狗,最终会重置连接之间的所有内容。 是的,目前一切都在为我在连接之间重置。但是,这对我来说不是问题,因为我总是可以重置这些值来获取通知。谢谢。 @TimTisdall,谢谢。我正在尝试与接近遥控钥匙类似的东西。我已经能够编写 CCC 并阅读它以确认,但我仍然没有看到使用 gatttool -b -t random -I --listen 的通知。你有什么其他的建议?还是我误解了它应该如何工作? @AgDude 某些设备需要您设置一些变量才能获得通知工作。例如,您可能必须在 CCC 中打开通知,然后打开您想要“收听”的特定传感器。我不确定你的工作原理,但也许你必须设置接近警报级别? @AgDude,对我来说,我必须设置 CCC 值并同时收听。我使用的确切命令是 gatttool -b --char-write-req --handle=0xXXXX --value=XXXX --listen【参考方案2】:

看起来旧版本的 Bluez(hcitool 和 gatttool)不允许您写入低功耗蓝牙设备。我最终安装了一个较新的版本(撰写本文时为 5.17)以启用通知等。

要获取所有句柄的列表,您可以运行以下命令:

char-desc

然后您可以从句柄中读取:

char-read-hnd 0x000e

(上面的手柄是我的nrf51822电池电量)

句柄是您从char-desc. 获得的列表中的一个

就像上面 Tim 说的,你可以写通知相关的句柄来获取指示或通知。 (在我的情况下,我的设备只有通知)

char-write-req 0x000f 0100

(上面的句柄是我的nrf51822电池电量通知)

在我的情况下,电池通知不应该发送任何内容,直到电池电量发生变化。

我写了一篇很长的博客文章,介绍如何使用 Bluez 进行设置。你可以在这里找到它:Get Started with Bluetooth Low Energy随时查看!

【讨论】:

旧版本适用于写入 BLE 设备。但是,格式有点挑剔/错误。有时它会排除“0x01”,但有时它只接受“01”。【参考方案3】:

在 Mio Alpha 上读取心率的最终答案:

gatttool -b xx:xx:xx:xx:xx:xx -t random --char-write-req -a 0x0025 -n 0100 --listen

Characteristic value was written successfully
Notification handle = 0x0024 value: 10 4b 33 03 
Notification handle = 0x0024 value: 10 4b 33 03 
Notification handle = 0x0024 value: 10 4b 33 03 
Notification handle = 0x0024 value: 10 4a 3e 03 
Notification handle = 0x0024 value: 10 4c 28 03 28 03 
Notification handle = 0x0024 value: 10 4c 28 03 
Notification handle = 0x0024 value: 10 4b 33 03 
Notification handle = 0x0024 value: 10 4a 3e 03 3e 03

【讨论】:

【参考方案4】:

要保留 CCC 值,您需要将两个设备配对。配对后,您无需再次设置 CCC。下次重新连接时,它会找到设置,该设置将保存在密钥卡的c FLASH中。通过 SMP 配对后尝试配置。

【讨论】:

你是怎么做到的? @Tim Tisdall 看来这可以通过提高连接的安全级别来实现。我尝试了以下行:#gatttool -l high -b 00:11:22:33:44:55 --primary,然后弹出一个通知窗口,要求我接受配对请求。

以上是关于低功耗蓝牙:在 linux 中监听通知/指示的主要内容,如果未能解决你的问题,请参考以下文章

低功耗蓝牙通知特性

低功耗蓝牙通知间隔

获得蓝牙低功耗 (BLE) 设备通知的步骤是啥?

Qt低功耗蓝牙系列四(搭建低功耗服务端代码)

Qt低功耗蓝牙系列四(搭建低功耗服务端代码)

Qt低功耗蓝牙系列四(搭建低功耗服务端代码)