CC2540 Central与CC2540 Peripheral 密码配对
照例先扯点别的。
按常理这个其实应该并不难,毕竟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认为超时。
基本就这些。
耽误了三四天时间,希望能帮助后来的人。
CC2540 Central与CC2540 Peripheral 密码配对相关推荐
- BLE-NRF51822教程10—动态密码(配对码)
本讲教程也是在 sdk中的的uart例子 的基础上修改实现动态密码(其实是配对码)的功能.Uart例子在以下目录中 XXX\Keil_v5\ARM\Pack\NordicSemiconductor\n ...
- nrf51822笔记之密码配对过程梳理
配对的触发有以下几种情况: 1:主机直接发起. 2:从机发起安全请求,如果之前绑定过,那么主机会直接用用保存的LTK加密链路,如果没有那么主机会发起配对请求. 3:BLE中的有一个安全模式的概念.当某 ...
- CC2540驱动安装: CC2540 USB dongle COM port driver
多看官网,不得不说有时候百度越来越辣鸡 问题: 原因: 缺少驱动 解决: 下载驱动1348.win_64bit_x64.zip 结果: 参考链接:https://e2e.ti.com/support/ ...
- cc2540 cc2541 开发板资料更新日志
经过多次PCB打样和全面调试.已经完毕了cc2540 cc2541的开发板的批量贴片.硬件告一段落, 接下来是全面完好软件方面的工作.眼下已经针对没有开发经验的用户编写完毕0基础基础实验代码和教程.接 ...
- 蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现
蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现 虽然蓝牙4.0 BLE芯片CC2540 是单芯片(即用户可以对它进行芯片级代码编写), 是8051增强型主控, 带蓝牙4. ...
- Core Bluetooth框架之一:Central与Peripheral
原文网址:http://southpeak.github.io/blog/2014/07/29/core-bluetoothkuang-jia-zhi-%5B%3F%5D-:centralyu-per ...
- Python pywifi 、Kali linux aircrack-n、Hashcat 【python、kali】破解无线WiFi密码(详细流程)
目录 1.pywifi.python破解wifi 1.1 pywifi模块下载 1.1.1运行python是在PyCharm 2020.3, 1.1.2 pywifi模块介绍并安装: 1.1.3 ...
- BLE Peripheral设备的名字显示错误
在IOS BLE开发中碰到一个搜索到的设备名称(pheripheral.name)和设备实际名称不相符的问题. 最后发现这个问题的原因是,在iPhone中,被连接过的BLE设备名称都会被缓存.如果你在 ...
- 蓝牙外设配对时输入密码的三种状态说明
首先不管是什么设备也不管是蓝牙几的版本. 蓝牙连接弹输入框分三种情况: 不管谁都可以连接蓝牙,不需要输入配对密码: 不管谁,想连接蓝牙一定会弹框且要输入密码: 连接后蓝牙问你要密码和配对框,问我要就给 ...
最新文章
- linux redis 设置日志,linux上redis怎么动态看日志
- 赛森机器人_对比评测3款最贵的扫地机器人,戴森性能太强了
- linux校园网电脑开wifi密码,Linux/Ubuntu 16.04 使用校园网客户端Dr.com DrClient 有线连网,同时开启WiFi热点...
- 探索初级算法学习笔记-快速排序法
- 字节输出流的续写和换行
- 牛客 牛牛选物(01背包)
- RuoYi-Cloud 部署篇_02(linux环境 mysql+nginx版本)
- 互联网晚报 | 12月6日 星期一 | 荣耀线下门店超3万家;鸿蒙系统明年正式登陆欧洲;凯撒旅业与众信旅游终止合并...
- Hive集成Mysql作为元数据时,提示错误:Specified key was too long; max key length is 767 bytes...
- 2010.2.28 OA 项目组工作报告
- 人工智能趋势:语音识别发展前景广阔
- 公众号常用的排版软件有哪些?
- 实现socket监听所有网络命名空间
- Win11怎么删除微软输入法?
- 亚马逊五点描述是什么?有什么作用?
- 速解元宇宙 / Metaverse 迷雾下的行动指南
- carsin中创建相邻车道车辆插入场景设置
- win7 host 中 vbox 虚拟机无法 attach USB device的问题
- git push错误failed to push some refs to的解决
- Python光的干涉仿真