面向 Bluetooth Smart 应用的低功耗无线 MCU

cc2640 r2是德州仪器推出的一款面向 bluetooth smart 应用的低功耗无线 mcu。该芯片集成有cortex m3内核,可以运行ti的ble协议栈,具有功耗低,外设种类丰富,射频性能好等特点。与cc2640相比,r2版本的芯片将部分协议栈迁移到了片内的rom中,留给客户的应用程序更多的flash空间。cc2640r2芯片架构及核心特点如下图1所示。
而cc2640r2f本身集成有可以支持蓝牙5.0的phy,ti协议栈支持部分蓝牙5.0的协议,如high speed,long range等等。基于cc2640r2f可以实现很多炫酷的应用。不过有时候,有些应用并没有按键或者屏幕等输入设备,要求app输入密码与ble从机配对后方可读取ble设备的数据,这篇文章就跟大家详细聊聊如何用用户自定义的密码进行配对。
本文所使用的软硬件平台如下:
ide环境 iar 8.11.2
蓝牙协议栈版本 1_50_00_62
实验所用工程 .\examples\rtos\cc2640r2_launchxl\bleapps\hid_emu_kbd
硬件平台 launchxl-cc2640r2
手机android版本 4.4.4
手机ios版本 11.3.1
本文是以hid_emu_kbd例程为参考。其他工程比如simplebleperipheral或者其他,都可以参照这个来修改。hid设备对ble来说比较特殊,ble的hid profile是规定hid设备必须配对和绑定的。
下图是配对和绑定的基本流程。initiator是连接中的主设备,responder是连接中的从设备。
ble的配对与绑定则发生在连接之后。绑定是在配对之后发生的事,需不需要绑定取决于用户在代码里的设置。
上图的phase 1和phase2是配对的过程。phase 3是绑定的过程。要不要进行phase 3,在phase 1发送配对请求的时候就已经决定了,这个决定就是用户在代码里面的配置。
如果要用户在配对过程中人为输入密码或进行其他认为操作,是在phase 2。而具体的误认为操作方式,也是在phase 1中决定,这个决定也是用户在代码里面的配置。其实phase 2能用到的配对有很多种方式,最简单的就是just works的方式,用大家都知道的000000作为配对密码,这个方式很不安全,非常容易被破解。其实ble到了4.2以上的版本,已经有了用dh(diffie–hellman key exchange)方式交换密码,这个方式已经很安全,且密码也是随机产生的。
有些应用场景可能需求比较特殊,产品需要自定义的配对密码,所以要达到这个目的,就需要我们灵活配置配phase 1中的各个参数,这也是这篇文章的目的。
我们继续以hid_emu_kbd为例,ble配对phase 1所需要的几个重要参数的配置在hidemukbd.c里,如下:
第一个关键参数是pairing_mode,配对是由gapbond_pairing_mode_initiate一端发起的,可以是主机,也可以是从机。本文中由手机(手机)发起配对请求,从机(cc2640r2)则被动等待,所以需要将宏定义配置为gapbond_pairing_mode_wait_for_req。
第二个关键参数是mitm_mode,mitm即man in the middle保护,如果mitm为false,则说明不需要人参与中间,后面相应的io capabilities设置也会被忽略,但是为了使配对需要passcode才能成功,必须要把mitm_mode的宏定义设置为true。
第三个关键参数是io_capabilities,表示本机是否有输入或者显示的功能,比如gapbond_io_cap_display_only,表示可以将密码显示在屏幕上给操作人看,如果有i/o接口可以输入密码,也可以选择gapbond_io_cap_keyboard_only。本文中将i/o capabilities的属性设置为gapbond_io_cap_display_only,如下:
这样做的目的就是告诉主机,我这边能显示配对密码,最终用户作为mitm,需要在主机那边(手机上)跳出的窗口里输入我从机这边显示的配对密码就行。到这一步,phase 2要用的配对的方式就确定好了。但是这样设置的话从机这边显示的密码是随机产生的6位数,并不是我们想要的自定义的固定6位数。
×注意,即使实际的从设备产品不带显示功能(没屏幕),io_capabilities配置成gapbond_io_cap_display_only,也是可以的,前提就是用自定义的固定6位数作为配对密码,不然就会导致产生的6位随机数没地方显示,就会无法完成配对。
接下来就来设置固定的6位数配对密码来达到我们的目的。
cc2640r2的修改方式cc2541不同,cc2541可以参考这个帖子:https://e2echina.ti.com/question_answer/wireless_connectivity/bluetooth/f/103/t/112619
首先看一下哪里设置这个自定义配对密码passcode的6位数。cc2640r2的这个passcode隐藏的比较深,在bcomdef.h里,把宏定义改成你自己需要的密码就可以了。这里设置成123412,注意这个密码必须是6位。
那么这个默认自定义passcode是怎么被用上的呢?
首先,就是要在初始化的时候注册bond manager的回调:
这个回调的hiddev_passcodecb()就是处理passcode请求的回调函数。
当配对的phase 2被配置成前面提到的方式时,配对过程会触发passcode请求,就会调用hiddev_passcodecb()。最终会触发hiddev_processpasscodeevt():
所以可以看到,只要其中phiddevcb->passcodecb这个回调为null,那么就会使用默认自定义密码,这样就能达到目的。(如果这个回调不为null,那么就会调用这个回调来获取密码,那很有可能是应用层用户手动输入密码或者其他方式。)
phiddevcb这个回调是在应用层用户自己初始化的:
第三个回调函数就是passcodecb,这个修改为null。
这个回调结构体是在hiddev_register()被调用,并初始化给phiddevcb指针的。
修改完了,为了调试的方便,我们把断开连接后自动广播打开,在iar开发环境中,右击工程 -> options -> c/c++ compiler -> preprocessor中define symbols里,把auto_adv的值改为true。
如果是用iphone作为主机的话,有几个连接参数要改一下,不然ios会拒绝连接参数更新请求。
下面到了见证奇迹的时刻,拿出你的手机,以iphone为例,由于是hid的工程,可以用iphone自带的蓝牙界面:(如果不是hid工程,ios上的lightblue app或者ti的sensortag app都能做演示)
搜索到设备:
点击搜索到的hid keyboard,这样会发起连接请求,自动跳出密码框:
输入正确的预设6位密码123412并点击配对:
配对成功连接建立完成:
如果输入密码错误,那么会连接建立失败,重新回到最初界面:
为了加深理解,我们可以从空中抓包的log来看一下过程。下图是配对成功后,连接进行加密:
那么可以看到加密以后的数据就都是红的,这是因为sniffer没法解析了,通过mitm方式配对是比较安全的模式。
那么如果iphone上密码输入错误,非指定密码,cc2640r2就会直接回复pairing failed给iphone:
iphone就会立即断开连接:
最后,灵活运用前面提到过的配对参数搭配,能达到不同的配对场景效果。我们这里只是举了一个例子,读者有兴趣的话可以自己尝试一下各种搭配,这样对理解ble的安全机制也会很有帮助。


使用NVIDIA Jetson组合实现家务自动化
小家电节电小绝招
聊天机器人可以代替客服到哪种地步
鸿蒙和HMS的关系解析 鸿蒙下一步又是什么
土壤水分测定仪的技术参数
面向 Bluetooth Smart 应用的低功耗无线 MCU
连接器焊接到FPC软板上出现空焊的案例分析
数字货币对金融监管和言论监管的未来意味着什么
消息称小米2021年采购2.4亿部手机零部件,出货量将超苹果
超过370亿美元的资金补助将全部资助本土半导体技术研发
柔性屏与时尚相结合,未来科技越来越成为时尚界的标配
Keil仿真调试STM32与LED
关于消谐器未来发展的大方向与需要面临的问题
理想汽车回应全系车型降价是提前开始产品更新过渡
采用低成本方式来实现硅应变片时的压力传感器
力矩电机的工作原理是什么
飞虹电子可针对不同电源产品定制对应的MOS管产品使用方案
国产晶体管采购选择什么厂家好
全球电动化浪潮加速中国龙头锂电材料企业出海
小米Q2位居印度可穿戴设备市场份额第一名,高达46%