【CC2541测评】CC2541迷你开发套件使用心得分享—HidEmuKbd工程与BTool联合调试 by lyc830

1 前言
 
   直接使用HidEmuKbd工程的时候遇到了一些问题,到论坛上搜索了一下,发现有人提问,但是并没有人给出很好的回答。其中比较走心的是让提问人用监听工具抓一下空中数据,看看数据到底有没有发出。很有道理啊,于是把套件里的USB Dongle烧写成了Sniffer,抓取数据,发现只有广播数据,没有其他消息发出。既然确定问题出在外设端,那就只能仔细地看资料和程序,分析到底怎么回事了。
    第一次接触蓝牙开发,手头只有试用的套件,如果把USB Dongle用作Sniffer,就没有好办法和Keyfob连接了,所以决定利用BTool+USB Dongle配合Keyfob完成最终的调试。
2 资料准备
CC2540 Mini Development Kit User's Guide》
CC2540/41 BLE Sample Applications Guide》
CC2540 and CC2541 Bluetooth Low Energy SW development guide》
3 了解和调试程序
 
3.1 快速了解程序
 
    首先,利用《CC2540/41 BLE Sample Applications Guide》对样例程序的介绍,快速熟悉HidEmuKbd,当然也是一个大概,不能指望文档面面俱到。
其中,比较关键的点有:
  • 样例工程对应的硬件平台为:CC2540DK-MINI Keyfob硬件平台
  • 在连接建立和开始广播之前,按任意一个按键都会发起广播。当连接建立后,Keyfob左侧的按键对应标准键盘的左箭头键,右侧的按键对应右箭头键。
    注意:只有建立了安全连接,按下按键才会发出消息。
  • 在安全连接建立之后,必须对外设进行配置,使能通知功能,消息才能被发出。
  • 如果不是出于配对过程中,一旦超过一定时间没有HID数据发出,HID设备会终止连接。有网友提问时问为什么会超时断开连接,有可能就是没注意到需要建立安全连接才行。
    这些内容不是我第一次读文档的时候就发现的,而是调试程序的时候,发现BTool接收不到数据,然后逐个层次地查看代码,发现了程序中对消息发送的几处限制,回过头再看文档的时候才发现,文档已经提到这些点了,只是我没有逐字逐句地阅读,从而忽略了这些细节,浪费了自己的时间。以后还是要注意读文档的时候要仔细!
3.2 和BTool联合调试、建立安全连接
 
3.2.1 修改程序
 
为了配合BTool建立安全连接,需要修改样例程序。样例程序默认的安全连接参数如下:
// Default passcode
#define DEFAULT_PASSCODE                      0

// Default GAP pairing mode
#define DEFAULT_PAIRING_MODE                 GAPBOND_PAIRING_MODE_INITIATE

// Default MITM mode (TRUE to require passcode or OOB when pairing)
#define DEFAULT_MITM_MODE                     FALSE

// Default bonding mode, TRUE to bond
#define DEFAULT_BONDING_MODE                  TRUE

// Default GAP bonding I/O capabilities
#define DEFAULT_IO_CAPABILITIES              GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT

默认的密码为0,在连接建立过程中,BTool需要将该密码发送给Keyfob。
默认配对模式为:GAPBOND_PAIRING_MODE_INITIATE,主动发起配对
默认MITM()模式为:配对时不需要密码
默认绑定模式:TRUE:绑定
默认GAP绑定I/O能力:GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT,无输入和输出设备
实测这些设置是无法和BTool建立安全连接的,原因如下:
  • BTool和外设建立安全连接时,BTool需要主动发起配对
  • BTool需要将密码发送给外设(发起配对请求30秒之内发送,否则无效)
所以,我们把参数修改为:
  • 外设不主动发起配对,等待配对请求
  • MITM模式改为TRUE,需要密码
  • 默认IO能力为,仅具备显示功能(参考其他工程设置,尚不知道为什么,感觉BTool是具备输入和显示功能的,而且也没有弹出提示要求输入密码,而是BTool主动发给外设密码)
修改后代码如下:
// Default passcode
#define DEFAULT_PASSCODE                      0

// Default GAP pairing mode
#define DEFAULT_PAIRING_MODE                  GAPBOND_PAIRING_MODE_WAIT_FOR_REQ

// Default MITM mode (TRUE to require passcode or OOB when pairing)
#define DEFAULT_MITM_MODE                     TRUE

// Default bonding mode, TRUE to bond
#define DEFAULT_BONDING_MODE                  TRUE

// Default GAP bonding I/O capabilities
#define DEFAULT_IO_CAPABILITIES               GAPBOND_IO_CAP_DISPLAY_ONLY

3.2.2 利用BTool建立安全连接
 
    本小节部分内容参考了《CC2540 Mini Development Kit User's Guide》
  • 打开BTool,点击扫描按钮,开始扫描蓝牙设备
  • 点击Keyfob任意一个按键,设备就能够被扫描到了
  • 点击BTool的连接建立按钮,尝试建立连接
  • 再次点击Keyfob任意一个按键,就能够成功建立连接
  • 以上建立连接的操作,可以参考《CC2540 Mini Development Kit User's Guide》或者我上一篇测试文章《【CC2541测评】CC2541迷你开发套件使用心得分享—快速体验&资料准备 by lyc830
  • 切换到BTool的配对和绑定选项卡,进入下图所示的界面
  • 按下图设置进行勾选参数(和程序对应的)
  • 点击红框中的“发送配对请求”按钮,发送密码按钮会从灰色的不可用状态变成可用状态,如下图所示:
  • 点击发送密码按钮,成功后弹出提示消息如下图所示:
  • 获取外设所有UUIDs,如下图所示:
  • 选中0x2902,Report的Client Characteristic Configuration,双击,弹出写对话框,如下图所示:
  • 在Value文本框中,输入01:00,然后点击Write Value按钮,将配置值写入外设。
  • 接下来再按Keyfob的按键,BTool中就可以收到消息了,如下图所示:
    左键按下和释放:
    右键按下和释放:
  • 至此,已经能够和BTool联合调试了

3.3 程序流程分析
 
    程序的整体框架涉及到OSAL,比较复杂,本文暂且不谈,仅分析按键处理的整个过程。流程图并不严谨,仅用于简要描述按键处理过程。
    以左键被按下为例,程序处理过程如下图所示:
 
4 小结
 
    通过HidEmuKbd工程和BTool的联合调试,理解了一种建立安全连接的方式。在分析和解决问题过程中,对通知消息的发送有了更好地理解。在以后的开发过程中,可以更熟练地使用BTool+USB Dongle完成对外设的调试。
版权声明:
本文由“cuter(电路城lyc830)”于TI E2E中文社区原创首发,如需转发到其他平台,请务必注明TI链接及名称;但不得擅自更改文章内容,也不得用于任何盈利目的。转载时不得删除版权声明。如有盗用而不说明出处引起的版权纠纷,由盗用者自负。

6 个回复