微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BLE:“句柄”从何而来?

如何解决BLE:“句柄”从何而来?

我正在尝试学习如何在 Pi4 上使用 BLE。

我已经安装了 hcitool 和 gatttool,并且已经知道如何使用它们。我还在 Mac 上使用 LightBlue 设置了一个虚拟设备。

pi@raspsky:~ $  sudo hcitool -i hci0 lescan
LE Scan ...
98:9E:63:39:8B:ED Blank
98:9E:63:39:8B:ED (unkNown)

那个“空白”是虚拟设备。

pi@raspsky:~ $ gatttool -b 98:9E:63:39:8B:ED -I
[98:9E:63:39:8B:ED][LE]> connect
Attempting to connect to 98:9E:63:39:8B:ED
Connection successful
[98:9E:63:39:8B:ED][LE]> primary
attr handle: 0x0001,end grp handle: 0x0005 uuid: 00001800-0000-1000-8000-00805f9b34fb
<snip>
attr handle: 0x0028,end grp handle: 0x002b uuid: 00001111-0000-1000-8000-00805f9b34fb
[98:9E:63:39:8B:ED][LE]> char-desc
handle: 0x0001,uuid: 00002800-0000-1000-8000-00805f9b34fb
<snip>
handle: 0x002b,uuid: 00002901-0000-1000-8000-00805f9b34fb

现在,我希望能够从虚拟设备中读取数据,但我不知道要使用哪个“句柄”。我通过反复试验发现我需要使用 002b:

[98:9E:63:39:8B:ED][LE]> char-read-hnd 002b
Characteristic value/descriptor: 53 6f 6d 65 74 68 69 6e 67

那个十六进制结果是 ascii 字符串“Something”,这是我放在虚拟设备中的内容

但是,那个句柄是从哪里来的?看起来我应该能够弄清楚而不必使用反复试验:

Screenshot of LightBlue Virtual Device

更新:

在这个例子Using bash and gatttool to get readings from Xiaomi Mijia LYWSD03MMC Temperature Humidity sensor中,作者展示了如何使用hcitool获取BLE设备的mac地址。文章接着举个例子:

bt=$(timeout 15 gatttool -b A4:C1:38:8C:77:CA --char-write-req --handle='0x0038' --value="0100" --listen)

但作者从未解释过句柄 (handle='0x0038') 的来源。我知道如何使用 gatttool 获取句柄列表,但我能弄清楚每个句柄带有哪些数据的唯一方法是尝试每个句柄,直到找到我想要的那个。一定有更简单的方法

解决方法

自从你更新了你的问题,我有另一个答案给你。但由于您的主题没有面临任何编程问题,您最好在另一个 StackExchange 上再问一次。

我能弄清楚每个句柄有什么数据的唯一方法是尝试每个句柄直到找到我想要的那个。一定有更简单的方法。

我想我得让你失望了。

虽然有一些 predefined GATT profiles by Bluetooth SIG,但大多数专有实现不会公开任何有关其特征的有意义的信息,而是公开强制性的 UUID。

如果幸运的话,您可能能够找到特征用户描述(蓝牙核心规范第 3 卷第 G 部分 3.3.3.2)或从 特征演示格式中推断出一些信息(Bluetooth Core Spec Vol. 3 Part G 3.3.3.5)特征描述符;但由于这些是可选的,我怀疑专有实现是否会提供这些。

因此,对于专有实现,您必须对该信息进行逆向工程或尝试在线查找(通常其他人已经对常见设备进行了逆向工程)。

,

hcitool 和 gatttool 在 2017 年是 deprecated by the BlueZ project。如果您正在学习使用它们的教程,则它可能已经过时。当前用于通用扫描和探索的 BlueZ 工具是 bluetoothctl

对于 BLE,UUID 是识别您感兴趣的服务/特征/描述符的关键。

16-bit UUID Numbers Document 列出了采用的 UUID。 SIG 采用的属性类型 (UUID) 共享一个特殊的 128 位基本 UUID:0000xxxx-0000-1000-8000-00805F9B34FB,但只有 16 位。该文档列出了进入该基数的 16 位值。

与使用 LightBlue 的虚拟设备一样,可以创建 custom UUIDs。这些需要在为 SIG 采用的值保留的 128 位基数之外。

因为 SO 是关于软件开发的,所以如果您想用代码来做这件事,我会为您指出 BlueZ API documentation。 BlueZ 源代码树中还有 examples

,

您正在寻找的东西通常是 GATT/ATT 本身。

基本上你查询一个实现 GATT 服务器的设备

与蓝牙® 相关的任何内容的最佳 (res) 来源和参考是恕我直言,您的设备支持和您正在开发的版本中的 Bluetooth Core Specification

属性协议(ATT)

蓝牙核心规范 5.2 卷。 3 F 部分属性协议 (ATT) 的描述如下:

本部分定义了属性协议;用于在对等设备上发现、读取和写入属性的协议

ATT 是某种“低级”,因为它描述了实际的协议本身及其消息/协议数据单元 (PDU),但绝对值得一读(外围),特别是章节 3.1 简介3.2 基本概念

通用属性配置文件 (GATT)

蓝牙核心规范 5.2 卷。 3 G 部分通用属性配置文件 (GATT) 的描述如下:

本部分定义了通用属性配置文件,该配置文件描述了使用属性协议来发现服务以及在对等设备上读取和写入特征值的服务框架。

您可以将 GATT 视为用于发出 ATT 查询和命令的高级 API。

您绝对应该阅读完整的章节2.6 GATT Profile Hierarchy,然后转到4 GATT 功能要求,尤其是章节4.4 主要服务发现、4.6 特征发现和 *4.7 特征描述符发现 - 关于您的问题

但是,那个句柄是从哪里来的?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。