【沁恒蓝牙开发】主机-筛选广播名主动发起连接

文章目录

接着上文,通过过滤广播名获取到目标设备的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;
    
    //略。。。。。        
}
相关推荐
Dev_XH36 分钟前
【成品设计】基于CH32H417的CH32H417AIOT家庭微电网
单片机·嵌入式硬件·物联网·ai
国科安芯1 小时前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射
心仪久了会沦陷2 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
国科安芯3 小时前
算力上天之后的电与静:星上边缘计算载荷带外管理网络的低功耗调度与辐射容错
网络·人工智能·嵌入式硬件·安全·边缘计算·低轨卫星·商业航天
t13970185 小时前
MPPT 和 PWM 有什么区别?小功率太阳能供电到底该选哪个
嵌入式硬件·物联网
Severus_black6 小时前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
en.en..6 小时前
STM32入门最佳学习顺序(寄存器→标准库→HAL库)
单片机·嵌入式硬件
Good白10198 小时前
嵌入式:1.嵌入式入门|初识嵌入式、处理器、ARM与STM32
arm开发·stm32·嵌入式硬件
小李不想当小白8 小时前
HAL库之UART(STM32 HAL库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
Dev_XH8 小时前
【成品设计】基于物联网的旅游生态农业互动系统
stm32·单片机·嵌入式硬件·物联网·旅游