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

本篇博文最后修改时间: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、从机再次上电,又可实现自动连接。


因此,实验成功。




  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值