如何在android中配置ble广告以供ios检测

Posted

技术标签:

【中文标题】如何在android中配置ble广告以供ios检测【英文标题】:How to configure ble advertisement in android for ios to detect 【发布时间】:2020-04-02 02:43:07 【问题描述】:

使用我当前的配置,其他 android 设备可以很好地读取设置的 UUID,但是对于 ios,我的同事正在从这个广告/GATT 广播中获取 UUID 的变体。我真的需要为 iOS 广播 GATT 来发现我吗?

开始广告:

@ReactMethod
private void advertise(Callback advCallBack) 
    ...
    private static UUID myUUID = UUID.fromString("A85A30E5-93F3-42AE-86EB-33BFD8133597");

    AdvertiseSettings settings = new AdvertiseSettings.Builder()
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH).setConnectable(false).build();

    ParcelUuid pUuid = new ParcelUuid(myUUID);

    AdvertiseData data = new AdvertiseData.Builder().setIncludeDeviceName(false).addServiceUuid(pUuid)
            .setIncludeTxPowerLevel(true).build();

    AdvertiseCallback advertisingCallback = new AdvertiseCallback() 
        @Override
        public void onStartSuccess(AdvertiseSettings settingsInEffect) 
            super.onStartSuccess(settingsInEffect);
        

        @Override
        public void onStartFailure(int errorCode) 
            super.onStartFailure(errorCode);
        
    ;

    advertiser.startAdvertising(settings, data, advertisingCallback);

启动 GATT 服务器:

@ReactMethod
private void startServer(Callback srvCallBack) 
    mBluetoothGattServer = mBluetoothManager.openGattServer(getReactApplicationContext(), mGattServerCallback);
    if (mBluetoothGattServer == null) 
        srvCallBack.invoke(false);
        return;
    

    mBluetoothGattServer.addService(new BluetoothGattService(myUUID, BluetoothGattService.SERVICE_TYPE_PRIMARY));

    srvCallBack.invoke(true);


private BluetoothGattServerCallback mGattServerCallback = new BluetoothGattServerCallback() 
    @Override
    public void onConnectionStateChange(BluetoothDevice device, int status, int newState) 
        if (newState == BluetoothProfile.STATE_CONNECTED) 
            return;
         else if (newState == BluetoothProfile.STATE_DISCONNECTED) 
            return;
        
    
;

我们不需要相互连接,我们只需要扫描它的存在并可能传递一些我现在无法从 android 执行的信息,因为仅包含设备名称会给我一个错误代码1 这基本上意味着有效负载大于广告数据包允许的 31 个字节。有什么建议吗?

【问题讨论】:

你想在 iOS 端读什么?向您的应用报告的外围设备标识符是每个发送方/接收方的唯一值。即 iPhone A 看到的 BLE 设备 A 的标识符与 iPhone B 看到的相同 BLE 设备的标识符不同 谢谢,但我已经通过在 AdvertiseData 数据中包含服务数据来解决它; 【参考方案1】:

我通过在广告数据中包含 serviceData 解决了这个问题。

      AdvertiseData advertiseData = new AdvertiseData.Builder().setIncludeDeviceName(true)
                .addServiceUuid(new ParcelUuid(SERVICE_UUID)).addServiceData(new ParcelUuid(SERVICE_UUID), serviceData)
                .setIncludeTxPowerLevel(true).build();

【讨论】:

以上是关于如何在android中配置ble广告以供ios检测的主要内容,如果未能解决你的问题,请参考以下文章

Android 如何像在 iOS 中一样广播 BLE 本地名称?

BLE iOS Nativescript:广播数据失败

在 iOS 中单独访问所有三个 BLE 广告通道

Android 中的 BLE 广告

iOS 上的 BLE 广告和 CBAdvertisementDataLocalNameKey 大小

在 Swift 中的 iOS BLE 扫描中提取广告数据 [kCBAdvDataManufacturer] 的内容