我正在尝试在Android中获取低功耗蓝牙设备的外观数据(在Flutter应用程序中,但似乎iOS不提供外观,所以我专注于Android)。 ScanRecord 有一个 https://developer.android.com/reference/android/bluetooth/le/ScanRecord#getAdvertisingDataMap() 函数,但是我可以使用什么来索引该字典?
我尝试与 Bard 交谈,首先它希望我乏味地挖掘 https://developer.android.com/reference/android/bluetooth/le/ScanRecord#getBytes() 返回的字节数组。我不确定这是否是幻觉,但我有一种感觉我应该使用
getAdvertisingDataMap
而不是挖掘原始字节数组。
巴德幻觉一个不存在的常量索引到字典中,并说我不能使用https://developer.android.com/reference/android/bluetooth/le/ScanRecord#DATA_TYPE_APPEARANCE,是真的吗?
我的理念:
int getAppearance(ScanResult result) {
ScanRecord scanRecord = result.getScanRecord();
Map<Integer, byte[]> advertisingDataMap = scanRecord.getAdvertisingDataMap();
int appearance = 0;
if (advertisingDataMap.containsKey(ScanRecord.DATA_TYPE_APPEARANCE)) {
byte[] appearanceBytes = advertisingDataMap[ScanRecord.DATA_TYPE_APPEARANCE];
appearance = appearanceBytes[0] * 256 + appearanceBytes[1];
}
return appearance;
}
蓝牙广告 PDU 的带宽有限,大多数 AD 元素是可选的。因此,设备将其外观 AD 元素插入广告 PDU 的情况(非常)罕见。
所以我认为你的代码通常可以工作,但你不会得到结果,因为大多数设备不会广播此信息。
一般来说,“指纹识别”方法是此功能的另一种可能性。如果您使用像 nRF Connect for Mobile 这样的工具,您可以看看它。