文章目录
接着上文,通过过滤广播名获取到目标设备的MAC地址了,后续就可以通过获取到的MAC地址主动发起连接。
沁恒蓝牙开发(CH585)7、蓝牙主机开发-通过广播名获取MAC
备注:通过匹配广播的固定的偏移的数据,这样的优点是匹配较快;确定是从机广播数据一旦改变偏移地址就不能匹配了,但是产品量产后通常不会更改了,所以使用匹配固定偏移的做法。
一、设计思路
①在广播扫描回调内 不断的匹配目标广播名
②如果匹配失败,在广播扫描完成事件内,再次开启广播扫描
③如果匹配通过后 停止扫描、发起连接、开启连接超时事件
二、功能块介绍
①在广播扫描回调内 不断的匹配目标广播名
c
PRINT ("sacn len = %02d ", pEvent->deviceInfo.dataLen);
for (int i, j = 0; i < pEvent->deviceInfo.dataLen; i++) {
PRINT (" %02x", pEvent->deviceInfo.pEvtData[i]);
}
PRINT (" \n");
char device_name[] = {'C', 'H', '5', '8', '5'};
if (((memcmp (&device_name[0], &pEvent->deviceInfo.pEvtData[13], sizeof (device_name))) == 0)&&(bond_cnt==0)){
PRINT ("----- MAC %02X %02X %02X %02X %02X %02X \n", pEvent->deviceInfo.addr[5],pEvent->deviceInfo.addr[4],pEvent->deviceInfo.addr[3],pEvent->deviceInfo.addr[2],pEvent->deviceInfo.addr[1],pEvent->deviceInfo.addr[0]);
②开启广播扫描
c
PRINT("Device not found...\n");
centralScanRes = 0;
GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST);
PRINT("Discovering...\n");
③停止扫描、发起连接、开启连接超时事件
c
GAPRole_CentralCancelDiscovery();
GAPRole_CentralEstablishLink (0, 0, pEvent->deviceInfo.addrType, pEvent->deviceInfo.addr);
// Start establish link timeout event
tmos_start_task (centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);
三、完整代码
c
static uint8_t device_found=0;
static void centralEventCB(gapRoleEvent_t *pEvent)
{
switch(pEvent->gap.opcode)
{
//略。。。。。
case GAP_DEVICE_INFO_EVENT: {
PRINT ("sacn len = %02d ", pEvent->deviceInfo.dataLen);
for (int i, j = 0; i < pEvent->deviceInfo.dataLen; i++) {
PRINT (" %02x", pEvent->deviceInfo.pEvtData[i]);
}
PRINT (" \n");
char device_name[] = {'C', 'H', '5', '8', '5'};
if (((memcmp (&device_name[0], &pEvent->deviceInfo.pEvtData[13], sizeof (device_name))) == 0)&&(bond_cnt==0)){
PRINT ("----- MAC %02X %02X %02X %02X %02X %02X \n", pEvent->deviceInfo.addr[5],pEvent->deviceInfo.addr[4],pEvent->deviceInfo.addr[3],pEvent->deviceInfo.addr[2],pEvent->deviceInfo.addr[1],pEvent->deviceInfo.addr[0]);
device_found = 1;//连接标志位
GAPRole_CentralCancelDiscovery();
GAPRole_CentralEstablishLink (0, 0, pEvent->deviceInfo.addrType, pEvent->deviceInfo.addr);
// Start establish link timeout event
tmos_start_task (centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);
PRINT ("Connecting...\n");
}
} break;
case GAP_DEVICE_DISCOVERY_EVENT:
{
if(!device_found)//确认连接,就不再扫描广播
{
PRINT("Device not found...\n");
centralScanRes = 0;
GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST);
PRINT("Discovering...\n");
}
}
break;
//略。。。。。
}