【BLE-CC2640】CC2640之配对与绑定

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


一、简介

本文以SimpleBLEPeripheral工程为例,介绍如何在工程中使用配对与绑定


二、实验平台

协议栈版本:ble_cc26xx_2_01_00_44423

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

硬件平台:CC26xxDK开发板

仿真器:XDS100V3(香瓜)

手机平台:小米4S

APP:BLE读写器


版权声明

博主:甜甜的大香瓜

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

原文地址: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、在进行本文步骤前,请先 阅读 以下博文:
1)《CC2541之配对与绑定》:http://blog.csdn.net/feilusia/article/details/50212945

2、在进行本文步骤前,请先 实现以下博文:
1)《CC2640之按键》:http://blog.csdn.net/feilusia/article/details/52221525


五、实验步骤
1、添加一个绑定与否的状态变量(simpleBLEPeripheral.c)
//GUA
typedef enum  
{  
  PAIRSTATUS_PAIRED = 0,  
  PAIRSTATUS_NO_PAIRED,  
}PAIRSTATUS;  
static PAIRSTATUS gPairStatus = PAIRSTATUS_NO_PAIRED;//配对状态,默认是没配对  

2、修改绑定初始化(simpleBLEPeripheral.c的SimpleBLEPeripheral_Init函数中)
  // Setup the GAP Bond Manager
  {
    uint32_t passkey = 0; // passkey "000000"
    //uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
    uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;  
    uint8_t mitm = TRUE;
    uint8_t ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
    uint8_t bonding = TRUE;

    GAPBondMgr_SetParameter(GAPBOND_DEFAULT_PASSCODE, sizeof(uint32_t),
                            &passkey);
    GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);
    GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm);
    GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
    GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding);
  }
注:

1)GAPBOND_PAIRING_MODE_WAIT_FOR_REQ

这个宏是表示等待对方发起配对请求的模式,如果主从机都是这种模式,则双方都不会发起配对请求。

因此主从机的其中一方必须要配置成GAPBOND_PAIRING_MODE_INITIATE方可进行配对。

从机中往往有机密数据,因此从机端需要配置成GAPBOND_PAIRING_MODE_INITIATE,否则如果配对请求的主动权交予主机,主机一旦不发起请求,那也就无配对过程,导致从机的数据公之于众了。


2)GAPBOND_IO_CAP_DISPLAY_ONLY

这个宏是只显示密码,将密码显示在LCD上给主机看,主机也就知道密码了。

如果设备有按键可以输入密码,也可以选择GAPBOND_IO_CAP_KEYBOARD_ONLY。


3、注册回调函数(simpleBLEPeripheral.c中)

1)注册回调函数

// GAP Bond Manager Callbacks
static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs =
{
  GUA_PasscodeCB,                       //密码回调  
  GUA_PairStateCB                       //绑定状态回调  
};

2)定义配对相关函数、绑定相关函数
//******************************************************************************              
//name:             GUA_PasscodeCB             
//introduce:        配对回调           
//parameter:        none  
//return:           none           
//author:           甜甜的大香瓜                   
//email:            897503845@qq.com       
//QQ group          香瓜BLE之CC2640(557278427)                    
//changetime:       2016.09.01                      
//******************************************************************************    
static void GUA_PasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs)  
{
  // Note:  the only parameter used here is connectionHandle, but this has 
  // already been obtained by gapConnHandle so the argument is not stored.

  // Queue the event.
  SimpleBLEPeripheral_enqueueMsg(SBP_GUA_PASSCODE_EVT, 0, NULL);
}

//******************************************************************************              
//name:             GUA_PasscodeEvt             
//introduce:        配对处理           
//parameter:        none  
//return:           none           
//author:           甜甜的大香瓜                   
//email:            897503845@qq.com       
//QQ group          香瓜BLE之CC2640(557278427)                    
//changetime:       2016.09.01                      
//****************************************************************************** 
static void GUA_PasscodeEvt(uint16 connectionHandle)  
{  
  uint32  passcode;  

  //设置密码
  passcode = 456890;          
    
  //发送密码响应给主机  
  GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode ); 
}  

//******************************************************************************              
//name:             GUA_PairStateCB             
//introduce:        绑定回调           
//parameter:        none  
//return:           none           
//author:           甜甜的大香瓜                   
//email:            897503845@qq.com       
//QQ group          香瓜BLE之CC2640(557278427)                    
//changetime:       2016.09.01                      
//******************************************************************************  
static void GUA_PairStateCB(uint16 connHandle, uint8 state, uint8 status)  
{
  uint8_t *pData;
  
  // Note: connHandle is not used, so the variable is not stored.
  
  // Allocate message data
  if ((pData = ICall_malloc(sizeof(uint8_t))))
  {
    *pData = status;
  
    // Queue the event.
    SimpleBLEPeripheral_enqueueMsg(SBP_GUA_PAIRING_STATE_EVT, state, pData);
  } 
}

