[英]Android 5.0 and BLE advertising of custom Service UUID
我目前只有一部5.0手機可以測試它(在5.0 Lollipop上的Moto E2 3G),但我無法在Android 5.0上宣傳自定義UUID。 當我說自定義UUID時,我指的是藍牙LE規范未預定義的 UUID 。
在我的Nexus 6 Android 5.1上,一切正常。
AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
// Advertising this spec assigned UUID works
//ParcelUuid temp = new ParcelUuid(UUID.fromString("0000180D-0000-1000-8000-00805f9b34fb"));
// Advertising this custom UUID doesn't work!!
ParcelUuid temp = new ParcelUuid(UUID.fromString("02FD04F4-CFFF-4573-B478-F7470A7CF2F2"));
dataBuilder.addServiceUuid(temp);
settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED); settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);
settingsBuilder.setConnectable(true);
AdvertiseData ad = dataBuilder.build();
bluetoothLeAdvertiser.startAdvertising(settingsBuilder.build(), ad, null, advertiseCallback);
使用自定義UUID查看Moto E2的廣告數據包時,我可以看到 - 請注意,沒有關於服務UUID的信息:
如果我在Moto E2( 0000180D-0000-1000-8000-00805f9b34fb
)上公布已分配的服務UUID,我可以看到UUID的16位表示可用:
如果我在Nexus 6上宣傳自定義UUID,我會按預期看到UUID數據:
是否有人能夠在另一台5.0設備上確認此行為? 我是否需要制作支持的最低版本5.1? 我在互聯網上能夠找到的唯一其他相關參考是Android漏洞跟蹤器上的空票 。
我可以確認這是Moto G 2014運行5.0.2(可能還有其他設備和/或版本)的錯誤。
我的解決方法是只將您的自定義UUID插入制造商數據而不是服務UUID字段。 這只有在您可以訪問正在掃描它的中心並且可以明確檢查制造商數據以查看UUID是否存在於您決定連接時才有效。
通過我的實現,我可以控制中央檢查決定是否連接,所以我只是采用了這種方案,適用於所有在外設模式下運行的Android設備,而不是使用普通的'addServiceUuid'方法。測試Galaxy S6(5.0) .2)和Nexus 5X(6.0)並且它正在工作。
private AdvertiseData buildAdvertiseData()
{
int manufacturerID = 0x0001;
byte[] uuidBytes = new byte[]{ (byte)0x00, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F };
return new AdvertiseData.Builder()
.addManufacturerData(manufacturerID, uuidBytes)
.setIncludeDeviceName(false)
.build();
}
請確保排除設備名稱,否則某些設備會將廣告數據包放在31字節以上,否則將無法啟動廣告。
只有少數設備支持BLE廣告,盡管大多數設備都支持BLE掃描,據我所知,5.0設備不受支持。
在Android代碼中使用此代碼檢查您的設備是否受支持。您可以在其中的任何位置使用它。
BluetoothAdapter.getDefaultAdapter().isMultipleAdvertisementSupported();
這是查找您的設備是否受支持的最佳方法。 如果它不受支持你不能以編程方式做任何事情,期望購買支持的那個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.