我正在使用google(BluetoothLeGatt)中的示例项目从BLE设备接收数据,并尝试读取 onLeScan 方法获得的scanRecord中的特定字节。
我的问题是我在网络中观察到的数据和我在日志中看到的数据之间存在不匹配。
这是在Android 4.3上,并使用三星Galaxy S4进行测试。 为了验证Android上的scanRecord日志是否正确,我使用TI的Packet Sniffer来观察设备广播的字节流,这里是:
这是设备向网络广播的31字节数据,并且没有其他工作设备。
02 01 1A 1A FF 4C 00 02 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C C6 64
另一方面,Android日志声称正在接收的数据长度为62个字节,并且它与数据匹配,直到第29个[0索引]字节为止,其余数据为0。
02-12 15:34:09.548:D / DEBUG(26801):len:62 数据:02011a1aff4c000215000000000000000000000000000000000000000cc60000000000000000000000000000000000000000000000000000000000000000
这是我用来获取 LeScanCallback 方法中的日志的代码:
int len = scanRecord.length;
String scanHex = bytesToHex(scanRecord);
Log.d("DEBUG", "len: " + len + " data:" + scanHex);
用于将字节数组转换为十六进制表示的方法:
private static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
int v;
for ( int j = 0; j < bytes.length; j++ ) {
v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
我使用了其他一些示例项目,包括Dave Smith的example和RadiusNetworks'Android iBeacon Library,我得到了相同的结果。我不可能理解为什么当“数据包嗅探器”显示(并且我也知道)它应该是31个字节时,我会收到62个字节的数据。如果我能够正确读取最后一个字节中的数据(我从Android的BluetoothAdapter获得 00 而不是 64 ),这不是我主要考虑的问题。但事实并非如此。
对于数据(仅限最后一个字节)与Android收到的内容与网络上实际内容之间的数据大小之间的数据大小的原因可能是什么原因可能有任何建议。
答案 0 :(得分:2)
当您的内部长度字段表明它总共只包含30个字节(PDU长度为36)时,您的传输格式错误,包含31个字节的有效负载数据(PDU长度为37)。
让我们来看看您的数据
02 01 1a
这是类型代码的长度(2) - 01和1a,到目前为止
1a ff 4c ...
现在我们遇到了一个问题 - 1a是该字段的长度代码(制造商特定数据),值为26.然而,在您的情况下,27个字节的数据跟随它,而不是您指示的将提供的26个数据
现在,如果你有一个正确形成的数据包,你仍然会得到一个更大的缓冲区,在正确的内容之后填充无意义的(可能是未初始化的)值,但你可以通过根据字段长度解析缓冲区来简单地忽略它价值并忽略任何未在宣布的长度中计算的内容。
但是对于您当前的格式错误的数据包,将数据包数据复制到缓冲区会停止在声明的内容大小上,未经宣布的额外字节永远不会进入您的程序收到的缓冲区 - 所以你会看到一些随机的东西,就像其余未使用的长度。
当你编写你的全零“区域UUID”(可能想重新考虑)时,你只需输入一个额外的字节......