蓝牙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);
}
三、通过设备名称建立连接
- 默认通过MAC地址建立连接,修改为通过设备名称建立连接;
- 先获取到扫描应答包中的设备名称,然后跟内部存放的设备名称通过strstr对比;
- 对比成功再获取到该设备的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);
即可建立连接。
注意:如出现未比对设备名称即可建立连接,查看是否搜索到扩展广播或者定向广播,例程中或者这2处广播也进行了发起连接操作,屏蔽即可。