在没有发布 GATT 配置文件的情况下解释来自 BLE 设备的数据

Posted

技术标签:

【中文标题】在没有发布 GATT 配置文件的情况下解释来自 BLE 设备的数据【英文标题】:Interpretting data from a BLE device without a published GATT profile 【发布时间】:2014-06-02 08:42:18 【问题描述】:

作为第 3 方,是否有可行的方法来正确解释来自未发布 GATT 配置文件规范的蓝牙低功耗设备的数据?

BLE 设备是一种支持体重、BMI、体脂和水合水平的体重秤。我的理解是,身体秤没有采用 GATT 配置文件,例如血压设备或心率监测器 (https://developer.bluetooth.org/gatt/profiles/Pages/ProfilesHome.aspx)。

使用以下工具:

带有各种 BLE 实用程序(Ti BLE Multitool、LightBlue 和 BLE Utility)的 iPod (ios 6.1.3) 带有 nRF 主控制面板的 android (4.3) 平板电脑(Dell Venue 8 3830),以及自定义 Xamarin 开发的解决方案

我可以扫描、定位、连接和读取电子秤上可用的 GATT 服务。以上所有工具都为我提供了相同的服务信息。规模上发现了 5 项服务:

通用访问 (0x1800) 通用属性 (0x1801) 设备信息 (0x180A) 电池服务 (0x180F) 具有自定义 128 位 UUID 的未知服务

上述所有工具都可以读取已知服务,例如检索电池信息或设备名称。我的假设是具有自定义 UUID 的未知服务是提供比例数据的服务。

此服务有 5 个带有自定义 UUID 的未知特征:

特征 1 是读/写 特征 2 已读取 特征 3 是读/写 特征 4 是通知 特征 5 已读取

使用上面指定的工具从特征 1、2 和 3 中读取,每个都返回自己的值,但该值永远不会改变。例如,读取特征 1 始终返回 20 个八位字节 0x01-0x05-0x06-0x07-0x08-和 15 个 0x00 八位字节的值。特征 1 的后续读取始终返回该值。特征 2 读取始终返回 20 个八位字节 0x02 和 19 个 0x00 八位字节的值。以此类推。

读取特征 5 似乎没有返回值,或者在 Android 上更常见的是发出配对请求。没有常见的配对码(如 0000 或 1234 等)是有效的。

特征 4 似乎是实际传输秤数据的内容。使用上面的工具,我可以启用通知并且应用程序检索 13 个八位字节。例如:

FF-16-09-00-03-04-01-00-83-6F-F4-18-0F FF-16-09-00-03-04-01-00-3E-88-F4-18-E3 FF-16-09-00-03-04-01-00-C8-89-F4-18-6E

显然所有这些值都以相同的八位组开头。但主要问题是这些八位字节代表什么以及它们如何转化为体重/bmi/水合作用/体脂值(如果它们确实如此)。

秤采用 Ti CC2541 芯片 (http://www.ti.com/product/cc2541) 构建。

使用 Ti 的 SmartRF 协议数据包嗅探器和 CC2540 USB 评估模块套件,我可以捕获 iPhone 5S (iOS 7.1) 和电子秤之间传输的数据包。这提供了一些额外的见解,但主要只是展示了我使用其他工具已经观察到的内容,尽管它处于较低级别。数据包嗅探器提供的任何附加信息仍然会导致同一个问题:秤发送的这些八位组代表什么以及它们如何转换为重量/bmi/等?我使用了蓝牙核心规范文档,这有助于理解标准功能的八位字节的含义/作用,但这无助于理解实际的比例数据。

我对蓝牙开发非常陌生,这个练习基本上导致了技术速成课程。任何帮助表示赞赏。

谢谢。

【问题讨论】:

由于这是来自自定义 UUID,因此秤可能正在对数据使用自定义握手。除非你能弄清楚体重秤制造商正在使用的算法,或者让创建体重秤的人告诉你数据意味着什么,否则你可能会不走运。量表是否有任何类型的开发者文档? 他们似乎没有开发人员文档,或者至少在网络上没有。是否可以使用 Ti 数据包嗅探器确定握手?或者这基本上会让我回到原来的位置? 有时您必须将特定的字节串写入特定特征才能从设备获取数据。除非您有一个可以与设备正常通信的应用程序/软件,否则您无法捕捉到这一点。 但是,您应该将这些字节 (HEX) 转换为小数,并将它们与屏幕上的读数进行比较:例如:FF-16-09-00-03-04-01-00-83-6F-F4-18-0F 读取为 256-22-09-00-03-04-01-00-131-111-244-24-15 有时它们有 high byteslow bytes 反过来命令。表示首先是低字节,例如:16 然后是高字节:09 将读取 09-16 -> 十进制:922。 是的,我尝试解析字节并转换为各种数据类型(十进制、int8、int16、uint8 等)。 bmi 显示的设备。我尝试将它们检查为磅和公斤,以及以前读数之间的增量而不是直接值。没有什么特别突出的。不过还是谢谢。 【参考方案1】:

您必须联系制造商并要求澄清定制服务和特性。

Characteristic 5 似乎具有更高的安全设置,因此当您尝试读取它时它会触发配对。很可能包含一些敏感数据。

特征 1,2,3 可能用于配置,而 4 通知有用的数据。

由于这些都是定制的,如果没有制造商的信息,根本无法找出它们的含义。

这就像您创建自己的“我们的酸奶用完了”通知配置文件...只能通过查看数据来猜测。

【讨论】:

是的,这就是我最终所做的。他们从来没有回应:)

以上是关于在没有发布 GATT 配置文件的情况下解释来自 BLE 设备的数据的主要内容,如果未能解决你的问题,请参考以下文章

光级的蓝牙 Gatt 特性

低功耗蓝牙 GATT 配置文件测量解析值

csharp 使用SDL Tridion Core Service发布页面。此示例显示如何在没有配置文件和使用B的情况下使用Core Service API

csharp 使用SDL Tridion Core Service发布页面。此示例显示如何在没有配置文件和使用B的情况下使用Core Service API

用于打开/关闭 LED 的 BLE 设备(服务器)的 GATT 配置文件

找出 Android 蓝牙 LE GATT 配置文件