BLE obtain uuid encoded in advertising packet

后端 未结 5 1258
孤城傲影
孤城傲影 2020-12-02 13:49

Im trying to get UUID of ble device. I was following android developers guide and so far I can get only device name and rssi. Im trying to get Uuid of the device that comes

5条回答
  •  独厮守ぢ
    2020-12-02 14:16

    If you want to get UUID / any other data e.g. Manufacturer Data out of scanRec[] bytes after BLE Scan, you first need to understand the data format of those Advertisement Data packet.

    Came from Bluetooth.org: Advertising or Scan Response Data format

    Too much theory, want to see some code snippet? This function below would straight forward print parsed raw data bytes. Now, you need to know each type code to know what data packet refers to what information. e.g. Type : 0x09, refers to BLE Device Name, Type : 0x07, refers to UUID.

    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 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 parseScanRecord(byte[] scanRecord) {
            List records = new ArrayList();
    
            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;
        }
    
        // ...
    }
    

    After this parsing, those data bytes would make more sense, and you can figure out next level of decoding.

提交回复
热议问题