CH58xCentral杂谈

发布时间 2023-09-20 17:08:44作者: SweetTea_lllpc

一、直接连接无扫描

CH58x芯片作为主机建立连接是通过MAC地址方式,即先搜索周围从机的MAC,然后与内部保存的MAC比对并决定是否建立连接。

可以省略搜索周围从机而直接根据MAC发起连接,通过GAPRole_CentralEstablishLink即可。

    if(events & EstablishLink_EVT)
    {
        printf("establish\n");
        if(linkflag == 1){
          linkflag = 0;
          printf("link\n");
          GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,
                                       DEFAULT_LINK_WHITE_LIST,
                                       0,
                                       PeerAddrDef);
          tmos_start_task(centralTaskId, Judge_EVT, 4800);
        }
        tmos_start_task(centralTaskId, EstablishLink_EVT, 3200);  
        return (events ^ EstablishLink_EVT);
    }

    if(events & Judge_EVT)
    {
      if(!connectflag){           //2s未建立连接,则停止直接连接,否则功耗会很高
        GAPRole_TerminateLink(INVALID_CONNHANDLE);
      }
        return (events ^ Judge_EVT);
    }

二、通过设备名称建立连接

  1. 默认通过MAC地址建立连接,修改为通过设备名称建立连接;
  2. 先获取到扫描应答包中的设备名称,然后跟内部存放的设备名称通过strstr对比;
  3. 对比成功再获取到该设备的MAC地址并建立连接。
static uint8_t PeerAddrDef[B_ADDR_LEN] = {0x02, 0x02, 0x03, 0xE4, 0xC2, 0x84};      //不可屏蔽,后面会重新赋值用到
//static uint8_t PeerDeviceName[] = {'O','P','P','O','\0'};          //使用的是strstr,对比字符串,所以需要在最后加上\0表示结束
static uint8_t* PeerDeviceName = "OPPO";                             //输入待连接的从机名称
case GAP_DEVICE_INFO_EVENT:
{
    if((pbuf = strstr(pEvent->deviceInfo.pEvtData, PeerDeviceName)) != 0)           //对比扫描到的名称
    {
        PRINT("pbuf = %s\r\n", pbuf);
        centralAddDeviceInfo(pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType);
    }
}
break;