BLE 扫描记录 - 未获取所有广告数据(服务数据)
Posted
技术标签:
【中文标题】BLE 扫描记录 - 未获取所有广告数据(服务数据)【英文标题】:BLE scan Record- Not getting all the advertisement data (service data) 【发布时间】:2017-11-14 12:54:10 【问题描述】:我们正在开发一个 react-native 应用,我们需要在其中扫描和读取所有制造商数据和服务数据以及来自 BLE 设备的数据。
问题是我们在服务数据中得到了一些细节(只有 9 个字节),而我们应该得到 31 个字节的数据。
使用的插件 - https://github.com/Polidea/react-native-ble-plx
BLE Device details-这是使用nRF52832 SoC的定制硬件
下面是我们正在使用的示例代码:
import BleManager from 'react-native-ble-plx';
this.manager = new BleManager();
//Checking Bluetooth state
const subscription = this.manager.onStateChange((state) =>
if (state === 'PoweredOn')
this.startDeviceScan(scanTimeout);
subscription.remove();
, true);
//Start Scan
startDeviceScan(scanTimeout)
var me = this;
this.manager.startDeviceScan(null, null, (error, device) =>
if (error)
// Handle error (scanning will be stopped automatically)
console.log("scanningError" + error.message);
me.startDeviceScan();
return;
if (device)
// Here we are supposed to get the advertisment data(Manufacturer data) in device object
this.emit('startScanSuccess', device);
);
我们在设备对象中得到的结果如下 serviceData - 对象 = 00006612-0000-1000-8000-00805f9b34fb:"/QosfgB5h/hZ↵" 制造商数据 = "P/8AAQ=="
要求的结果 - 根据我们的设备规范,它应该是 服务数据——我们应该得到至少 31 字节的数据。
使用以下插件,我们可以获得所有数据,但它在 react-native 中不起作用:https://github.com/randdusing/cordova-plugin-bluetoothle
【问题讨论】:
请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。 【参考方案1】:我认为您实际上获得了 31 个字节的数据。让我们看看广告数据的结构,遵循蓝牙核心规范 V5.0 和核心规范补充 V6。
核心规范规定广告数据应具有以下模式:N 个结构,每个结构由一个长度八位字节、一个广告类型八位字节(例如制造商数据)和相应的数据(参见第 3 卷 C 部分第 1 章)组成。 11).
您收到“服务数据”和“制造商数据”类型。这是两个结构,每个都包含一个长度字段、一个类型字段和一个数据字段。 serviceData 的数据字段长度为 16 字节,加上长度和类型,我们有一个 18 字节的结构。制造商数据的数据字段长度为8字节,加上长度和类型我们有10字节的结构。
所以现在我们有 28 个字节。此外,广告需要一个标志字段,如果这是有限的或一般的发现,如果支持 BR/EDR 等(参见核心补充,A 部分,第 1.3 章)。
这个标志字段有一个八位字节的数据字段。加上长度和类型,我们有一个额外的 3 字节结构,所以总而言之,你会得到一个 31 字节的广告。那是最大值;任何超过最大值的字节都将被切断。
现在该怎么办?将信息放入扫描响应数据中。通过使用主动扫描,除了广告数据之外,您还可以请求扫描响应数据。从广告数据中删除制造商数据,并将其放入扫描响应数据中。那么它应该可以工作了。
【讨论】:
以上是关于BLE 扫描记录 - 未获取所有广告数据(服务数据)的主要内容,如果未能解决你的问题,请参考以下文章
BLE 设备在不扫描时是不是会读取广告数据包? (自动连接)
在 Swift 中的 iOS BLE 扫描中提取广告数据 [kCBAdvDataManufacturer] 的内容