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

标签 android ios bluetooth broadcast discovery

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

  public static final int ADVERTISE_FAILED_DATA_TOO_LARGE = 1;

我知道 GAP 配置文件广播数据包长 27 个字节,其中 7 个用于 header ,因此 20 个应该免费使用,而不仅仅是 16 个?

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

当 iOS 广播 ble 广告 header 时,我会获取设备的完整本地名称作为 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);
         }
    };

Android 有没有办法像 iOS 一样在广播中包含完整的本地名称?

谢谢!

最佳答案

如果您查看 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);
 } 

关于android - Android 如何像在 iOS 中一样广播 BLE 本地名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28843123/

相关文章:

ios - 如何以编程方式在 Swift 中的图像上添加渐变层?

iphone - iOS 从返回 null 的静态库中解析 JSON

ios - Callkit使用蓝牙耳机作为音频输出

ios - 在 iOS 应用程序中使用具有不同目标的不同 Assets.xcassets?

android - 订阅 BLE Gatt 通知 Android

java - Android 应用程序在退出时未正确释放蓝牙

android - 无论如何在Android中自动接听来电?

android - 使用 dp 会处理物理屏幕尺寸吗?

android - Sherlock 操作栏中的标签文本自定义颜色

android - 这些 ifs 语句会降低性能吗?