BLE ScanRecord 的 getServiceData 包含什么?

What does the BLE ScanRecord's getServiceData contain?

我有一个连接低功耗蓝牙设备的应用程序。服务 UUID 提供了一个很好的指示,但这还不够:我需要查看设备在特定服务中提供的确切特征。我看到 ScanRecord 中有一个所谓的“服务数据”,它是一系列字节:

https://developer.android.com/reference/android/bluetooth/le/ScanRecord#getServiceData()

但是我在任何地方都找不到关于它的任何细节:该服务数据中的信息是什么?在 nRF 连接中,它似乎是一个字节(或几个字节),所以它可能是某种位标志。我希望服务数据可以避免我发现设备,因为这需要连接到它,我真的想避免这种情况。

举个更具体的例子:我支持 FTMS Fitness Machines (0x1826),但仅支持 Indoor Bike (0x2ad2 characteristic)、Treadmill (0x2acd) 或 Rower (0x2ad1),但不支持交叉训练机、踏步机或爬楼梯。

该广告不包含有关设备具有哪些特性的数据。

有服务uuid​​的广告类型,但没有标准规定的特征。

通常如果您知道支持哪些服务,您也应该能够假设这些特征,因为每个服务的规范文档都应该包含该信息。

“服务数据”只包含任意字节。这些字节包含的内容由服务规范定义。

@Emil 的回答对一般情况有效。至于我的具体示例,我需要添加一个答案,因为它确实提供了有关特征的信息(幸运的是)。 FTMS 服务可以代表各种各样的健身器材:室内自行车、跑步机、划船机、交叉训练机、踏步机、楼梯机。这些都在服务中实现了不同的特性,以提供设备特定数据。就我而言,即使在扫描阶段,我也可能想知道设备是哪种类型,而无需与设备配对。

所以基本上这是 RTFM(阅读精细手册)的情况,在研究了 FTMS 标准文档后,我可以高兴地说 FTMS (0x1826) 情况下的广告数据有一个所谓的“健身机器类型”字段,这是一个 2 字节长的位标志。在 78 页长规范 PDF 中,它位于第 15-16 页。该标志的位:

  • 位 0:支持跑步机
  • 第 1 位:支持交叉训练器
  • 第 2 位:支持阶梯式登山器
  • 第 3 位:支持爬楼梯
  • 第 4 位:支持赛艇运动员
  • 第 5 位:支持室内自行车
  • 第 6-15 位:未来使用

标准委员会一定已经意识到了这个用例,向他们致敬。我很快就会在我的软件中利用这一点。