本文旨在于解析出16位UUID,对于128位的UUID应该方法大同小异,没测试过的不贴出来
16bit UUID:
128位的UUID相当长,设备间为了识别数据的类型需要发送长达16字节的数据。为了提高传输效率,蓝牙技术联盟(SIG)定义了一个称为“UUID基数”的128位通用唯一识别码,结合一个较短的16位数使用。二者仍然遵循通用唯一识别码的分配规则,只不过在设备间传输常用的UUID时,只发送较短的16位版本,接收方收到后补上蓝牙UUID基数即可。
蓝牙UUID基数如下:
00000000 – 0000 – 1000 – 8000 – 008059B34FB
如要发送的16位UUID为0x2A01,完整的128的UUID便是:
00002A01 – 0000 – 1000 – 8000 – 008059B34FB
- 非完整的 16 bit UUID 列表: TYPE = 0x02;
- 完整的 16 bit UUID 列表: TYPE = 0x03;
- 非完整的 32 bit UUID 列表: TYPE = 0x04;
- 完整的 32 bit UUID 列表: TYPE = 0x05;
- 非完整的 128 bit UUID 列表: TYPE = 0x06;
- 完整的 128 bit UUID 列表: TYPE = 0x07;
如果需要其他位的UUID自己去试验,欢迎把实验结果告诉我,不扯太多,还是扯代码:
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
final ScanRecordUtil scanRecordUtil = ScanRecordUtil.parseFromBytes(scanRecord);
Logger.e(TAG, "scanRecordUtil" + scanRecordUtil.getUuids16S());
}
};
这是我实验的扫描函数
接下来是ScanRecordUtil这个类,这个类主要用来处理广播包的数据
/** * 我只把我能用的写了出来,没用的我没看懂 */ public class ScanRecordUtil { private static final String TAG = "---ScanRecordUtil"; private static final int DATA_TYPE_SERVICE_UUIDS_16_BIT_COMPLETE = 0x03; private static final int DATA_TYPE_LOCAL_NAME_COMPLETE = 0x09; // Flags of the advertising data. private final int mAdvertiseFlags; // Transmission power level(in dB).