BLE扫描记录 - 未获取所有广告数据(服务数据)

时间:2017-11-14 12:54:10

标签: bluetooth-lowenergy

我们正在开发一个使用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

1 个答案:

答案 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字节的广告。这是最大的;任何超过最大值的字节都将被切断。

现在该怎么办?将信息放入扫描响应数据中。通过使用主动扫描,除广告数据外,还可以请求扫描响应数据。从广告数据中删除制造商数据并将其放入扫描响应数据中。然后它应该工作。