蓝牙BLE主机Central讲解一(建立连接)

一、根据MAC连接

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

即在默认例程的central.c的如下位置:

// Peer device address
static uint8_t PeerAddrDef[B_ADDR_LEN] = {0x02, 0x08, 0x05, 0xE4, 0xC2, 0x84};

确保从机的MAC为上面的MAC则可进行连接。

二、直接连接无扫描

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

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

①取消扫描,或者将启动扫描的函数手动屏蔽:

GAPRole_CentralCancelDiscovery();  //取消扫描函数

GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE,  //开始扫描的函数,central例程总共有4处,手动屏蔽
                              DEFAULT_DISCOVERY_ACTIVE_SCAN,
                              DEFAULT_DISCOVERY_WHITE_LIST);

可以查看主机是否获取到周围的MAC地址,如果调用了取消扫描函数,仍然可以获取到MAC地址,说明代码里面又开启了扫描,需要手动关闭。

②进行直接发起连接

GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,
                    DEFAULT_LINK_WHITE_LIST,
                    centralDevList[i].addrType,
                    centralDevList[i].addr);

Demo参考:

    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";                             //输入待连接的从机名称
char *pbuf = NULL;
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;

centralAddDeviceInfo函数的最后添加tmos_memcpy(PeerAddrDef, centralDevList[centralScanRes - 1].addr, 6);

即可建立连接。

附录:

sys/Central_停止扫描.zip at main · SweeetTeea/sys (github.com)

posted @ 2023-09-20 17:01  SweetTea_lllpc  阅读(397)  评论(0编辑  收藏  举报