如何使用 ScanRecord.getAdvertisingDataMap 在 Android 上获取蓝牙 LE 外观,或者是否可以通过这种方式?

问题描述 投票:0回答:1

我正在尝试在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;
}
java android flutter bluetooth bluetooth-lowenergy
1个回答
0
投票

蓝牙广告 PDU 的带宽有限,大多数 AD 元素是可选的。因此,设备将其外观 AD 元素插入广告 PDU 的情况(非常)罕见。

所以我认为你的代码通常可以工作,但你不会得到结果,因为大多数设备不会广播此信息。

一般来说,“指纹识别”方法是此功能的另一种可能性。如果您使用像 nRF Connect for Mobile 这样的工具,您可以看看它。

© www.soinside.com 2019 - 2024. All rights reserved.