蓝牙BLE从机Peripheral讲解三(定向广播/Direct Adv)

一、定义

定向广播事件是为了尽可能快的建立连接。这种报文包含两个地址:广播者的地址和发起者的地址。发起设备在收到发给自己的定向广播报文后,可以立即发送连接请求作为回应。
定向广播事件有特殊的时序要求。完整的广播事件必须每3.75ms重复一次。这一要求使得扫描设备只需要扫描3.75ms便可以收到定向广播设备的消息。
如此快的发送会让报文充斥着广播信道,进而导致该区域内的其他设备无法进行广播。因此,定向广播不可以持续1.28s以上的事件。如果主机没有主动要求停止,或者连接没有建立,控制器都会自动停止广播。一旦到了1.28s,主机便只能使用间隔长得多的通用广播,让其他设备来连接。
当使用定向广播时,设备不能被主动扫描。此外,定向广播报文的净荷中也不能带有其他附件数据。该净荷中只能包含两个必需的地址,别无其他。

二、描述

定向广播(Direct Adv)又被称为回连包,主要用在回连的时候可以快速的连接上。既然是回连包,在设备第一次上电时,依旧使用通用广播,随后建立连接并断开后,使用定向广播,这样可以加快回连的速度。

1、代码逻辑:

  1. 设备初始化,启用通用广播;
  2. 主从机建立连接并绑定;
  3. 主从机断开连接;
  4. 从机在断开连接后获取绑定主机MAC地址并开启定向广播。

2、注意:

开启定向广播后,仅有从机存放的MAC对应的主机可以搜索到,其他主机无法搜索到。

定向广播报文的净荷中不能带有其他附件数据。该净荷中只能包含两个必需的地址,别无其他。

该过程持续1.28s,结束后可以重新开启定向广播进行快速回连,或者开启通用广播对所有的主机开放。
如使用手机作为主机连接从机,则不建议从机使用定向广播,因为主机类型存在兼容性问题。如果需要快速连接建议使用高占空比广播(广播间隔调小)

3、代码参考:

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;  //建立连接时可以获取到地址类型,传入即可

    if(Adv_Direct_Type == 3)    //identity address,可能为public address,也可能是random static address,因此传入地址0或者1
    {
        uint8_t enable = ENABLE;
        GAPBondMgr_SetParameter( GAPBOND_AUTO_SYNC_RL, sizeof(uint8), &enable);  //解析之后地址类型只有0或者1
        Adv_Direct_Type = 0;
    }

    tmos_snv_read(mainRecordNvID(0), sizeof(gapBondRec_t), &bond_info);  /*获取主机MAC地址并打印*/
    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);
}

在定向广播开启1.28后,设备会停止广播,此时进入超时时间,可以手动选择开启定向广播或者通用广播事件。如果在timeout处调用使能广播,则广播类型不会被更改,此时会进入到1.28s的周期性定向广播中。

posted @ 2023-04-05 13:46  SweetTea_lllpc  阅读(1876)  评论(2编辑  收藏  举报