[英]Android BLE BluetoothAdapter.LeScanCallback scanRecord length ambiguity
我正在使用谷歌( BluetoothLeGatt )的示例项目从BLE设备接收数据并尝试读取其中的onReScan方法获得的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 0C C6 64
另一方面,Android日志声称正在接收的数据长度为62个字节,并且它匹配数据直到第29个[0索引]字节,其余数据为0。
02-12 15:34:09.548:D / DEBUG(26801):len:62 data:02011a1aff4c000215000000000000000000000000000000000000000cc600000000000000000000000000000000000000000000000000000000000000000000
这是我用来获取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的示例和RadiusNetworks的Android iBeacon Library ,我得到了相同的结果。 我不可能理解为什么当“数据包嗅探器”显示(并且我也知道)它应该是31个字节时,我会收到62个字节的数据。 如果我能够正确读取最后一个字节中的数据(我从Android的BluetoothAdapter获得00而不是64) ,这不是我主要考虑的问题。 但事实并非如此。
对于数据(仅限最后一个字节)和Android接收到的内容与网络上实际内容之间的数据大小之间的数据大小,我将不胜感激。
当您的内部长度字段指示它应该总共只包含30个字节(PDU长度36)时,您的传输格式错误,包含31个字节的有效载荷数据(PDU长度为37)。
我们来看看你的数据吧
02 01 1a
这是类型代码的长度(2) - 01和1a,到目前为止还不错
1a ff 4c ...
现在我们遇到了一个问题 - 1a是该字段的长度代码(制造商特定数据),值为26.然而,在您的情况下,27个字节的数据跟随它,而不是您指定的将提供的26个数据。
现在,如果你有一个正确形成的数据包,你仍然会得到一个更大的缓冲区,在正确的内容之后填充无意义的(可能是未初始化的)值,但你可以通过根据字段长度值解析缓冲区并忽略它来忽略它在所宣称的长度中没有说明的任何事情。
但是对于当前格式错误的数据包,将数据包数据复制到缓冲区会停止在所声明的内容大小上,并且未经宣布的额外字节永远不会进入程序接收的缓冲区 - 所以你会看到一些随机的东西,就像其余部分一样未使用的长度。
也许,当你编写你的全零“区域UUID”(可能想重新考虑那个)时,你只需输入一个额外的字节......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.