Android BLE:从iOS外设广告时,在onLeScan()回调中检索服务UUID

 的发个地方 发布于 2023-02-13 11:08

我使用Nexus 4(4.4 kitkat)作为中心,iPad作为外设.外围设备有广告服务.广告包有一些数据(22字节)+服务UUID.当我尝试从Android,iPad扫描外围设备时发现外围设备.但是当我尝试从回调中的scanRecord参数获取服务UUID时,我找不到它.我得到的是外围设备正在发送的20byte数据.当我尝试使用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扫描外围设备?任何帮助表示赞赏.

1 个回答
  • 扫描记录字节数组包含EIR格式的数据.请参阅蓝牙核心规范第8节.

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

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

    您正在寻找类型为0x02或0x03的EIR条目(请参阅蓝牙核心规范部分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
    

    2023-02-13 11:11 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有