廣播包有兩種:廣播包(Advertising Data)和響應(yīng)包(Scan Response),其中廣播包是每個(gè)設(shè)備必須廣播的,而響應(yīng)包是可選的。數(shù)據(jù)包的格式如下圖所示:data format每個(gè)包都是 31 字節(jié),數(shù)據(jù)包中分為有效數(shù)據(jù)(significant)和無效數(shù)據(jù)(non-significant)兩部分。
? ??
? ?
有效數(shù)據(jù)部分:
包含若干個(gè)廣播數(shù)據(jù)單元,稱為 AD Structure。如圖中所示,AD Structure 的組成是:第一個(gè)字節(jié)是長度值 Len,表示接下來的 Len 個(gè)字節(jié)是數(shù)據(jù)部分。數(shù)據(jù)部分的第一個(gè)字節(jié)表示數(shù)據(jù)的類型 AD Type,剩下的 Len - 1 個(gè)字節(jié)是真正的數(shù)據(jù) AD data。其中 AD type 非常關(guān)鍵,決定了 AD Data 的數(shù)據(jù)代表的是什么和怎么解析
無效數(shù)據(jù)部分:
因?yàn)閺V播包的長度必須是 31 個(gè) byte,如果有效數(shù)據(jù)部分不到 31 自己,剩下的就用 0 補(bǔ)全。這部分的數(shù)據(jù)是無效的,解釋的時(shí)候,忽略即可。
AD type:
AD type定義
完整的BLESDK 會(huì)頭文件里定義好
// 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。這個(gè)數(shù)據(jù)用來標(biāo)識(shí)設(shè)備 LE 物理連接的功能。DATA 是 0 到多個(gè)字節(jié)的 Flag 值,每個(gè) bit 上用 0 或者 1 來表示是否為 True。如果有任何一個(gè) bit 不為 0,并且廣播包是可連接的,就必須包含此數(shù)據(jù)。各 bit 的定義如下:
bit 0: LE 有限發(fā)現(xiàn)模式
bit 1: LE 普通發(fā)現(xiàn)模式
bit 2: 不支持 BR/EDR
bit 3: 對(duì) Same Device Capable(Controller) 同時(shí)支持 BLE 和 BR/EDR
bit 4: 對(duì) Same Device Capable(Host) 同時(shí)支持 BLE 和 BR/EDR
bit 5…7: 預(yù)留
Service UUID:
Service UUID: 廣播數(shù)據(jù)中一般都會(huì)把設(shè)備支持的 GATT Service 廣播出來,用來告訴外面本設(shè)備所支持的 Service。有三種類型的 UUID:16 bit, 32bit, 128 bit。廣播中,每種類型類型有有兩個(gè)類別:完整和非完整的。這樣就共有 6 種 AD Type。
Local Name:
Local Name: 設(shè)備名字,DATA 是名字的字符串。Local Name 可以是設(shè)備的全名,也可以是設(shè)備名字的縮寫,其中縮寫必須是全名的前面的若干字符。
設(shè)備全名:TYPE = 0x08
設(shè)備簡稱:TYPE = 0x09
TX Power Level:
TX Power Level: TYPE = 0x0A,表示設(shè)備發(fā)送廣播包的信號(hào)強(qiáng)度。DATA 部分是一個(gè)字節(jié),表示 -127 到 + 127 dBm。
Security Manager Out of Band
帶外安全管理(Security Manager Out of Band):TYPE = 0x11。DATA 也是 Flag,每個(gè) bit 表示一個(gè)功能:
bit 0: OOB Flag,0 表示沒有 OOB 數(shù)據(jù),1 表示有
bit 1: 支持 LE
bit 2: 對(duì) Same Device Capable(Host) 同時(shí)支持 BLE 和 BR/EDR
bit 3: 地址類型,0 表示公開地址,1 表示隨機(jī)地址
外設(shè)(Slave)連接間隔范圍:
外設(shè)(Slave)連接間隔范圍:TYPE = 0x12。數(shù)據(jù)中定義了 Slave 最大和最小連接間隔,數(shù)據(jù)包含 4 個(gè)字節(jié):
前 2 字節(jié):定義最小連接間隔,取值范圍:0x0006 ~ 0x0C80,而 0xFFFF 表示未定義;
后 2 字節(jié):定義最大連接間隔,同上,不過需要保證最大連接間隔大于或者等于最小連接間隔。
服務(wù)搜尋:
服務(wù)搜尋:外圍設(shè)備可以要請(qǐng)中心設(shè)備提供相應(yīng)的 Service。其數(shù)據(jù)定義和前面的 Service UUID 類似:
16 bit UUID 列表:TYPE = 0x14
32 bit UUID 列表:TYPE = 0x??
128 bit UUID 列表:TYPE = 0x15
Service Data:
Service Data: Service 對(duì)應(yīng)的數(shù)據(jù)。
16 bit UUID Service: TYPE = 0x16, 前 2 字節(jié)是 UUID,后面是 Service 的數(shù)據(jù);
32 bit UUID Service: TYPE = 0x??, 前 4 字節(jié)是 UUID,后面是 Service 的數(shù)據(jù);
128 bit UUID Service: TYPE = 0x??, 前 16 字節(jié)是 UUID,后面是 Service 的數(shù)據(jù)
公開目標(biāo)地址:
公開目標(biāo)地址:TYPE = 0x17,表示希望這個(gè)廣播包被指定的目標(biāo)設(shè)備處理,此設(shè)備綁定了公開地址,DATA 是目標(biāo)地址列表,每個(gè)地址 6 字節(jié)。
隨機(jī)目標(biāo)地址:
隨機(jī)目標(biāo)地址:TYPE = 0x18,定義和前一個(gè)類似,表示希望這個(gè)廣播包被指定的目標(biāo)設(shè)備處理,此設(shè)備綁定了隨機(jī)地址,DATA 是目標(biāo)地址列表,每個(gè)地址 6 字節(jié)。
Appearance:
Appearance:TYPE = 0x19,DATA 是表示了設(shè)備的外觀
廠商自定義數(shù)據(jù):
廠商自定義數(shù)據(jù): TYPE = 0xFF,廠商自定義的數(shù)據(jù)中,前兩個(gè)字節(jié)表示廠商 ID,剩下的是廠商自己按照需求添加,里面的數(shù)據(jù)內(nèi)容自己定義。
廣播包代碼配置
config/user_config.h
?
//設(shè)備名稱
#define APP_DFLT_DEVICE_NAME? ?? ?? ???("SUN_UART")
//廣播包UUID配置
#define APP_FFF0_ADV_DATA_UUID? ?? ???"x03x03xE0xFF"
#define APP_FFF0_ADV_DATA_UUID_LEN? ? (4)
//掃描響應(yīng)包數(shù)據(jù)
#define APP_SCNRSP_DATA? ?? ???"x07x08x42x4Bx33x34x33x32" //BK3432"
#define APP_SCNRSP_DATA_LEN? ???(8)
復(fù)制代碼
低功耗藍(lán)牙 BLE 廣播數(shù)據(jù)解析:
flags:0x06
UUID:F0FF
DeviceName設(shè)備名:Fragrance ?(AD Type:09)
ShortenedName簡略設(shè)備名:Fragrance??(08: AD TYPE Shortened Local Name)
?
編輯:黃飛
評(píng)論