在Android中读取广告包

我正在研究制造商特定数据的BLE传感器。 有没有示例代码演示如何在Android中接收广告数据包并分析其有效载荷?

非常感谢您的帮助。

这是我正在寻找的:

BLE扫描API BluetoothAdapter.startLeScan(ScanCallback)需要扫描结果的callback函数。 该方法需要如下所示:

private BluetoothAdapter.LeScanCallback ScanCallback = new BluetoothAdapter.LeScanCallback()onLeScan(final BluetoothDevice device, int rssi, final byte[] scanRecord) {...} 

scanRecordvariables是一个包含Advertisement包有效载荷的字节数组。

根据BLE规范,负载的结构非常简单,如下所示:

数据包最长可达47个字节,包括:

  • 1字节的前导码
  • 4字节的访问地址
  • 2-39字节的广播通道PDU
  • 3个字节的CRC

对于广告通信渠道,访问地址始终为0x8E89BED6。

PDU又有自己的头(2字节:有效载荷的大小及其types – 设备是否支持连接等)和实际有效载荷(最多37字节)。

最后,有效载荷的前6个字节是设备的MAC地址,实际信息最多可以有31个字节。

实际信息的格式如下:

第一个字节是数据的长度,第二个字节是数据的types。

如果不关心内容,这是允许任何应用程序跳过整个数据logging的一个聪明的方法。

以下是确定广告数据包内容的示例代码:

 parseAdvertisementPacket(final byte[] scanRecord) { byte[] advertisedData = Arrays.copyOf(scanRecord, scanRecord.length); int offset = 0; while (offset < (advertisedData.length - 2)) { int len = advertisedData[offset++]; if (len == 0) break; int type = advertisedData[offset++]; switch (type) { case 0x02: // Partial list of 16-bit UUIDs case 0x03: // Complete list of 16-bit UUIDs while (len > 1) { int uuid16 = advertisedData[offset++] & 0xFF; uuid16 |= (advertisedData[offset++] << 8); len -= 2; uuids.add(UUID.fromString(String.format( "%08x-0000-1000-8000-00805f9b34fb", uuid16))); } break; case 0x06:// Partial list of 128-bit UUIDs case 0x07:// Complete list of 128-bit UUIDs // Loop through the advertised 128-bit UUID's. while (len >= 16) { try { // Wrap the advertised bits and order them. ByteBuffer buffer = ByteBuffer.wrap(advertisedData, offset++, 16).order(ByteOrder.LITTLE_ENDIAN); long mostSignificantBit = buffer.getLong(); long leastSignificantBit = buffer.getLong(); uuids.add(new UUID(leastSignificantBit, mostSignificantBit)); } catch (IndexOutOfBoundsException e) { // Defensive programming. Log.e("BlueToothDeviceFilter.parseUUID", e.toString()); continue; } finally { // Move the offset to read the next uuid. offset += 15; len -= 16; } } break; case 0xFF: // Manufacturer Specific Data Log.d(TAG, "Manufacturer Specific Data size:" + len +" bytes" ); while (len > 1) { if(i < 32) { MfgData[i++] = advertisedData[offset++]; } len -= 1; } Log.d(TAG, "Manufacturer Specific Data saved." + MfgData.toString()); break; default: offset += (len - 1); break; } } 

谢谢

如何-ibeacons工作

蓝牙组织规格

为了把我放在正确的方向!

nv-bluetooth中的 ADPayloadParser分析广告数据包的有效载荷并返回一个AD结构列表。 AD结构格式在“蓝牙核心规范4.2”的“11广告和扫描响应数据格式”中描述。

以下代码片段是onLeScan方法的实现示例。

 public void onLeScan( BluetoothDevice device, int rssi, byte[] scanRecord) { // Parse the payload of the advertising packet. List<ADStructure> structures = ADPayloadParser.getInstance().parse(scanRecord); // For each AD structure contained in the advertising packet. for (ADStructure structure : structures) { if (structure instanceof IBeacon) { // iBeacon packet was found. handleIBeacon((IBeacon)structure); } ...... } } 

您可以将您自己的parsing器注册到您的制造商特定格式,并将其注册到ADPayloadParser中。 请参阅以下链接了解更多信息。

博客: http : //darutk-oboegaki.blogspot.jp/2015/03/ibeacon-as-kind-of-ad-structures.html

GitHub: https : //github.com/TakahikoKawasaki/nv-bluetooth

JavaDoc: http : //takahikokawasaki.github.io/nv-bluetooth/

Maven: http : //search.maven.org/#search| ga|1|a%3A%22nv- bluetooth%22

编辑21.02.2016

我下面链接的图书馆似乎已经移动; 请参阅https://github.com/AltBeacon/android-beacon-library


您可以使用Android iBeacon Library作为开始。

有一个参考应用程序,您可以使用基础知识和模拟数据。 〜https ://github.com/RadiusNetworks/ibeacon-reference-android~

一旦启动并运行,您可能希望导入库并将其用于实际设备,网站上还有一些示例代码: http : //developer.radiusnetworks.com/ibeacon/android/samples.html