CH58X/CH59X通过设备名称主动发起连接

一、引言

一般主机通过从机的MAC地址于从机进行连接。但是有些场景主机并不知道从机的MAC地址是多少,但是设备名称是固定的,我们可以通过设备名称去发起连接。

二、原理

通过设备名称去连接本质上还是通过MAC地址去发起连接,扫描到设备之后获取对应广播包的内容然后与设备名称进行如果是需要连接的设备。再去获取对应的

MAC地址,获取之后记录下来再去发起连接。

三、实现

uint8_t name_filter[] = "PH000000068177";

BOOL central_scan_adv_handler( gapDeviceInfoEvent_t *info) {

    uint8_t *adv_data = info->pEvtData;
    uint8_t adv_length = info->dataLen;

    //uint8_t name_buf[32];
    uint8_t *p_name;
    uint8_t name_len;

    volatile uint8_t DataLength;
    volatile uint8_t New_ADStructIndex = 0;
    volatile uint8_t AD_Length = 0;
    volatile uint8_t AD_Type;
    DataLength = adv_length;
    while(DataLength) {
        New_ADStructIndex += AD_Length;
        // DATA FORMAT : Length + AD Type + AD Data
        //AD_Length = pData->pEvtData[pData->dataLen - DataLength];
        AD_Length = adv_data[adv_length - DataLength];
        //AD_Type = pData->pEvtData[New_ADStructIndex+1];
        AD_Type = adv_data[New_ADStructIndex+1];
        //PRINT("AD TYPE:%02x,ad_length:%02x\n",AD_Type,AD_Length);
        if(AD_Length<2 || AD_Length>0x1f) {
            break;
        }

        switch(AD_Type) {

            break;
}
#if 1 case GAP_ADTYPE_LOCAL_NAME_SHORT: case GAP_ADTYPE_LOCAL_NAME_COMPLETE: name_len = MIN(AD_Length,30); name_len -= 1; p_name = &adv_data[New_ADStructIndex+2+0]; if(name_len < (sizeof(name_filter) - 1)) { return 0; } if(tmos_memcmp(p_name, name_filter, sizeof(name_filter) - 1)) { hex_dump(p_name,name_len); return 1; } break; #endif default: break; } AD_Length++; DataLength -= AD_Length; } return 0; }
        case GAP_DEVICE_INFO_EVENT:
        {
            // Add device to list
            //centralAddDeviceInfo(pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType);


            if(0 != central_scan_adv_handler(&pEvent->deviceInfo)) {
                GAPRole_CentralCancelDiscovery();
                tmos_memcpy(record_config.target_mac_addr,pEvent->deviceInfo.addr,6);
                record_config.target_mac_type = pEvent->deviceInfo.addrType;
                record_config.target_addr_valid = 1;

                PRINT("addr type %02x\r\n",record_config.target_mac_type);

              }
                //record_update(&record_config);


        }
        break;
      case GAP_DEVICE_DISCOVERY_EVENT:
        {
            if(record_config.target_addr_valid){
                GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,
                                             DEFAULT_LINK_WHITE_LIST,
                                             record_config.target_mac_type,
                                             record_config.target_mac_addr);


                hex_dump(record_config.target_mac_addr, 6);

                tmos_start_task(centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);
                PRINT("Connecting1...\n");
            }

以上仅是学习分享

如有错漏请指正

posted @ 2025-02-07 18:57  小舟从此逝_1  阅读(157)  评论(0)    收藏  举报