CC2540 Central与CC2540 Peripheral 密码配对

zz/2024/3/2 11:13:02

照例先扯点别的。
按常理这个其实应该并不难,毕竟BLE配对过程很好理解。但真正做起来的时候总会遇到一点问题。
我卡在拥有输入能力的主机向拥有显示能力而生成密码的从机发送密码回应这个地方上。
找遍文档也没看见Central向Peripheral发送密码回应的函数,最后才发现原来是自己理解错了一些东西——GAPBondMgr_PasscodeRsp这个函数既可以作为从机提交自己设定密码的接口,同时也作为Central向从机发送自己输入的密码的接口。
以下文章对我帮助很大。在此感谢博主的分享精神。

http://blog.csdn.net/happyppdog/article/details/51971545

好,下面开始正式的博文。

参数配置

首先讲解下对Central与Peripheral的配置。

Central:

  // Setup the GAP Bond Manager{uint32 passkey = 0;// 此处默认密码可任意设置uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;//主机相应从机的配对请求uint8 mitm = TRUE;//防止中间人攻击(选用 Passcode、OOB来进行Paring的必须为TRUE)uint8 ioCap = GAPBOND_IO_CAP_KEYBOARD_ONLY;//具有输入能力uint8 bonding = FALSE;//不进行绑定GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof( uint32 ), &passkey );GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof( uint8 ), &pairMode );GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof( uint8 ), &mitm );GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof( uint8 ), &ioCap );GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof( uint8 ), &bonding );}  

Peripheral:

  // Setup the GAP Bond Manager{uint32 passkey = 0; // 此处默认密码可任意设置uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;// 从机发起配对请求uint8 mitm = TRUE;//防止中间人攻击(选用 Passcode、OOB来进行Paring的必须为TRUE)uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;//有显示能力,无输入能力uint8 bonding = FALSE; //不进行绑定GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey );GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );}

至此基础配置就进行完了。

回调函数的配置

无论是Central还是Peripheral,我们都需要配置回调函数 —— gapBondCBs_t simpleBLEPeripheral_BondMgrCBs

这个结构体第一个函数指针为密码相关函数指针,第二个则为配对等状态的函数指针(这个网上很多讲解,不多说了)

在这里我们选用相同密码123456,同时为了简化代码,Central 与 Peripheral的 对应回调函数完全一致。
密码回调函数编写如下:

static void simpleBLEPeripheralPasscodeCB( uint8 *deviceAddr, uint16 connectionHandle,uint8 uiInputs, uint8 uiOutputs )
{uint32  passcode;passcode = 123456;// Send passcode responseGAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );
}

状态回调函数:

static void simpleBLECentralPairStateCB( uint16 connHandle, uint8 state, uint8 status )
{if ( state == GAPBOND_PAIRING_STATE_STARTED ){NPI_WriteTransport("Pairing started\r\n",17);}else if ( state == GAPBOND_PAIRING_STATE_COMPLETE ){if ( status == SUCCESS ){NPI_WriteTransport("Pairing success\r\n",17);gPairStatus = PAIRSTATUS_PAIRED;}else{NPI_WriteTransport("Pairing fail\r\n",14);}}else if ( state == GAPBOND_PAIRING_STATE_BONDED ){if ( status == SUCCESS ){NPI_WriteTransport("Bonding success\r\n",17);}}
}

对于密码回调函数这个我有一点想说。

网络上流行的配对教程等等忽略了一个很重要的问题,如果需要输入密码,那么密码应该从哪里输入、怎么判断是否需要输入密码。

1.密码应该从哪里输入?

你获得密码的途径无所谓,但最后你把密码提交给GAP的最终函数是GAPBondMgr_PasscodeRsp,并且你需要在底层调用密码回调函数的时候就将密码提交上去,延迟太久配对会失败,提示0x17错误(这个跟代码实现有关)。

2.如何判断是否需要输入密码?

判断方法在simpleBLEPeripheralPasscodeCB中的
uint8 uiInputs与uint8 uiOutputs
uiOutputs,这个代表是否输出,或者可以理解为有输出设备(>0代表有设备)
uiInputs,这个代表是否输入,或者是否拥有输入设备(同理 >0代表有设备)
(这两句我自己理解的,有错误欢迎指出)
通过判断uiInputs,即可确定是否需要输入密码。

实验现象

密码正确:

Server is Online
Start Discovering
BLE Central:0x78A5047A502A
Devices Found:1
0x78A5047A4956
Connected.
Device:0x78A5047A4956
Pairing success

密码错误:

