我们正在开发一个使用react-native的应用程序,我们需要从BLE设备中扫描和读取所有制造商数据和服务数据。
问题是我们在服务数据中只获得了一些细节(只有9个字节),我们应该得到31个字节的数据。
使用插件 - https://github.com/Polidea/react-native-ble-plx
BLE设备详细信息 - 这是一个使用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 - Object = {00006612-0000-1000-8000-00805f9b34fb:“/ QosfgB5h /hZ↵”} manufacturerData =“P / 8AAQ ==”
必填结果 - 根据我们的设备规格,它应该是 服务数据 - 我们应该至少获得31字节的数据。
使用下面的插件,我们可以获取所有数据,但它在react-native中不起作用:https://github.com/randdusing/cordova-plugin-bluetoothle
答案 0 :(得分:0)
我认为你实际上获得了31个字节的数据。让我们看一下广告数据的结构,遵循蓝牙核心规范V5.0和核心规范补充V6。
核心规范指定广告数据应具有以下模式:N个结构,每个结构由长度八位字节,AD类型八位字节(例如制造商数据)和相应数据组成(参见第3卷,第C部分,第3章)。 11)。
您会收到“服务数据”和“制造商数据”类型。这是两个结构,每个结构包含一个长度字段,一个类型字段和数据字段。 serviceData的数据字段长度为16个字节,加上长度和类型,我们有18个字节的结构。制造商数据的数据字段长度为8个字节,加上长度和类型,我们有10个字节的结构。
所以现在我们有28个字节。此外,广告需要一个标志字段,如果这是有限的或一般发现,如果支持BR / EDR等,则需要定义标志字段(参见核心补充,A部分,第1.3章)。
此标志字段具有一个八位字节的数据字段。与长度和类型一起,我们有一个3字节的额外结构,所以总而言之,你得到一个31字节的广告。这是最大的;任何超过最大值的字节都将被切断。
现在该怎么办?将信息放入扫描响应数据中。通过使用主动扫描,除广告数据外,还可以请求扫描响应数据。从广告数据中删除制造商数据并将其放入扫描响应数据中。然后它应该工作。