bt5.0
linux bt5.0 蓝牙扩展广播怎么发送和接收
1. https://blog.youkuaiyun.com/weixin_42583147/article/details/80968708?utm_source=blogxgwz8
蓝牙4.x协议规定蓝牙广播数据包每包数据最大只支持31字节数据传输,广播信道限制在37,38,39三个信道。在原有的用于传输广播数据的PDU(ADV_IND、ADV_DIRECT_IND、ADV_NONCONN_IND以及ADV_SCAN_IND,称作legacy PDUs)的基础上,蓝牙5增加了扩展的PDU(ADV_EXT_IND、AUX_ADV_IND、AUX_SYNC_IND以及AUX_CHAIN_IND,称作extended advertising PDUs),同时也允许蓝牙在除开37,38,39三个通道之外的其他37个信道上发送长度介于0-255字节的数据。
2. https://blog.youkuaiyun.com/weixin_44606722/article/details/88617634?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare
蓝牙BLE5.0扩展广播介绍
3. https://mp.weixin.qq.com/s/w_pmGU0Olq3WE-mJFOMVRw
BLE 5.0 使用扩展广播功能bluetooth-meshd
====================================================================================
send -->
/* LE commands */
#define OGF_LE_CTL 0x08#define OCF_LE_SET_EVENT_MASK 0x0001
typedef struct {
uint8_t mask[8];
} __attribute__ ((packed)) le_set_event_mask_cp;
#define LE_SET_EVENT_MASK_CP_SIZE 8
Bit : 12 | LE Extended Advertising Report Event
Bit : 16 | LE Extended Scan Timeout Event
Bit : 17 | LE Extended Advertising Set Terminated Event
====================================================================================
adv: ADVERTISING STATE
设置扩展广播参数: ADV_EXT_IND
====================================================================================
HCI_LE_Set_Advertising_Parameters:
#define OCF_LE_SET_ADVERTISING_PARAMETERS 0x0006
typedef struct {
uint16_t min_interval; // Advertising_Interval_Min(N = 0xXXXX, Range: 0x0020 to 0x4000, Default: N = 0x0800 (1.28 s);Time = N * 0.625 ms;Time Range: 20 ms to 10.24 s)
uint16_t max_interval; // Advertising_Interval_Max(N = 0xXXXX, Range: 0x0020 to 0x4000, Default: N = 0x0800 (1.28 s);Time = N * 0.625 ms;Time Range: 20 ms to 10.24 s)
uint8_t advtype; // Advertising_Type, 0x00(ADV_IND),0x01(ADV_DIRECT_IND, high duty cycle),0x02(ADV_SCAN_IND)
// 0x03(ADV_NONCONN_IND),0x04(ADV_DIRECT_IND, low duty cycle),0x05 – 0xFF(Reserved for future use)
uint8_t own_bdaddr_type; // Own_Address_Type(0x00:Public Device Address (default); 0x01:Random Device Address)
uint8_t direct_bdaddr_type; // Peer_Address_Type,
bdaddr_t direct_bdaddr; // Peer_Address,
uint8_t chan_map; // Advertising_Channel_Map, = 7
uint8_t filter; // Advertising_Filter_Policy(scan and connection: 0x00 0x01 0x02 0x03)
} __attribute__ ((packed)) le_set_advertising_parameters_cp;
#define LE_SET_ADVERTISING_PARAMETERS_CP_SIZE 15HCI_LE_Set_Extended_Advertising_Parameters:
#define OCF_LE_Set_Extended_Advertising_Parameters 0x0036
typedef struct {
uint8_t handle; // Advertising_Handle,
uint16_t properties; // Advertising_Event_Properties,(传统广播0x13:ADV_IND;0x12:ADV_SCAN_IND;0x10:ADV_NONCONN_IND)
// (扩展广播0x03:ADV_IND;0x02:ADV_SCAN_IND;0x00:ADV_NONCONN_IND)
uint8_t min_interval[3]; // Primary_Advertising_Interval_Min(N = 0xXXXXXX, Range: 0x000020 to 0xFFFFFF, Time = N * 0.625 ms, Time Range: 20 ms to 10,485.759375 s)
uint8_t max_interval[3]; // Primary_Advertising_Interval_Max(N = 0xXXXXXX, Range: 0x000020 to 0xFFFFFF, Time = N * 0.625 ms, Time Range: 20 ms to 10,485.759375 s)
uint8_t chan_map; // Primary_Advertising_Channel_Map,
uint8_t own_bdaddr_type; // Own_Address_Type,
uint8_t direct_bdaddr_type; // Peer_Address_Type,
bdaddr_t direct_bdaddr; // Peer_Address,
uint8_t filter; // Advertising_Filter_Policy,
uint8_t tx_power; // Advertising_Tx_Power,
uint8_t primary_phy; // Primary_Advertising_PHY,
uint8_t secondary_max_skip; // Secondary_Advertising_Max_Skip,
uint8_t secondary_phy; // Secondary_Advertising_PHY,
uint8_t adv_sid; // Advertising_SID,
uint8_t notify; // Scan_Request_Notification_Enable
} __attribute__ ((packed)) le_set_extended_advertising_parameters_cp;
#define LE_SET_EXTENDED_ADVERTISING_PARAMETERS_CP_SIZE 25
====================================================================================设置扩展广播数据:
====================================================================================
HCI_LE_Set_Advertising_Data
#define OCF_LE_SET_ADVERTISING_DATA 0x0008
typedef struct {
uint8_t length;
uint8_t data[31];
} __attribute__ ((packed)) le_set_advertising_data_cp;
#define LE_SET_ADVERTISING_DATA_CP_SIZE 32HCI_LE_Set_Extended_Advertising_Data
#define OCF_LE_Set_Extended_Advertising_Parameters 0x0037
typedef struct {
uint8_t handle;
uint8_t operation;
uint8_t fragment_preference;
uint8_t length;
uint8_t data[251];
} __attribute__ ((packed)) le_set_extended_advertising_data_cp;
#define LE_SET_EXTENDED_ADVERTISING_DATA_CP_SIZE 255
====================================================================================扩展广播使能:
====================================================================================
HCI_LE_Set_Advertising_Enable
#define OCF_LE_SET_ADVERTISE_ENABLE 0x000A
typedef struct {
uint8_t enable;
} __attribute__ ((packed)) le_set_advertise_enable_cp;
#define LE_SET_ADVERTISE_ENABLE_CP_SIZE 1HCI_LE_Set_Extended_Advertising_Enable
#define OCF_LE_Set_Extended_Advertising_Enable 0x0039
typedef struct {
uint8_t enable;
uint8_t num_sets; // NUM * le_set_extended_advertising_sets_cp
} __attribute__ ((packed)) le_set_extended_advertise_enable_cp;
#define LE_SET_EXTENDED_ADVERTISE_ENABLE_CP_SIZE 2
typedef struct {
uint8_t handle;
uint16_t duration;
uint8_t max_events;
} __attribute__ ((packed)) le_set_extended_advertising_sets_cp;
#define LE_SET_EXTENDED_ADVERTISING_SETS_CP_SIZE 4
====================================================================================
====================================================================================
scan:
设置扩展广播的扫描数据回复:
====================================================================================
HCI_LE_Set_Scan_Response_Data
#define OCF_LE_SET_SCAN_RESPONSE_DATA 0x0009
typedef struct {
uint8_t length;
uint8_t data[31];
} __attribute__ ((packed)) le_set_scan_response_data_cp;
#define LE_SET_SCAN_RESPONSE_DATA_CP_SIZE 32HCI_LE_Set_Extended_Scan_Response_Data
#define OCF_LE_Set_Extended_Scan_Response_Data 0x0038
typedef struct {
uint8_t handle;
uint8_t operation;
uint8_t fragment_preference;
uint8_t length;
uint8_t data[251];
} __attribute__ ((packed)) le_set_extended_scan_response_data_cp;
#define LE_SET_EXTENDED_SCAN_RESPONSE_DATA_CP_SIZE 255
====================================================================================设置扩展广播的扫描参数:
====================================================================================
HCI_LE_Set_Scan_Parameters
#define OCF_LE_SET_SCAN_PARAMETERS 0x000B
typedef struct {
uint8_t type;
uint16_t interval;
uint16_t window;
uint8_t own_bdaddr_type;
uint8_t filter;
} __attribute__ ((packed)) le_set_scan_parameters_cp;
#define LE_SET_SCAN_PARAMETERS_CP_SIZE 7HCI_LE_Set_Extended_Scan_Parameters
#define OCF_LE_Set_Extended_Scan_Parameters 0x0041
typedef struct {
uint8_t own_bdaddr_type;
uint8_t filter;
uint8_t scanning_PHYs; // NUM * le_set_extended_scan_parameters_INFO_cp
} __attribute__ ((packed)) le_set_extended_scan_parameters_cp;
#define LE_SET_EXTENDED_SCAN_PARAMETERS_CP_SIZE 7
typedef struct {
uint8_t type;
uint16_t interval;
uint16_t window;
} __attribute__ ((packed)) le_set_extended_scan_parameters_INFO_cp;
#define LE_SET_EXTENDED_SCAN_PARAMETERS_INFO_CP_SIZE 5
====================================================================================设置扩展广播的扫描状态:
====================================================================================
HCI_LE_Set_Scan_Enable
#define OCF_LE_SET_SCAN_ENABLE 0x000C
typedef struct {
uint8_t enable;
uint8_t filter_dup;
} __attribute__ ((packed)) le_set_scan_enable_cp;
#define LE_SET_SCAN_ENABLE_CP_SIZE 2HCI_LE_Set_Extended_Scan_Enable
#define OCF_LE_Set_Extended_Scan_Enable 0x0042
typedef struct {
uint8_t enable;
uint8_t filter_dup;
uint16_t duration;
uint16_t period;
} __attribute__ ((packed)) le_set_extended_scan_enable_cp;
#define LE_SET_EXTENDED_SCAN_ENABLE_CP_SIZE 6
========================================================================================================================================================================
other:
HCI_LE_Extended_Create_Connection
#define OCF_LE_Extended_Create_Connection 0x0043====================================================================================
receive <--
/* LE Meta Event 0x3E */
Subevent_Code:
0x01 : LE Connection Complete Event
0x02 : LE Advertising Report Event
0x06 : LE Remote Connection Parameter Request Event
0x0D : LE Extended Advertising Report Event
...
====================================================================================LE Advertising Report:
Subevent_Code : 0x02
Num_Reports : 0x01 - 0x19, All other values
Event_Type[i] : 0x00 - 0x04, All other values
Address_Type[i] : 0x00 - 0x03, All other values
Address[i] : 0xXXXXXXXXXXXX
Length[i] : 0x00 - 0x1F, All other values
Data[i] : [Vol 3] Part C, Section 11
RSSI[i] : N, 127(RSSI is not available), 21 to 126 (Reserved for future use)#define EVT_LE_ADVERTISING_REPORT 0x02
typedef struct {
uint8_t evt_type;
uint8_t bdaddr_type;
bdaddr_t bdaddr;
uint8_t length;
uint8_t data[0];
} __attribute__ ((packed)) le_advertising_info;
#define LE_ADVERTISING_INFO_SIZE 9====================================================================================
LE Extended Advertising Report:
Subevent_Code : 0x0D
Num_Reports : 0x01 – 0x0A, All other values
Event_Type[i] : Bit:0-6, All other bits
Address_Type[i] : 0x00 - 0x03, 0xFF(No address provided (anonymous advertisement)), All other values
Address[i] : 0xXXXXXXXXXXXX
Primary_PHY[i] : 0x01(Advertiser PHY is LE 1M), 0x03(Advertiser PHY is LE Coded), All other values
Secondary_PHY[i] : 0x00(No packets on the secondary advertising channel)
0x01(Advertiser PHY is LE 1M)
0x02(Advertiser PHY is LE 2M)
0x03(Advertiser PHY is LE Coded)
All other values
Advertising_SID[i] : 0x00 – 0x0F(Value of the Advertising SID subfield in the ADI field of the PDU)
: 0xFF(No ADI field in the PDU)
: All other values
Tx_Power[i] : N = 0xXX(-127 ≤ N ≤ +126, Units: dBm), 127(Tx Power information not available)
RSSI[i] : N = 0xXX(-127 ≤ N ≤ +20, Units: dBm), 127(RSSI not available), All other values
Periodic_Advertising_Interval[i] : 2Bytes : 0x0000(No periodic advertising), N = 0xXXXX(Range:0x0006 to 0xFFFF,Time = N * 1.25 ms,Time Range: 7.5 ms to 81,918.75 s)
Direct_Address_Type[i] : 0x00-0x03, 0xFE, All other values
Direct_Address[i] : 6Bytes :
Data_Length[i] : 0-229, All other values
Data[i] : [Vol 3] Part C, Section 11#define EVT_LE_EXTENDED_ADVERTISING_REPORT 0x0D
typedef struct {
uint8_t evt_type;
uint8_t bdaddr_type;
bdaddr_t bdaddr;
/******** add *******/
uint8_t primary_phy;
uint8_t secondary_phy;
uint8_t adv_sid;
uint8_t tx_power;
uint8_t rssi;
uint16_t periodic_interval;
uint8_t direct_bdaddr_type;
bdaddr_t direct_bdaddr;
/******** end *******/
uint8_t length;
uint8_t data[0];
} __attribute__ ((packed)) le_extended_advertising_info;
#define LE_EXTENDED_ADVERTISING_INFO_SIZE 23====================================================================================