安卓ble廣播數據簡析

手環,跳繩各種~

廣播

藍牙的廣播包有兩種: 廣播包 (Advertising Data)和 響應包 (Scan Response),其中廣播包是每個設備必須廣播的,而響應包是可選的。每個包都是 31 字節,數據包中分爲有效數據(significant)和無效數據(non-significant)兩部分。

scanRecord數據

有效數據部分 :包含若干個廣播數據單元,稱爲 AD Structure 。AD Structure 的組成是:第一個字節是長度值 Len ,表示接下來的 Len 個字節是數據部分。數據部分的第一個字節表示數據的類型 AD Type ,剩下的 Len - 1 個字節是真正的數據 AD data 。其中 AD type 非常關鍵,決定了 AD Data 的數據代表的是什麼和怎麼解析。無效數據部分 :因爲廣播包的長度必須是 31 個 byte,如果有效數據部 分不到 31 自己,剩下的就用 0 補全。這部分的數據是無效的,解釋的時候,忽略即可。在 Android 中,系統會把這兩個數據拼接在一起,返回一個 62 字節的數組。

廠商數據 0xFF

廠商自定義數據: TYPE = 0xFF,廠商自定義的數據中,前兩個字節表示廠商 ID,剩下的是廠商自己按照需求添加,裏面的數據內容自己定義。
在這裏插入圖片描述
在這裏插入圖片描述

0x02010610FF1400F6A0717A01B7023400D30000000A08776F7A75696C5F30311106000045534957504C4100000001530000

第一個 字節代表廣播數據單元的長度 ,02 轉爲10進制就是 2代表其數據長度爲2 , 而數據單元的第一個字節代表類型 。
01 代表 代表物理連接功能爲普通發現模式 06代表其數據類容
緊接着下一個數據單元:0B代表數據長度爲11

String hex = BLEManagerUtils.bytesToHexString1(scanRecord);
//找到廠商自定義數據位置
int ffIndex = hex.indexOf("FF");
//020106 數據類容模式
if (ffIndex >= 2 && hex.startsWith("020106")) {
    //自定義數據長度
    String lenStr = hex.substring(ffIndex - 2, ffIndex);
    int len = Integer.parseInt(lenStr, 16);
    //自定義數據hex字符串
    String substring = hex.substring(ffIndex, ffIndex + 2 * len);
    //FF+廠商ID+Mac地址+數據
    String dataStr = substring.substring(2 + 4 + 12);
    //低字節
    String jj = dataStr.substring(8, 10) + dataStr.substring(6, 8);
    int count = Integer.parseInt(jj, 16);
    Log.d(TAG, "isJumping: " + count);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章