【BLE】CC2541之设置出厂时的配对密码

本篇博文最后修改时间:2016年12月29日,11:37。


一、简介

本文以SimpleBLEPeripheral工程为例,介绍如何设置出厂时的配对密码。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件: IAR 8.20.2

硬件平台: Smart RF开发板(主芯片CC2541)

手机型号: 小米4S

安卓版本:安卓5.1

安卓app:TruthBlue


三、版权声明

博主:甜甜的大香瓜

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

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

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、实验前提

1、在进行本文步骤前,请先 阅读以下博文:
1)《 CC2541之SNV 》: http://blog.csdn.net/feilusia/article/details/50190859

2、在进行本文步骤前,请先实现以下博文:

1)《CC2541之配对与绑定》:http://blog.csdn.net/feilusia/article/details/50212945

五、实验步骤

1、添加头文件(simpleBLEPeripheral.c中

#include "osal_snv.h" 

2、添加宏( simpleBLEPeripheral.c中
//snv使用
#define GUA_SNV_PASSWORD_READ           0x00
#define GUA_SNV_PASSWORD_WRITE          0x01
#define GUA_SNV_PASSWORD_ID             0x81

3、添加密码读取与设置的函数
1)定义密码读取与设置的函数simpleBLEPeripheral.c中
//******************************************************************************                  
//name:             GUA_SNV_Password                 
//introduce:        从SNV读取或更新连接密码               
//parameter:        nGUA_WriteReadFlag:SNV_PASSWORD_READ or SNV_PASSWORD_WRITE     
//                  npGUA_Password:密码首地址
//                  nGUA_Len:密码长度
//return:           none              
//author:           甜甜的大香瓜                       
//email:            897503845@qq.com           
//QQ group          香瓜BLE之CC2541(127442605)                        
//changetime:       2016.12.13                        
//******************************************************************************
static void GUA_SNV_Password(uint8 nGUA_WriteReadFlag, uint8 *npGUA_Password, uint8 nGUA_Len)
{
  uint8 nGUA_Ret;
  uint32 nGUA_Default_Password;
  
  //从SNV读密码
  if(nGUA_WriteReadFlag == GUA_SNV_PASSWORD_READ)
  {
    nGUA_Ret = osal_snv_read(GUA_SNV_PASSWORD_ID, nGUA_Len, npGUA_Password);

    //如果第一次读取失败,则说明没有写过密码,是出厂的设备。因此在这里设置为出厂密码。
    if(nGUA_Ret == NV_OPER_FAILED)
    {
      //未保存过,设置出厂密码123456
      nGUA_Default_Password = 123456;
      
      //将出厂密码写入snv中
      osal_snv_write(GUA_SNV_PASSWORD_ID, sizeof(nGUA_Default_Password), (uint8 *)(&nGUA_Default_Password)); 
        
      //读出密码
      nGUA_Ret = osal_snv_read(GUA_SNV_PASSWORD_ID, nGUA_Len, npGUA_Password);
    } 
  }
  //写新的密码到SNV  
  else if(nGUA_WriteReadFlag == GUA_SNV_PASSWORD_WRITE)
  {
    //写进新的密码
    osal_snv_write(GUA_SNV_PASSWORD_ID, nGUA_Len, npGUA_Password);
    
    //读出密码
    nGUA_Ret = osal_snv_read(GUA_SNV_PASSWORD_ID, nGUA_Len, npGUA_Password); 

    //清除已绑定的设备信息
    GAPBondMgr_SetParameter(GAPBOND_ERASE_ALLBONDS, 0, NULL);    
  } 
}

2) 声明密码读取与设置的函数(simpleBLEPeripheral.c中)
static void GUA_SNV_Password(uint8 nGUA_WriteReadFlag, uint8 *npGUA_Password, uint8 nGUA_Len);

4、修改密码回调函数 (替换simpleBLEPeripheral.c中的GUA_ProcessPasscodeCB)
//******************************************************************************                  
//name:             GUA_ProcessPasscodeCB                 
//introduce:        密码回调函数               
//parameter:        deviceAddr:设备地址       
//                  connectionHandle:连接句柄 
//                  uiInputs:
//                  uiOutputs:
//return:           none              
//author:           甜甜的大香瓜                       
//email:            897503845@qq.com           
//QQ group          香瓜BLE之CC2541(127442605)                        
//changetime:       2016.12.13                        
//******************************************************************************                  
static void GUA_ProcessPasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs)  
{  
  //读密码
  GUA_SNV_Password(GUA_SNV_PASSWORD_READ, (uint8 *)(&gGUA_Password), sizeof(gGUA_Password));
  
  //发送密码响应给主机
  GAPBondMgr_PasscodeRsp(connectionHandle, SUCCESS, gGUA_Password);
}  

5、定义一个密码缓存区(simpleBLEPeripheral.c中)
static uint32 gGUA_Password = 0;                                        //密码存放的缓冲区

6、应用层中初始化(simpleBLEPeripheral.c的SimpleBLEPeripheral_Init中)
  //上电读取密码
  GUA_SNV_Password(GUA_SNV_PASSWORD_READ, (uint8 *)(&gGUA_Password), sizeof(gGUA_Password));

六、注意事项

手机可能缓存了之前的代码(在更新过CC2541的代码之后,都需要清除手机端的缓存!!!),因此要清除缓存,清除缓存的方法如下:

方法一:关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
方法二:手机重启。


七、实验结果

仿真并全速运行,连接时需要输入密码,也就是本文中设置的出厂密码123456。配对过程如下图:


配对之后,连接时的所有读写操作都能正常而不受限制。
因此,实验成功。







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值