//******************************************************************************              
//name:             GUA_PairStateEvt             
//introduce:        绑定处理          
//parameter:        none  
//return:           none           
//author:           甜甜的大香瓜                   
//email:            897503845@qq.com       
//QQ group          香瓜BLE之CC2640(557278427)                    
//changetime:       2016.09.01                      
//****************************************************************************** 
static void GUA_PairStateEvt(uint8_t state, uint8_t status)  
{  
  //主机发起连接,会进入开始配对状态  
  if ( state == GAPBOND_PAIRING_STATE_STARTED )  
  {   
    gPairStatus = PAIRSTATUS_NO_PAIRED;  
  }  
    
  //当主机提交密码后,会进入配对完成状态    
  else if ( state == GAPBOND_PAIRING_STATE_COMPLETE )  
  {  
    //配对成功  
    if ( status == SUCCESS )      
    {  
      gPairStatus = PAIRSTATUS_PAIRED;  
    }  
      
    //已配对过  
    else if(status == SMP_PAIRING_FAILED_UNSPECIFIED)  
    {        
      gPairStatus = PAIRSTATUS_PAIRED;  
    }  
      
    //配对失败  
    else  
    {  
      gPairStatus = PAIRSTATUS_NO_PAIRED;  
    }  
      
    //配对失败则断开连接  
    if(gPairStatus == PAIRSTATUS_NO_PAIRED)  
    {  
      GAPRole_TerminateConnection();  
    }  
  }  
  else if ( state == GAPBOND_PAIRING_STATE_BONDED )  
  {  
    if ( status == SUCCESS )  
    {  

    }  
  }  
}  

3)声明回调函数
//GUA
static void GUA_PasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs);  
static void GUA_PairStateCB(uint16 connHandle, uint8 state, uint8 status);  
static void GUA_PairStateEvt(uint8_t state, uint8_t status);  
static void GUA_PasscodeEvt(uint16 connectionHandle);  

4、修改应用层消息处理
1)添加事件宏(simpleBLEPeripheral.c中)
//GUA
#define SBP_GUA_PASSCODE_EVT                  0x0100    //配对事件
#define SBP_GUA_PAIRING_STATE_EVT             0x0200    //绑定事件

2)添加事件处理 (替换 simpleBLEPeripheral.c中的SimpleBLEPeripheral_processAppMsg函数
static void SimpleBLEPeripheral_processAppMsg(sbpEvt_t *pMsg)
{
  switch (pMsg->hdr.event)
  {
    case SBP_STATE_CHANGE_EVT:
      SimpleBLEPeripheral_processStateChangeEvt((gaprole_States_t)pMsg->
                                                hdr.state);
      break;

    case SBP_CHAR_CHANGE_EVT:
      SimpleBLEPeripheral_processCharValueChangeEvt(pMsg->hdr.state);
      break;

    // Passcode CB event.
    case SBP_GUA_PASSCODE_EVT:
      GUA_PasscodeEvt(0);
      break;
      
    // Pairing state CB event.
    case SBP_GUA_PAIRING_STATE_EVT:
      GUA_PairStateEvt(pMsg->hdr.state, *pMsg->pData);
      
      ICall_free(pMsg->pData);
      break;
     
    default:
      // Do nothing.
      break;
  }
}

5、修改消息传递的相关函数(simpleBLEPeripheral.c中
1)替换消息传递函数(simpleBLEPeripheral.c中SimpleBLEPeripheral_enqueueMsg函数
static void SimpleBLEPeripheral_enqueueMsg(uint8_t event, uint8_t state, uint8_t *pData)
{
  sbpEvt_t *pMsg;

  // Create dynamic pointer to message.
  if ((pMsg = ICall_malloc(sizeof(sbpEvt_t))))
  {
    pMsg->hdr.event = event;
    pMsg->hdr.state = state;
    pMsg->pData = pData;
    
    // Enqueue the message.
    Util_enqueueMsg(appMsgQueue, sem, (uint8*)pMsg);
  }
}

2)修改声明
static void SimpleBLEPeripheral_enqueueMsg(uint8_t event, uint8_t state, uint8_t *pData);

3)修改剩余相关函数
在所有调用到 SimpleBLEPeripheral_enqueueMsg函数的协议栈原有代码中,添加第三个参数NULL,如:
  SimpleBLEPeripheral_enqueueMsg(SBP_STATE_CHANGE_EVT, newState, NULL);
在此不一一列举, 可rebuild all后自行修改。

4)替换结构体sbpEvt_t
// App event passed from profiles.
typedef struct
{
  appEvtHdr_t hdr;  // event header.
  uint8_t *pData;  // Event data.  
} sbpEvt_t;
为传递绑定状态而增加pData数据。

六、实验结果
用手机app连接,第一次弹窗选中“配对”,第二次弹窗输入“456890”密码,即可通信正常使用。
因此,实验成功。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值