廣播包有兩種:廣播包(Advertising Data)和響應包(Scan Response),其中廣播包是每個設備必須廣播的,而響應包是可選的。數據包的格式如下圖所示:data format每個包都是 31 字節,數據包中分為有效數據(significant)和無效數據(non-significant)兩部分。
? ??
? ?
有效數據部分:
包含若干個廣播數據單元,稱為 AD Structure。如圖中所示,AD Structure 的組成是:第一個字節是長度值 Len,表示接下來的 Len 個字節是數據部分。數據部分的第一個字節表示數據的類型 AD Type,剩下的 Len - 1 個字節是真正的數據 AD data。其中 AD type 非常關鍵,決定了 AD Data 的數據代表的是什么和怎么解析
無效數據部分:
因為廣播包的長度必須是 31 個 byte,如果有效數據部分不到 31 自己,剩下的就用 0 補全。這部分的數據是無效的,解釋的時候,忽略即可。
AD type:
AD type定義
完整的BLESDK 會頭文件里定義好
// GAP_ADTYPE_DEFINES GAP Advertisement Data Types
#define GAP_ADTYPE_FLAGS? ?? ?? ?? ?? ?? ?? ?? ? 0x01 //!< Discovery Mode: @ref GAP_ADTYPE_FLAGS_MODES
#define GAP_ADTYPE_16BIT_MORE? ?? ?? ?? ?? ?? ? 0x02 //!< Service: More 16-bit UUIDs available
#define GAP_ADTYPE_16BIT_COMPLETE? ?? ?? ?? ?? ?0x03 //!< Service: Complete list of 16-bit UUIDs
#define GAP_ADTYPE_32BIT_MORE? ?? ?? ?? ?? ?? ???0x04 //!< Service: More 32-bit UUIDs available
#define GAP_ADTYPE_32BIT_COMPLETE? ?? ?? ?? ?? ?0x05 //!< Service: Complete list of 32-bit UUIDs
#define GAP_ADTYPE_128BIT_MORE? ?? ?? ?? ?? ?? ? 0x06 //!< Service: More 128-bit UUIDs available
#define GAP_ADTYPE_128BIT_COMPLETE? ?? ?? ?? ???0x07 //!< Service: Complete list of 128-bit UUIDs
#define GAP_ADTYPE_LOCAL_NAME_SHORT? ?? ?? ?? ? 0x08 //!< Shortened local name
#define GAP_ADTYPE_LOCAL_NAME_COMPLETE? ?? ?? ? 0x09 //!< Complete local name
#define GAP_ADTYPE_POWER_LEVEL? ?? ?? ?? ?? ?? ? 0x0A //!< TX Power Level: 0xXX: -127 to +127 dBm
#define GAP_ADTYPE_OOB_CLASS_OF_DEVICE? ?? ?? ???0x0D //!< Simple Pairing OOB Tag: Class of device (3 octets)
#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_HASHC? ???0x0E //!< Simple Pairing OOB Tag: Simple Pairing Hash C (16 octets)
#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_RANDR? ???0x0F //!< Simple Pairing OOB Tag: Simple Pairing Randomizer R (16 octets)
#define GAP_ADTYPE_SM_TK? ?? ?? ?? ?? ?? ?? ?? ? 0x10 //!< Security Manager TK Value
#define GAP_ADTYPE_SM_OOB_FLAG? ?? ?? ?? ?? ?? ?0x11 //!< Security Manager OOB Flags
#define GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE? ? 0x12 //!< Min and Max values of the connection interval (2 octets Min, 2 octets Max) (0xFFFF indicates no conn interval min or max)
#define GAP_ADTYPE_SIGNED_DATA? ?? ?? ?? ?? ?? ?0x13 //!< Signed Data field
#define GAP_ADTYPE_SERVICES_LIST_16BIT? ?? ?? ?0x14 //!< Service Solicitation: list of 16-bit Service UUIDs
#define GAP_ADTYPE_SERVICES_LIST_128BIT? ?? ???0x15 //!< Service Solicitation: list of 128-bit Service UUIDs
#define GAP_ADTYPE_SERVICE_DATA? ?? ?? ?? ?? ?? ?0x16 //!< Service Data - 16-bit UUID
#define GAP_ADTYPE_PUBLIC_TARGET_ADDR? ?? ?? ???0x17 //!< Public Target Address
#define GAP_ADTYPE_RANDOM_TARGET_ADDR? ?? ?? ???0x18 //!< Random Target Address
#define GAP_ADTYPE_APPEARANCE? ?? ?? ?? ?? ?? ?? ?0x19 //!< Appearance
#define GAP_ADTYPE_ADV_INTERVAL? ?? ?? ?? ?? ?? ? 0x1A //!< Advertising Interval
#define GAP_ADTYPE_LE_BD_ADDR? ?? ?? ?? ?? ?? ?? ?0x1B //!< LE Bluetooth Device Address
#define GAP_ADTYPE_LE_ROLE? ?? ?? ?? ?? ?? ?? ?? ? 0x1C //!< LE Role
#define GAP_ADTYPE_SIMPLE_PAIRING_HASHC_256? ???0x1D //!< Simple Pairing Hash C-256
#define GAP_ADTYPE_SIMPLE_PAIRING_RANDR_256? ???0x1E //!< Simple Pairing Randomizer R-256
#define GAP_ADTYPE_SERVICE_DATA_32BIT? ?? ?? ???0x20 //!< Service Data - 32-bit UUID
#define GAP_ADTYPE_SERVICE_DATA_128BIT? ?? ?? ? 0x21 //!< Service Data - 128-bit UUID
#define GAP_ADTYPE_3D_INFO_DATA? ?? ?? ?? ?? ?? ?0x3D //!< 3D Information Data
#define GAP_ADTYPE_MANUFACTURER_SPECIFIC? ?? ? 0xFF //!< Manufacturer Specific Data: first 2 octets contain the Company Identifier Code followed by the additional manufacturer specific data
// GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes
#define GAP_ADTYPE_FLAGS_LIMITED? ?? ?? ?? ?? ? 0x01 //!< Discovery Mode: LE Limited Discoverable Mode
#define GAP_ADTYPE_FLAGS_GENERAL? ?? ?? ?? ?? ? 0x02 //!< Discovery Mode: LE General Discoverable Mode
#define GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED??0x04 //!< Discovery Mode: BR/EDR Not Supported
Flags: TYPE = 0x01。這個數據用來標識設備 LE 物理連接的功能。DATA 是 0 到多個字節的 Flag 值,每個 bit 上用 0 或者 1 來表示是否為 True。如果有任何一個 bit 不為 0,并且廣播包是可連接的,就必須包含此數據。各 bit 的定義如下:
bit 0: LE 有限發現模式
bit 1: LE 普通發現模式
bit 2: 不支持 BR/EDR
bit 3: 對 Same Device Capable(Controller) 同時支持 BLE 和 BR/EDR
bit 4: 對 Same Device Capable(Host) 同時支持 BLE 和 BR/EDR
bit 5…7: 預留
Service UUID:
Service UUID: 廣播數據中一般都會把設備支持的 GATT Service 廣播出來,用來告訴外面本設備所支持的 Service。有三種類型的 UUID:16 bit, 32bit, 128 bit。廣播中,每種類型類型有有兩個類別:完整和非完整的。這樣就共有 6 種 AD Type。
Local Name:
Local Name: 設備名字,DATA 是名字的字符串。Local Name 可以是設備的全名,也可以是設備名字的縮寫,其中縮寫必須是全名的前面的若干字符。
設備全名:TYPE = 0x08
設備簡稱:TYPE = 0x09
TX Power Level:
TX Power Level: TYPE = 0x0A,表示設備發送廣播包的信號強度。DATA 部分是一個字節,表示 -127 到 + 127 dBm。
Security Manager Out of Band
帶外安全管理(Security Manager Out of Band):TYPE = 0x11。DATA 也是 Flag,每個 bit 表示一個功能:
bit 0: OOB Flag,0 表示沒有 OOB 數據,1 表示有
bit 1: 支持 LE
bit 2: 對 Same Device Capable(Host) 同時支持 BLE 和 BR/EDR
bit 3: 地址類型,0 表示公開地址,1 表示隨機地址
外設(Slave)連接間隔范圍:
外設(Slave)連接間隔范圍:TYPE = 0x12。數據中定義了 Slave 最大和最小連接間隔,數據包含 4 個字節:
前 2 字節:定義最小連接間隔,取值范圍:0x0006 ~ 0x0C80,而 0xFFFF 表示未定義;
后 2 字節:定義最大連接間隔,同上,不過需要保證最大連接間隔大于或者等于最小連接間隔。
服務搜尋:
服務搜尋:外圍設備可以要請中心設備提供相應的 Service。其數據定義和前面的 Service UUID 類似:
16 bit UUID 列表:TYPE = 0x14
32 bit UUID 列表:TYPE = 0x??
128 bit UUID 列表:TYPE = 0x15
Service Data:
Service Data: Service 對應的數據。
16 bit UUID Service: TYPE = 0x16, 前 2 字節是 UUID,后面是 Service 的數據;
32 bit UUID Service: TYPE = 0x??, 前 4 字節是 UUID,后面是 Service 的數據;
128 bit UUID Service: TYPE = 0x??, 前 16 字節是 UUID,后面是 Service 的數據
公開目標地址:
公開目標地址:TYPE = 0x17,表示希望這個廣播包被指定的目標設備處理,此設備綁定了公開地址,DATA 是目標地址列表,每個地址 6 字節。
隨機目標地址:
隨機目標地址:TYPE = 0x18,定義和前一個類似,表示希望這個廣播包被指定的目標設備處理,此設備綁定了隨機地址,DATA 是目標地址列表,每個地址 6 字節。
Appearance:
Appearance:TYPE = 0x19,DATA 是表示了設備的外觀
廠商自定義數據:
廠商自定義數據: TYPE = 0xFF,廠商自定義的數據中,前兩個字節表示廠商 ID,剩下的是廠商自己按照需求添加,里面的數據內容自己定義。
廣播包代碼配置
config/user_config.h
?
//設備名稱
#define APP_DFLT_DEVICE_NAME? ?? ?? ???("SUN_UART")
//廣播包UUID配置
#define APP_FFF0_ADV_DATA_UUID? ?? ???"x03x03xE0xFF"
#define APP_FFF0_ADV_DATA_UUID_LEN? ? (4)
//掃描響應包數據
#define APP_SCNRSP_DATA? ?? ???"x07x08x42x4Bx33x34x33x32" //BK3432"
#define APP_SCNRSP_DATA_LEN? ???(8)
復制代碼
低功耗藍牙 BLE 廣播數據解析:
flags:0x06
UUID:F0FF
DeviceName設備名:Fragrance ?(AD Type:09)
ShortenedName簡略設備名:Fragrance??(08: AD TYPE Shortened Local Name)
?
編輯:黃飛
評論
查看更多