安卓蓝牙 : Retrieve service UUID in onLeScan() callback when advertised from iOS Peripheral

标签 android ios bluetooth-lowenergy

我使用 Nexus 4(4.4 kitkat)作为中心,iPad 作为外围设备。外围设备有一项广告服务。广告数据包有一些数据(22 字节)+ 服务 UUID。当我尝试扫描外围设备时发现了 Android、iPad 外围设备。但是,当我尝试从回调中的 scanRecord 参数获取服务 UUID 时,我找不到它。我得到的只是外围设备正在发送的 20 字节数据。当我尝试扫描设备时UUID 我无法发现那些外围设备。

以下是广告服务的iOS代码。使用的服务ID是“0000192f-0000-1000-8000-00805f9b34fb”

CBUUID *serviceUuid = [CBUUID UUIDWithString:TRANSFER_SERVICE_UUID];
    [self.peripheralManager startAdvertising:@{CBAdvertisementDataServiceUUIDsKey : @[serviceUuid],
                                               CBAdvertisementDataLocalNameKey:[[BTLEConfigs sharedBTLEConfig] getAdvertizingUUID]}];

当我在没有服务 UUID 的情况下扫描时发现设备。

// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
        new BluetoothAdapter.LeScanCallback() {

    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, final byte[] scanRecord) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                //-- how to retrieve the service id from scanRecord
            }
        });
    }
};

服务是在两个 iOS 设备之间发现的,但在 Android 设备和 iOS 外围设备之间它不工作。如何扫描具有 16 位服务 UUID 的外围设备?感谢任何帮助。

最佳答案

扫描记录字节数组包含 EIR 格式的数据。查看Bluetooth Core Specification第 8 节。

扫描记录包含一个或多个顺序的 EIR 条目,其格式如下:

<entry length (1 byte)> <data type (1 byte)> <data (length - 1 bytes)>

您正在查找类型为 0x02 或 0x03 的 EIR 条目(参见 Bluetooth Core Specification 第 18.2 节)。条目的数据将包含一个或多个 Little Endian 格式的 UUID。

示例扫描记录:

02011a0303b4540a094c69676874426c7565

可以分解为:

02 01 1a                    Flags               - 1a
03 03 b454                  16-bit service UUID - 54b4
0a 09 4c69676874426c7565    Local name          - LightBlue

关于安卓蓝牙 : Retrieve service UUID in onLeScan() callback when advertised from iOS Peripheral,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20352200/

相关文章:

java - android替换字符串中的多个字符

java - LogCat 消息的更简洁的着色?

ios - 从 Firebase 下载 pdf 并将其本地存储在 iOS 上

objective-c - 我怎样才能知道父类(super class)是否也实现了我的子类实现的相同方法?

android - Android中BluetoothLeScanner的setReportDelay的目的是什么

android - Android 上的低功耗蓝牙 : Get event when RSSI changes

android - 应用安装了两次

android - BroadcastReceiver 检查是否发生任何网络变化

ios - NSURLRequest HTTPMethod 属性的 NSString 常量?

与 API>=21 AND API<21 兼容的 Android 低功耗蓝牙代码