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一样包含完整的本地名称作为广播的一部分?
谢谢!
如果您查看 的重载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)
| 归档时间: |
|
| 查看次数: |
3531 次 |
| 最近记录: |