title: BLE Scan Record Explanation
body: <p>I am trying to get the <code>UUID</code>, <code>Major</code>, <code>Minor IDs</code> from the BLE advertisement received in the form of a <code>byte[]</code>. I have used the suggested code <a href="https://stackoverflow.com/questions/22016224/ble-obtain-uuid-encoded-in-advertising-packet/24043510#24043510">here</a> but the i am unable to understand the output of the parser. Here is the output i get for one of the BLE devices</p>
  
  <pre><code>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
  </code></pre>
  
  <p>How to understand which field contains the <code>UUID</code> , major and minor IDs? . I read from same post on stackoverflow that <code>0x07</code> indicates <code>UUID</code>, how do i understand how the type is <code>0x07</code> from the above data.</p>
  
  <p>This is my first question here so apologies for any mistakes in the way the question was asked.</p>
  
  <p>Here is the code just in case:</p>
  
  <pre><code>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&lt;AdRecord&gt; 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&lt;AdRecord&gt; parseScanRecord(byte[] scanRecord) {
          List&lt;AdRecord&gt; records = new ArrayList&lt;AdRecord&gt;();
  
          int index = 0;
          while (index &lt; 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;
      }
  
      // ...
  }
  </code></pre>