本篇博文最后修改时间: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
香瓜单片机之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。配对过程如下图:
配对之后,连接时的所有读写操作都能正常而不受限制。
因此,实验成功。