我试图获得ble设备的UUID。我是按照Android开发人员指南,到目前为止,我只能获得设备名称和RSSI。我试图获得设备的UUID,扫描方法看起来像这样:
public void onLeScan(final BluetoothDevice device, int rssi,byte[] scanRecord) {
ParcelUuid[] myUUid =device.getUuids();
for(ParcelUuid a :myUUid){
Log.d("UUID",a.getUuid().toString());
}
String s = new String(scanRecord);
int len = scanRecord.length;
String scanRecords =new String(scanRecord) ;
deviceMap.put(device.getName().toString(), rssi);
Message msg = MainActivity.myHandler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putCharSequence("dev_name", device.getName().toString());
bundle.putCharSequence("rssi", Integer.toString(rssi));
msg.setData(bundle);
MainActivity.myHandler.sendMessage(msg);
}
这将返回- btif_gattc_upstreams_evt:事件4096
5条答案
按热度按时间pqwbnv8z1#
如果您想在BLE扫描后从scanRec[]字节中获取UUID /任何其他数据,例如制造商数据,您首先需要了解这些广告数据包的数据格式。
来自Bluetooth.org:x1c 0d1x
太多的理论,想看看一些代码片段吗?下面的函数将直接打印解析后的原始数据字节。现在,您需要了解每种类型的代码,以了解什么数据包引用什么信息。例如,类型:0x 09,指BLE设备名称,类型:0x 07,表示UUID。
经过这种解析之后,这些数据字节将变得更有意义,您可以计算出下一级的解码。
tvokkenx2#
正如评论中提到的,BLE设备实际上没有特定的UUID(但包含的服务有很多UUID)。然而,一些方案(如iBeacon)在广告数据包中的制造商特定数据记录中编码唯一标识符。
下面是一种效率非常低但概念简单的方法,可以将整个scanRecord转换为十六进制字符串表示形式,以便进行调试打印:
注意,这将包括实际的通告分组和多个无意义的尾部字节,在解析通告分组本身中包含的结构(长度字段)之后,应当忽略这些尾部字节。
vcirk6k63#
我在开发我的ble应用程序时遇到了同样的问题,但在阅读了以下链接上的文档后:https://developer.android.com/reference/android/bluetooth/le/ScanResult.html
就UUID(取决于你开发的API)而言,重要的类是:
播发数据播发数据.Builder扫描记录扫描结果
在阅读了这些类的文档之后,我编写了以下代码来获取任何被扫描设备的UUID:
//对于API〈21:
对于API〉21:
我能够使用此代码获得任何设备的128位UUID。:)
jk9hmnmh4#
我找到了一个java库来解析广告包
https://github.com/TakahikoKawasaki/nv-bluetooth
x0fgdtte5#
您可以使用标准的Android蓝牙GattCharacteristicAPI,如 getFloatValue(整数格式类型,整数偏移量),getIntValue(整数格式类型,整数偏移量),getStringValue(整数偏移量)..参考非常好的Android开发者网站教程here