I am trying to get the UUID
, Major
, Minor IDs
from the BLE advertisement received in the form of a byte[]
. I have used the suggested code here but the i am unable to understand the output of the parser. Here is the output i get for one of the BLE devices
Length: 2 Type : 1 Data : 6,
Length: 26 Type : -1 Data : 76 0 2 21 -9 -126 109 -90 79 -94 78 -104 -128 36 -68 91 113 -32 -119 62 12 -121 -79 52 -77,
Length: 8 Type : 9 Data : 75 111 110 116 97 107 116,
Length: 2 Type : 10 Data : -12,
Length: 10 Type : 22 Data : 13 -48 117 76 106 98 50 55 100
How to understand which field contains the UUID
, major and minor IDs? . I read from same post on stackoverflow that 0x07
indicates UUID
, how do i understand how the type is 0x07
from the above data.
This is my first question here so apologies for any mistakes in the way the question was asked.
Here is the code just in case:
public void printScanRecord (byte[] scanRecord) {
// Simply print all raw bytes
try {
String decodedRecord = new String(scanRecord,"UTF-8");
Log.d("DEBUG","decoded String : " + ByteArrayToString(scanRecord));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// Parse data bytes into individual records
List<AdRecord> records = AdRecord.parseScanRecord(scanRecord);
// Print individual records
if (records.size() == 0) {
Log.i("DEBUG", "Scan Record Empty");
} else {
Log.i("DEBUG", "Scan Record: " + TextUtils.join(",", records));
}
}
public static String ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.length * 2);
for (byte b : ba)
hex.append(b + " ");
return hex.toString();
}
public static class AdRecord {
public AdRecord(int length, int type, byte[] data) {
String decodedRecord = "";
try {
decodedRecord = new String(data,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Log.d("DEBUG", "Length: " + length + " Type : " + type + " Data : " + ByteArrayToString(data));
}
// ...
public static List<AdRecord> parseScanRecord(byte[] scanRecord) {
List<AdRecord> records = new ArrayList<AdRecord>();
int index = 0;
while (index < scanRecord.length) {
int length = scanRecord[index++];
//Done once we run out of records
if (length == 0) break;
int type = scanRecord[index];
//Done if our record isn't a valid type
if (type == 0) break;
byte[] data = Arrays.copyOfRange(scanRecord, index+1, index+length);
records.add(new AdRecord(length, type, data));
//Advance
index += length;
}
return records;
}
// ...
}
I suppose the Type values are explained in: Generic Access Profile web page
I also made some parser code that you could find from the bottom of mybletest/BLEBase.java file.