【BLE-CC2640】CC2640之主机端自动连接

    xiaoxiao2023-03-24  4

    本篇博文最后修改时间:2017年06月02日,06:54。

    一、简介

    本文以SimpleBLECentral工程为例,介绍如何上电自动扫描、连接指定mac的从机设备,从机掉电后主机端又能自动重连

    二、实验平台

    协议栈版本:ble_cc26xx_2_01_00_44423

    编译软件:IAR Embedded Workbench for ARM Version 7.40

    硬件平台:两块CC26xxDK开发板

    仿真器:XDS100V3(香瓜)

    版权声明

    博主:甜甜的大香瓜

    声明:喝水不忘挖井人,转载请注明出处。

    原文地址:http://blog.csdn.NET/feilusia

    联系方式:897503845@qq.com

    香瓜BLE之CC2541群:127442605

    香瓜BLE之CC2640群:557278427

    香瓜BLE之Android群:541462902

    香瓜单片机之STM8/STM32群:164311667 香瓜单片机之Linux群:512598061 香瓜单片机之职场交流群:450154342 甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i 四、 实验前提 1、在进行本文步骤前,请先 阅读 以下博文: 2、在进行本文步骤前,请先 实现以下博文:

    1)《CC2640之OLED》:http://blog.csdn.net/feilusia/article/details/52686966

    2) CC2640之自定义周期事件 》: http://blog.csdn.net/feilusia/article/details/52338127

    五、基础知识

    1、主机端上电自动连接的实现原理

    答:香瓜在本实验中,一上电便启动一个6S的周期扫描事件,而扫描时长是4S。

    扫描到设备后对mac进行比对,如果与香瓜预设的mac一致,则连接;否则再次启动周期扫描事件。

    2、连接断开后,主机端自动重连的实现原理

    答:无论从机是主动断开还是掉电式断开,主机端一旦检测到连接断开,即会进入断开连接的回调函数。在此处再次启动周期扫描事件。

    六、实验步骤

    1、在“实验前提”的基础上,修改几处代码

    1)添加主机工程使用的定时回调函数

    定义定时回调函数SimpleBLECentral.c中)

    //****************************************************************************** //name: GUA_clockHandler //introduce: 香瓜的定时回调函数 //parameter: none //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜BLE之CC2640(557278427) //changetime: 2016.09.28 //****************************************************************************** static void GUA_clockHandler(UArg arg) { // Store the event. events |= arg; // Wake up the application. Semaphore_post(sem); } 声明定时回调函数SimpleBLECentral.c中)

    static void GUA_clockHandler(UArg arg); 2)修改香瓜定时事件初始化SimpleBLECentral.c的SimpleBLECentral_Init中)

    //初始化定时器 Util_constructClock(&GUA_periodicClock, GUA_clockHandler, SBP_GUA_PERIODIC_EVT_PERIOD, 0, false, SBP_GUA_PERIODIC_EVT); 也就是将新写的GUA_clockHandler函数,作为参数传给Util_constructClock。

    3)修改香瓜定时事件的时间SimpleBLECentral.c中)

    //GUA #define SBP_GUA_PERIODIC_EVT_PERIOD 6000 //香瓜定时时间 修改为6S,因为扫描时间为4S,因此本周期要比4S长一些。

    4)修改香瓜定时事件的处理代码(SimpleBLECentral.c的SimpleBLECentral_taskFxn函数

    //香瓜周期事件 if (events & SBP_GUA_PERIODIC_EVT) { events &= ~SBP_GUA_PERIODIC_EVT; //再次启动定时器 //Util_startClock(&GUA_periodicClock); //香瓜周期处理函数 GUA_performPeriodicTask(); } 注意,之所以在这里注释掉再次启动定时器的步骤,是因为在GUA_performPeriodicTask函数中要判断是否要再次启动。

    2、添加周期扫描的处理代码(SimpleBLECentral.c的GUA_performPeriodicTask函数

    //****************************************************************************** //name: GUA_performPeriodicTask //introduce: 周期事件的处理函数 //parameter: none //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜BLE之CC2640(557278427) //changetime: 2016.09.28 //****************************************************************************** static void GUA_performPeriodicTask(void) { uint8_t bGUA_PeripheralMac[B_ADDR_LEN] = {0xd9, 0x1b, 0x62, 0x4c, 0x99, 0xb4}; //香瓜的从机mac:b4994c621bd9 //非连接状态 if(state != BLE_STATE_CONNECTED) { //当前没有扫描、扫描已结束,则开启扫描 if(scanningStarted == FALSE) { //扫描到了设备,判断是否有我们想连接的设备,如果有则连接并退出 if(scanRes > 0) { uint8_t addrType; uint8_t *peerAddr; //判断是否有我们想连接的设备 for(uint8_t i = 0; i < scanRes; i++) { //当前扫描到的设备mac,与我们想连接的设备mac相匹配,连接 if(memcmp(bGUA_PeripheralMac, devList[i].addr , B_ADDR_LEN) == 0) { peerAddr = devList[i].addr; addrType = devList[i].addrType; state = BLE_STATE_CONNECTING; GAPCentralRole_EstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE, DEFAULT_LINK_WHITE_LIST, addrType, peerAddr); LCD_WRITE_STRING("Connecting", LCD_PAGE2); LCD_WRITE_STRING(Util_convertBdAddr2Str(peerAddr), LCD_PAGE3); LCD_WRITE_STRING("", LCD_PAGE4); return; } } } //没有扫描到想要的设备,继续扫描 { //修改为在扫描的状态 scanningStarted = TRUE; //清空扫描到的设备数 scanRes = 0; //LCD显示正在扫描 LCD_WRITE_STRING("Discovering...", LCD_PAGE2); LCD_WRITE_STRING("", LCD_PAGE3); LCD_WRITE_STRING("", LCD_PAGE4); //开始扫描 GAPCentralRole_StartDiscovery(DEFAULT_DISCOVERY_MODE, DEFAULT_DISCOVERY_ACTIVE_SCAN, DEFAULT_DISCOVERY_WHITE_LIST); //再次启动定时器 Util_startClock(&GUA_periodicClock); } } } } 在这里一旦扫描到香瓜指定mac的从机设备,即连接。

    3、修改扫描完成的回调代码(SimpleBLECentral_processRoleEvent函数中)

    case GAP_DEVICE_DISCOVERY_EVENT: { // discovery complete scanningStarted = FALSE; // if not filtering device discovery results based on service UUID if (DEFAULT_DEV_DISC_BY_SVC_UUID == FALSE) { // Copy results scanRes = pEvent->discCmpl.numDevs; memcpy(devList, pEvent->discCmpl.pDevList, (sizeof(gapDevRec_t) * scanRes)); } LCD_WRITE_STRING_VALUE("Devices Found", scanRes, 10, LCD_PAGE2); //GUA /* if (scanRes > 0) { LCD_WRITE_STRING("<- To Select", LCD_PAGE3); } */ //GUA // initialize scan index to last device scanIdx = scanRes; } break;将LCD的选择设备提示去除。实现以上步骤,即可实现上电自动扫描连接。

    4、修改断开连接的回调代码(SimpleBLECentral_processRoleEvent函数中)

    case GAP_LINK_TERMINATED_EVENT: { state = BLE_STATE_IDLE; connHandle = GAP_CONNHANDLE_INIT; discState = BLE_DISC_STATE_IDLE; charHdl = 0; procedureInProgress = FALSE; // Cancel RSSI reads SimpleBLECentral_CancelRssi(pEvent->linkTerminate.connectionHandle); LCD_WRITE_STRING("Disconnected", LCD_PAGE2); LCD_WRITE_STRING_VALUE("Reason:", pEvent->linkTerminate.reason, 10, LCD_PAGE3); LCD_WRITE_STRING("", LCD_PAGE4); //清空扫描到的设备数 scanRes = 0; //启动定时器 Util_startClock(&GUA_periodicClock); } break;注意两点:

    1、要在这里清空设备数,否则周期事件中会误认为扫描到设备了。

    2、启动定时器不需要再初始化一次定时器,否则定时周期事件会失效。

    七、实验结果

    1、将从机上电广播。

    2、主机仿真全速运行本博客工程,上电6S后启动扫描事件。

    3、4S后扫描结束,显示发现的连接数。

    4、1~2S后连接上了我指定mac的设备,如下图

    5、让从机掉电,等待10S主机端会发现连接断开,然后再次启动6S一次的周期扫描设备。

    注:如果觉得本处的10S时间过长,可通过修改从机端的连接参数:

    // Connection Pause Peripheral time value (in seconds) #define DEFAULT_CONN_PAUSE_PERIPHERAL 1//6

    6、从机再次上电,又可实现自动连接。

    因此,实验成功。

    转载请注明原文地址: https://ju.6miu.com/read-1202321.html
    最新回复(0)