Android如何在iOS中播放BLE本地名称?

Dri*_*anX 13 android bluetooth broadcast discovery ios

我有一个Android应用广告数据广播数据与服务uuid​​和本地名称.问题是这个"本地名称"(又名蓝牙设备名称)限制为8个字符,每个字符是16位unicode表示,因此每个字符2个字节.每当我尝试将设备的名称更改为9个字符长时,由于错误1而导致播放无法启动

  public static final int ADVERTISE_FAILED_DATA_TOO_LARGE = 1;
Run Code Online (Sandbox Code Playgroud)

我知道GAP配置文件广播包长度为27个字节,7个用于标头,因此20个应该可以免费使用,而不仅仅是16个?

这是真正的泡菜,让我的镍发痒:

当iOS播放广告标题时,我将设备的完整本地名称作为ScanRecord的一部分,而不仅限于16字节.只是广播的一部分,我不是在这里建立GATT连接.

iOS如何做到这一点?例如,在我的Android上,我能够从iOS广告广播中检索14个字符,28个字节长的唯一ID.28字节长于蓝牙4.0标准规定的27字节限制.Android如何能够获取超过27个字节的完整广播?为什么我的"本地名称"或设备名称最多只能是8个字符或16个字节,否则将无法开始广播?

这是我的代码:

         final BluetoothLeAdvertiser advertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();

        //advertise settings
        final AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
        settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY);
        settingsBuilder.setConnectable(true);
        settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);

        //advertise data
        AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
        ParcelUuid uuid = new ParcelUuid(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
        dataBuilder.addServiceUuid(uuid);

        mBluetoothAdapter.setName("12345678"); //8 characters works, 9+ fails
        dataBuilder.setIncludeDeviceName(true);

     if (advertiser!=null) {
         advertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), mAdvertiseCallback);
     } 

     mAdvertiseCallback = new AdvertiseCallback() {
         @Override
         public void onStartSuccess(AdvertiseSettings settingsInEffect) {
             super.onStartSuccess(settingsInEffect);
             Log.d(LOGN, "BLE STARTED ADVERTISING BROADCAST "+settingsInEffect);

         }

         @Override
         public void onStartFailure(int errorCode) {
                 super.onStartFailure(errorCode);
                 Log.d(LOGN, "BLE ADVERTISING FAILED TO START: "+errorCode);
         }
    };
Run Code Online (Sandbox Code Playgroud)

Android有没有办法像iOS一样包含完整的本地名称作为广播的一部分?

谢谢!

Jam*_*ate 1

如果您查看 的重载StartAdvertising,您可以看到扫描响应有一个附加参数。您可以将本地名称放入扫描响应数据中。setIncludeDeviceName请记住从数据生成器中删除。

AdvertiseData.Builder scanResponseBuilder = new AdvertiseData.Builder();
mBluetoothAdapter.setName("123456789")
scanResponseBuilder.setIncludeDeviceName(true);

//...

if (advertiser!=null) {
     advertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), scanResponseBuilder.SetIncludeDeviceName.build(), mAdvertiseCallback);
 } 
Run Code Online (Sandbox Code Playgroud)