CH58x/CH59x不同类型广播使用

前言:

  在日常使用的时候我们用到的广播基本就是普通从机广播,在有特殊使用场景的时候我们可能会用到定向广播和拓展广播。本次对使用对定向广播和拓展广播。

一:定向广播

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

attention:

使用定向广播时只有主机PeerAddrDef中存有从机的mac地址的主机才可以扫描到,其他主机设备是无法搜索的。

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

代码实现:

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);
}

主机扫描到对应的直连广播的分支里:

        case GAP_DIRECT_DEVICE_INFO_EVENT:
        {
            // Display device addr
            PRINT("Recv direct adv \n");
            // Add device to list
            centralAddDeviceInfo(pEvent->deviceDirectInfo.addr, pEvent->deviceDirectInfo.addrType);
        }
        break;

 二:拓展广播

 蓝牙5.0把广播信道抽象为两类,一种叫主广播信道(primary advertisement channels),工作在37,38,39三个信道中,蓝牙4.0的广播使用的都是主广播信道,另一种叫第二广播信道(Secondary Advertising Packets),工作在0–36信道中,这是蓝牙5.0新增的。

 拓展广播结构如下图所示:

 

代码实现:

static uint8_t advertData_ext[] = {
        0x12, // length of this data
        GAP_ADTYPE_LOCAL_NAME_COMPLETE,
        'A','B','C','D','E','F',' ','P','e','r','i','p','h','e','r','a','l',
        0x40,
        GAP_ADTYPE_MANUFACTURER_SPECIFIC,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03
};
 
static uint8_t scanrspData_ext[] = {
        0x12, // length of this data
        GAP_ADTYPE_LOCAL_NAME_COMPLETE,
        'A','B','C','D','E','F',' ','P','e','r','i','p','h','e','r','a','l',
        0x40,
        GAP_ADTYPE_MANUFACTURER_SPECIFIC,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09
};
 
void Peripheral_Init(){
    {   //扩展广播...
        uint8 adv_type;
        adv_type = GAP_ADTYPE_EXT_CONN_UNDIRECT; //可选择非定向的其他类型,这里为举例
 
        if(adv_type == GAP_ADTYPE_EXT_SCAN_UNDIRECT)
        {
            printf("scan\n");
            GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &adv_type);
            GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof( scanrspData_ext ), scanrspData_ext ); //非定向扫描扩展需使用扫描数据
        }
        else if(adv_type == GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT)
        {
            printf("no con no scan\n");
            GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &adv_type);
            GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof( advertData_ext ), advertData_ext ); //非定向不可扫描不可连接扩展使用广播数据
        }
        else if(adv_type == GAP_ADTYPE_EXT_CONN_UNDIRECT)
        {
            printf("con\n");
            GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &adv_type);
            GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof( advertData_ext ), advertData_ext ); //非定向可连接扩展需使用广播数据
        }
    }
}

主机扫描到对应的设备在这个分支:

      case GAP_EXT_ADV_DEVICE_INFO_EVENT:
        {
            // Display device addr
            PRINT("Recv ext adv \n");
            // Add device to list
            centralAddDeviceInfo(pEvent->deviceExtAdvInfo.addr, pEvent->deviceExtAdvInfo.addrType);
        }
        break;

注意扫描的主机设备同样需要支持BLE5.0及以上。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

 

posted @ 2025-03-31 18:49  小舟从此逝_1  阅读(124)  评论(0)    收藏  举报