我有一个Android应用广告数据,其中包含服务uuid和本地名称。问题是这个"本地名称" (又名蓝牙设备名称)限制为8个字符,每个字符为16位unicode表示,因此每个字符2个字节。无论何时我尝试将设备名称更改为9个字符长,由于错误1而无法启动播放
public static final int ADVERTISE_FAILED_DATA_TOO_LARGE = 1;
我知道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);
}
};
Android是否有办法在iOS广播中包含完整的本地名称?
谢谢!
答案 0 :(得分:0)
如果查看inputstr = 'abcd'
newstring = ''
for i in inputstr:
index = alphabet.index(i)
index += 1
newstring += alphabet[index]
的过载,则可以看到扫描响应还有一个附加参数。您可以将本地名称放入扫描响应数据中。请记住从数据构建器中删除StartAdvertising
。
setIncludeDeviceName