gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:15:35 26 4
gpt4 key购买 nike

我有一个带有服务 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com