Google のサンプル プロジェクト ( BluetoothLeGatt ) を使用して BLE デバイスからデータを受信し、 onLeScanメソッドで取得した scanRecord 内の特定のバイトを読み取ろうとしています。
私の問題は、ネットワークで観察しているデータとログに表示されるデータとの間に不一致があることです。
これは Android 4.3 上で、Samsung 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-indexed] バイトまでデータと一致し、残りのデータは 0 であると主張しています。
02-12 15:34:09.548: D/DEBUG(26801): len: 62 data:02011a1aff4c000215000000000000000000000000000000000000000cc60000000000000000000000000000000000000000000000000000000000000000
これは、LeScanCallbackメソッド内でログを取得するために使用したコードです。
int len = scanRecord.length;
String scanHex = bytesToHex(scanRecord);
Log.d("DEBUG", "len: " + len + " data:" + scanHex);
バイト配列を 16 進数表現に変換するために使用されるメソッド:
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など、他のサンプル プロジェクトをいくつか使用しましたが、結果は同じでした。「Packet Sniffer」が 31 バイトであることを示している (そして私も知っている) のに、なぜ 62 バイトのデータを受信するのか理解できません。最後のバイトのデータを正しく読み取ることができれば、これは私の主な関心事ではありません ( Android の BluetoothAdapter から64ではなく00を取得します)。しかし、そうではありません。
データ (最後のバイトのみ) と、Android が受信するものと実際にネットワーク上にあるものとの間のデータ サイズの両方について、このミスマッチの潜在的な理由について何か提案をいただければ幸いです。