前言
定向广播事件是为了尽可能快的建立连接。这种报文包含两个地址:广播者的地址和发起者的地址。发起设备在收到发给自己的定向广播报文后,可以立即发送连接请求作为回应。
定向广播事件有特殊的时序要求。完整的广播事件必须每3.75ms重复一次。这一要求使得扫描设备只需要扫描3.75ms便可以收到定向广播设备的消息。
如此快的发送会让报文充斥着广播信道,进而导致该区域内的其他设备无法进行广播。因此,定向广播不可以持续1.28s以上的事件。如果主机没有主动要求停止,或者连接没有建立,控制器都会自动停止广播。一旦到了1.28s,主机便只能使用间隔长得多的通用广播,让其他设备来连接。
当使用定向广播时,设备不能被主动扫描。此外,定向广播报文的净荷中也不能带有其他附件数据。该净荷中只能包含两个必需的地址,别无其他。
代码实现:
void directAdvertising(void)
{
gapBondRec_t bond_info;
uint8_t adv_event_type = GAP_ADTYPE_ADV_HDC_DIRECT_IND;
uint8_t Adv_Direct_Addr[B_ADDR_LEN];
uint8_t Adv_Direct_Type = adv_direct.advtype;
tmos_snv_read(mainRecordNvID(0), sizeof(gapBondRec_t), &bond_info);
tmos_memcpy(Adv_Direct_Addr, bond_info.publicAddr, 6);
PRINT("Adv Direct type:%#x (", Adv_Direct_Type);
for (int i = 0; i < 6; i++) {
PRINT("%#x ", Adv_Direct_Addr[i]);
} PRINT(")\n");
GAPRole_SetParameter( GAPROLE_ADV_DIRECT_ADDR, sizeof(Adv_Direct_Addr), Adv_Direct_Addr);
GAPRole_SetParameter( GAPROLE_ADV_DIRECT_TYPE, sizeof(Adv_Direct_Type), &Adv_Direct_Type);
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof(adv_event_type), &adv_event_type);
uint8_t initial_advertising_enable = TRUE;
// Set the GAP Role Parameters
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8), &initial_advertising_enable);
}
标签:Adv,Addr,Direct,广播,BLE,sizeof,定向
From: https://www.cnblogs.com/gscw/p/17289302.html