Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android BLE BluetoothAdapter.LeScanCallback扫描记录长度模糊_Java_Android_Bluetooth Lowenergy_Ibeacon Android - Fatal编程技术网

Java Android BLE BluetoothAdapter.LeScanCallback扫描记录长度模糊

Java Android BLE BluetoothAdapter.LeScanCallback扫描记录长度模糊,java,android,bluetooth-lowenergy,ibeacon-android,Java,Android,Bluetooth Lowenergy,Ibeacon Android,我正在使用google()的示例项目从一个可扫描设备接收数据,并试图读取通过onLeScan方法获得的扫描记录中的特定字节 我的问题是,我在网络中观察到的数据与我在日志中看到的数据不匹配 这是安卓4.3,并使用三星Galaxy S4进行测试。 为了验证Android上的scanRecord日志是否正确,我使用TI的数据包嗅探器来观察设备正在广播的字节流,如下所示: 即设备向网络广播31字节的数据,并且周围没有其他工作设备 02 01 1A FF 4C 00 02 15 00 00 00 00

我正在使用google()的示例项目从一个可扫描设备接收数据,并试图读取通过onLeScan方法获得的扫描记录中的特定字节

我的问题是,我在网络中观察到的数据与我在日志中看到的数据不匹配

这是安卓4.3,并使用三星Galaxy S4进行测试。 为了验证Android上的scanRecord日志是否正确,我使用TI的数据包嗅探器来观察设备正在广播的字节流,如下所示:

即设备向网络广播31字节的数据,并且周围没有其他工作设备

02 01 1A FF 4C 00 02 15 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 数据:020111AFF4C000215000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

这是我用来在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);
    } 
私有静态字符串bytesToHex(字节[]字节){
char[]hexChars=新字符[bytes.length*2];
INTV;
对于(int j=0;j>>4];
hexChars[j*2+1]=hexArray[v&0x0F];
}
返回新字符串(hexChars);
} 
我使用了其他一些示例项目,包括Dave Smith和RadiusNetworks,最终得到了相同的结果。我不可能理解为什么当“数据包嗅探器”显示(我也知道)数据应该是31字节时,我会收到62字节的数据。如果我能够正确读取最后一个字节中的数据(我从Android的BluetoothAdapter获得00而不是64),这将不是我主要关心的问题。但事实也并非如此


如果您能就Android接收到的数据与网络上的实际数据之间的数据(仅最后一个字节)和数据大小的不匹配提出建议,我将不胜感激。

您的传输格式不正确,包含31字节的有效负载数据(PDU长度为37)当其内部长度字段指示它总共应仅包含30个字节(PDU长度36)时

让我们看看你的数据

02 01 1a
这是类型代码-01和1a的长度(2),到目前为止还不错

1a ff 4c ...
现在我们有一个问题-1a是该字段的长度代码(制造商特定数据),值为26。然而,在您的案例中,27个字节的数据紧随其后,而不是您表示将提供的26个字节

现在,如果您有一个格式正确的数据包,您仍然会得到一个较大的缓冲区,在适当的内容后面填充了无意义(可能未初始化)的值,但是您可以通过根据字段长度值解析缓冲区并忽略声明的长度中未考虑的任何内容来忽略这一点

但是,对于当前格式不正确的数据包,数据包数据到缓冲区的复制在声明的内容大小处停止,并且未声明的额外字节永远不会进入程序接收的缓冲区-因此,您看到的是一些随机的内容,与未使用的剩余长度一样


可能,当您编写全零“区域UUID”(可能需要重新思考)时,您只需键入一个额外的字节…

没有额外的字节,事实上有一个额外的字节,但它是制造商故意放在流末尾的。长度确实是这里的问题,当我们将1A更改为1B时,缓冲区正好捕获了27个字节,解决了这个问题。非常感谢你指出这一点。在您的推荐之后,在@davidgyoung的回答的帮助下:,我已经阅读了核心蓝牙规范中的相关章节,它澄清了很多事情。我将对我的问题进行编辑,以反映我对其他可能需要的人的观察。我想一个格式正确(自一致)的较长数据包可以工作,只要它是您自己的外围和中心代码,并且有时可能与其他实现互操作,但我会谨慎对待这条路线,除非您打算只使用可定制的组件构建一个封闭的系统,而不是(例如)这类数据包的解码可能由操作系统执行,而不是由您提供的代码或可以更改的代码执行。我认为我主要担心的是有一天会失去与iBeacon的兼容性,我的意思是,如果他们决定为iBeacon数据包包含长度控制,那么任何与iBeacon数据长度不同的设备都将与iOS设备不兼容。至少就目前而言,似乎只有16位保留UUID使该流与苹果标准兼容。但谁知道他们何时或是否会决定为他们的数据包添加额外的控制。