Server is Online
Start Discovering
BLE Central:0x78A5047A502A
Devices Found:1
0x78A5047A4956
Connected.
Device:0x78A5047A4956
Pairing fail:4

于密码回调函数中下断点,延迟GAPBondMgr_PasscodeRsp运行,模拟用键盘输入密码:

Server is Online
Start Discovering
BLE Central:0x78A5047A502A
Devices Found:1
0x78A5047A4956
Connected.
Device:0x78A5047A4956
Pairing fail:17

发现失败。
原因我认为可能是下断点让CC2540停摆,其与Peripheral进行底层交流的其他函数也无法执行,导致Peripheral认为超时。

基本就这些。
耽误了三四天时间,希望能帮助后来的人。


http://www.ngui.cc/zz/1568610.html

相关文章

CC2540 内存结构分析

cc2540有4个存储类型:CODE, DATA, XDATA, SFR。 CODE:地址空间占64k,只读。 CODE代码区的Bank选择是通过寄存器FMAP实现的。 CODE代码区的映射方式有两种:第一种是默认的,即CODE地址区域全部映射到FLASH,用…

CC2540和CC2541的区别

德州仪器(TI)宣布推出其最新CC2541蓝牙(Bluetooth)低功耗片上系统(SoC),以充分满足消费类医疗、运动健身、安全、娱乐以及家庭自动化对蓝牙智能传感器的应用需求。当输出功率为1MW时,该SoC在确保稳健RF性能的同时,功耗比TI前代CC2540 SoC降低…

【待更新】【mcu】CC2540 HostTest 调试 记录 学习

文章目录0. env软件硬件1. 简介cc2540简介USB dongle简介BTool基本使用2. HostTest启动流程1. main()概述2. 循环函数(os)3. 其他3. 杂记1. 修改默认BTool初始化参数2. 修改LED灯号用于区分FW3. Bond调试环境 cc2540 及 USB dongle简介 BTool 基本使用 启动流程概述杂记 LED灯号…

CC2540的手机HTML5,实测对比CC2540 BTool和nRF Connect在nRF52840 Dongle的BTool测试

BTool是一个用于蓝牙设备调试的PC软件工具,工作在Central/Master 。它可以让用户通过PC软件同Peripheral/Slave BLE设备之间建立连接。在测试蓝牙模块的直驱功能时,使用BTool可以快速开发模块的功能,缩短研发周期。市面上主流的BTool软件有几…

CC2540 SimpleBLEPeripheral解析

参考链接: c2541 simpleBLEPeripheral工程 应用层协议栈分析 CC2541之SimpleBLEPeripheral程序流程分析 – 01.启动和事件轮询 CC2541之SimpleBLEPeripheral程序流程分析 – 02.App层初始化 CC2541之SimpleBLEPeripheral程序流程分析 – 03.App层事务处理 CC2541之SimpleBLEPe…

CC2540 使用BTool

文章目录一 使用硬件二 使用的软件三 软件使用步骤3.1 选择设备3.2 扫描当前BLE设备3.3 点击建立蓝牙3.3 显示当前BLE提供的服务一 使用硬件 使用 CC2540 制作的dongle。之前购买的蜂网的USB dongle。 二 使用的软件 Dongle烧录:蜂网(Webee)提供的 CC2540_USBdo…

TI 蓝牙4.0芯片 cc2540

CC2540集成了2.4GHz射频收发器,是一款完全兼容8051内核的无线射频单片机,它与蓝牙低功耗协议栈共同构成高性价比、低功耗的片上系统(SOC)解决方案,非常适合蓝牙低功耗应用。它有3个不同的存储器访问总线: 1…

无线射频芯片CC2540F256RHAR 中文资料介绍

概述: CC2540是一个超低消耗功率的真正系统单晶片,它整合了包含微控制器、主机端及应用程式在一个元件上。CC2540结合一个优异的无线射频传送接收器及一个工业标准的加强型8051微控制器,它包括连接类比及数位感应器的周边,内建可…

CC2540开发入门

1 CC2540简介 CC2540是单模BLE芯片,是蓝牙RF和8051的组合,自带FLASH和8kB RAM。适合数据少频率低的通讯,如蓝牙键盘、传感器测量、遥控器、防丢器等应用。 2 开发需求 l 开发板(CC2540主板)(硬件&#xff0…

No module named '_sqlite3'

重点:出现这个问题一般是因为当前 包的版本不对,比如TensorFlow版本不对,Keras版本不对,Django,Python版本等等,总之就是你正在安装的某个包版本不对。其次:确认不是包的版本问题之后&#xff0…