BLE--CC2541的入门之绑定与配对

Posted:   2020-04-10

Status:   Completed

Categories :   CC2541 BLE

Previous:   BLE--CC2541的入门之加密OAD

Next:   BLE--CC2541的入门之特征值


配对与绑定的作用

  • 配对——防止别的设备随意连接
  • 绑定——连接一次后,下次不用输入密码

环境要求

硬件

  • CCDebuger
  • CC2541开发板
  • USB Dongle

软件

设置

修改配对模式

  • 把配对模式从GAPBOND_PAIRING_MODE_WAIT_FOR_REQ改为GAPBOND_PAIRING_MODE_INITIATE

init

  • INITIATE模式是主动请求配对,因从机含有大量数据,未防止泄露应主动配对

回调函数

  • 以下代码均在simpleBLEPeripheral.c文件中操作

声明回调函数

  • 声明回调函数
    1
    2
    
    static void passcodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs);
    static void pairStateCB(uint16 connectionHandle, uint8 state, uint8 status);
    

    defind_cb

  • 函数内参数含义在\Projects\ble\Profiles\Roles\gapbondmgr.htypedef_cb

定义配对状态

  • 定义状态枚举
    1
    2
    3
    4
    5
    
    typedef enum  
    {  
    PAIRSTATUS_PAIRED = 0,  
    PAIRSTATUS_NO_PAIRED,  
    }PAIRSTATUS;  
    
  • 定义变量
    1
    
    PAIRSTATUS gPairStatus;
    

    gPairStatus

密码回调函数

  • 添加密码回调函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    static void passcodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs)
    {
      uint32  passcode;
    #if 0
      uint8   str[7];
      LL_Rand( ((uint8 *) &passcode), sizeof( uint32 ));//产生随机密码
      passcode %= 1000000;
    #else
      passcode = 456890;//固定密码
    #endif
      //在LCD上显示
      if ( uiOutputs != 0 )
      {
    #if (defined HAL_LCD) && (HAL_LCD == TRUE)
          HalLcdWriteString( "Passcode:",  HAL_LCD_LINE_1 );
          HalLcdWriteString( (char *) _ltoa(passcode, str, 10),  HAL_LCD_LINE_2 );
    #endif
      }
      //发送密码请求
      GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );
    }
    

    passCB

配对回调函数

  • 添加配对回调函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    
    static void pairStateCB(uint16 connectionHandle, uint8 state, uint8 status)
    {
      //主机发起连接,会进入开始配对状态
      if ( state == GAPBOND_PAIRING_STATE_STARTED )
      {
    #if (defined HAL_LCD) && (HAL_LCD == TRUE)
          HalLcdWriteString( "Pairing started", HAL_LCD_LINE_1 );
    #endif
          gPairStatus = PAIRSTATUS_NO_PAIRED;
      }
    
      //当主机提交密码后,会进入配对完成状态
      else if ( state == GAPBOND_PAIRING_STATE_COMPLETE )
      {
          //配对成功
          if ( status == SUCCESS )
          {
    #if (defined HAL_LCD) && (HAL_LCD == TRUE)
              HalLcdWriteString( "Pairing success", HAL_LCD_LINE_1 );
    #endif
              gPairStatus = PAIRSTATUS_PAIRED;
          }
    
          //已配对过
          else if(status == SMP_PAIRING_FAILED_UNSPECIFIED)
          {
    #if (defined HAL_LCD) && (HAL_LCD == TRUE)
              HalLcdWriteString( "Paired device", HAL_LCD_LINE_1 );
    #endif
              gPairStatus = PAIRSTATUS_PAIRED;
          }
    
          //配对失败
          else
          {
    #if (defined HAL_LCD) && (HAL_LCD == TRUE)
              HalLcdWriteStringValue( "Pairing fail", status, 10, HAL_LCD_LINE_1 );
    #endif
              gPairStatus = PAIRSTATUS_NO_PAIRED;
          }
    
          //配对失败则断开连接
          if(gPairStatus == PAIRSTATUS_NO_PAIRED)
          {
              GAPRole_TerminateConnection();
          }
      }
      else if ( state == GAPBOND_PAIRING_STATE_BONDED )
      {
          if ( status == SUCCESS )
          {
    #if (defined HAL_LCD) && (HAL_LCD == TRUE)
              HalLcdWriteString( "Bonding success", HAL_LCD_LINE_1 );
    #endif
          }
      }
    }
    

    pairCB

注册回调函数

  • 把原先null修改为回调函数
1
2
 passcodeCB,                     // 密码回调
 pairStateCB                     // 绑定状态回调

regCB

编译工程并下载

  • 用软件SmartRF Flash Programmer通过CC Debugger下载
  • 直接用IAR通过CC Debugger下载也可

验证

  • 手机打开蓝牙软件点击连接会弹出配对请求,如果开发板有屏幕,屏幕上显示配对码
  • 输入配对码,输入456890,连接成功
  • 断开连接重新连接将不再需要配对码 phone LCD
  • 如果配对之后,擦除后重新下载程序了,则需要在手机蓝牙设置删除该设备配对,要不然会导致下次无法连接