Chinaunix首页 | 论坛 | 博客
  • 博客访问: 722171
  • 博文数量: 109
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3755
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-02 14:36
  • 认证徽章:
文章分类
文章存档

2018年(8)

2017年(1)

2016年(50)

2015年(12)

2014年(9)

2013年(29)

分类: 嵌入式

2018-03-19 14:28:53

SDK下自带的 HID 鼠标示例为例说明:


音乐控制:

代码中 main中调用了services_init初始化几个服务。

其中调用hids_init 来初始化hid服务


函数中首先定义了    static uint8_t rep_map_data[]  这个数组变量。


这个变量里面存的值就是 报告描述符,其将会被设置为Report Map Characteristic的值。这样和手机连接后,手机就会读取这个特性值,从而知道 ble device可能发过来的几种数据以及其各个数据的含义。


该 鼠标示例中 报告描述符 描述了3种报告,

 报告1,描述鼠标 按键和滚轮数据如何组织的。

 报告2,描述鼠标 的移动数据是如何组织的。

 报告3, 描述了一个高级按键,其功能是控制音乐的播放等。


例子中已经实现的是通过按键来 返回鼠标的移动,所以烧写程序后连接上手机,通过按键可以看到手机屏幕上出现鼠标的移动。


这里主要介绍 报告描述符中的  报告3 部分,一般使用ble HID也是用来控制音乐播放的。

报告描述符中的报告3截图如下。

定义了report size1 1 bit report count1。即11bit,

因为 report size,report countglobal项目,所以会应用到下面的8usage中,

也就是下面的8usage都是1bit8个即凑成了1个字节。每个位表示一个功能,所以实际传送1字节,通过设置其中的位就能实现不同的控制了。


8个位的功能,已有注释,

其中一键启动应用,这个没搞清,应该是要手机端也设置吧。

应用控制也没搞清什么用,

返回键 和手机上的返回键功能一样。




之后程序调用ble_hids_init 开始创建 HID 服务。

包括一个  Add Protocol Mode characteristic. 其特性值就是上面说的报告描述符。

3个report characteristic,用来传输input report,即ble device发送给手机的按上述报告描述符组织的报告数据,每个report characteristic下都有其Report Reference descriptor,该描述符描述了 该report 会设置为Input report,并且有其字节的report id

这样3 input report便更根据其report id通过3个特性值来传送

PS:参见 BLE-HID简介的描述。


该例子中没有 output report,所以不需要创建对应的 report characteristic.


其他的描述符参见代码中的注释以及 BLE-HID简介中的文档描述。


现在修改 该例子来实现音乐的控制。根据上面的描述我们知道就是要根据报告描述符中的 报告3所描述的数据组织来发送数据。

所发送的数据只有1字节,每个位分别表示一个功能。

并且需要通过 report id3的那个 characteristic来发送。

main.c中添加如下代码来发送音乐控制信号。

点击(此处)折叠或打开

  1. static void media_player_control(uint8_t control)
  2. {
  3.      uint32_t err_code;

  4.      uint8_t buffer[1];

  5.      buffer[0] = control;
  6.     
  7.      err_code = ble_hids_inp_rep_send( &m_hids,
  8.                                           INPUT_REP_MPLAYER_INDEX,
  9.                                           1,
  10.                                           buffer );
  11.     
  12.     if ( ( err_code != NRF_SUCCESS ) &&
  13.          ( err_code != NRF_ERROR_INVALID_STATE ) &&
  14.          ( err_code != BLE_ERROR_NO_TX_BUFFERS ) &&
  15.          ( err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING )
  16.        )
  17.     {
  18.         APP_ERROR_HANDLER( err_code );
  19.     }
  20.     
  21.         //需要再发送一个 0,作用类似于释放按键。
  22.         //如果不发送这个"释放",android有的是没问题的,但是ios中,音            
  23.         //+发送后会一直增大到最大音量
  24.         //所以发送这个"释放" 控制就能达到按一次只增加一次音量的作用
  25.         buffer[0] = 0;
  26.         err_code = ble_hids_inp_rep_send( &m_hids,
  27.                                           INPUT_REP_MPLAYER_INDEX,
  28.                                           1,
  29.                                           buffer );
  30.     if ( ( err_code != NRF_SUCCESS ) &&
  31.          ( err_code != NRF_ERROR_INVALID_STATE ) &&
  32.          ( err_code != BLE_ERROR_NO_TX_BUFFERS ) &&
  33.          ( err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING )
  34.        )
  35.     {
  36.         APP_ERROR_HANDLER( err_code );
  37.     }
  38. }


然后搜索 main.c中的bsp_event_handler 函数,该函数中对几个按键的处理是发送 鼠标位移,将其改成发送音乐控制信息。

PS:我的板子是兼容官方板PCA10028的所以有4个按键,按键已经在main函数中的buttons_leds_init中默认初始化了,每个按键按下会产生默认事件。


main.c文件的bsp_event_handler()函数为按键处理函数

修改按键的处理函数如下





编译后烧写固件连接手机后就可以按键测试了,连接最好通过 手机设置中的蓝牙来连接而不是 bleapp软件。HID服务需要配对绑定,有的app连接后不配对导致连接不成功。


另外,工程默认使用了绑定和白名单的,所以如果连接了一个手机后再重启开发板,开发板就是使用之前连接过的手机执行白名单过滤,导致其他手机搜不到该设备了。所以可以直接修改代码让其每次启动时删除绑定信息。




拍照控制:

相机控制比较简单,手机系统自带的相机一般都支持 音量键的 +/- 时会自动拍照。所以实现 控制相机的拍照跟 ble-hid音乐控制一样。 只要修改一下按键的时候发送 音量+或者音量-的控制信号就可以了。


报告描述符不需要修改,依旧使用sdk中设置的。 报告id3的报告就可以用来控制相机,只要发送音量+-就行了

 

需要修改的只是按键的时候发送 音量控制就可以控制相机拍照了。

根据报告描述符中的 报告3所描述的数据组织来发送数据。

所发送的数据只有1字节,每个位分别表示一个功能。

并且需要通过 report id3的那个 characteristic来发送。

main.c中添加如下代码来发送 控制信号。
同音乐控制,这里只要修改一下按键发送音量控制就可以了


编译后烧写固件通过手机系统蓝牙连接设备后, 打开系统相机 就可以按键测试了,


阅读(252) | 评论(0) | 转发(0) |
0

上一篇:BLE-HID介绍

下一篇:BLE-ANCS协议介绍

给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册