NimBLE (蓝牙5.0协议栈)心率服务(HRS)使用
本帖最后由 正十七 于 2019-3-25 09:47 编辑NimBLE (蓝牙5.0协议栈)心率服务(HRS)使用
书接上文,上回说到 NimBLE 是 Apache 基金会下的一个开源BLE 5.0协议栈,介绍了它的特点。这篇文章以心率计服务为例,介绍如何使用该协议栈。
https://www.amobbs.com/thread-5707843-1-1.html?_dsign=63ac8c7d
描述
HRS 例程提供一个模拟心率服务的应用,发送数据到手机APP端。
目录结构
HRS 相关代码位于 \NimBLE-latest\apps\blehr\src 目录下,主要文件就两个,blehr.c是例程的主要实现部分,gatt.c则根据SIG的规范,定义的 Heart-rate 服务。
结构如下
blehr
│
├─── blehr_sens.h
├─── blehr.c /* 例程的主要实现 */
└─── gatt.c /* Heart-rate 服务定义 */
```
编译下载
该工程托管在github上,RTOS使用RT-Thread构建。刚开始提交的时候需要自己下载 RT-Thread 源码,设置路径,然后更新软件包,Menuconfig 选择功能等。
一通操作很繁琐,现在简化了流程,工程默认已经导入 RT-Thread 4.0 的源码,同时添加 NimBLE 的源码包,并且相关选项全部打开。因此,只需要使用 MDK5 双击打开工程,编译完成后,使用JLink或者调试手段烧录进52832的板子即可。
运行现象
使用串口调试助手或者其他终端软件连接板子的串口,需要注意串口的引脚号与自己实际的板子对应(driver/drv_uart.c中可以自行更改)。
系统启动后,会在终端软件中打印如下 logo 信息,然后输入命令 ble_hr 即可。
\ | /
- RT - Thread Operating System
/ | \ 4.0.0 build Mar 22 2019
2006 - 2018 Copyright by rt-thread team
hello world
msh />
msh />
msh />ble_hr
GAP procedure initiated: stop advertising.
GAP procedure initiated: advertise; disc_mode=2 adv_channel_map=0 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=0 adv_itvl_max=0
msh />
此时心率服务已经启动,手机打开 nRF Master Control Panel APP,能够扫描到名为 blehr_sensor 的设备,连接之后,模拟的 Heart rate 示例开始运行。再次点击 Heart Rate Measurment 右侧的图标,设备会收到订阅事件,然后以通知的形式将模拟的心率数据源源不断的发送到手机端。如图:
也可以使用 Nordic 的另外一框小工具 ———— nRF Tools,能够更加形象表示模拟心率变化的过程,如图。
流程简介
简述一下代码流程,NimBLE 由于协议栈开放的缘故,代码层级和API设计简洁明了,几乎所有的例程及服务都遵循这一流程。
设置sync回调函数 ─────────────────> ble_hs_cfg.sync_cb = blehr_on_sync
|
|
\|/
初始化定时器 ─────────────────> ble_npl_callout_init
|
|
\|/
初始化gatt服务 ───────────────────> gatt_svr_init
|
|
\|/
启动host主机协议栈────────────────> ble_hs_thread_startup
|
|
\|/ 设置地址
sync回调中设置地址,开始广播 ──────────> blehr_on_sync 设置广播参数
| 设置GAP回调函数,开始广播
|
|
\|/ BLE_GAP_EVENT_CONNECT
GAP回调函数中,处理GAP事件 ───────────> blexx_gap_event BLE_GAP_EVENT_DISCONNECT
BLE_GAP_EVENT_ADV_COMPLETE
BLE_GAP_EVENT_SUBSCRIBE
[*]sync同步回调函数
该函数是host全局结构 ble_hs_cfg的一个成员函数指针,在Host协议栈启动后第一时间被调用。因此在该函数中设置设备使用公有地址,同时设置广播参数,调用 ble_gap_adv_start,开始广播。在执行ble_gap_adv_start函数时,同时设置 GAP 系列事件的回调函数。
[*]gap_event 事件回调处理
在 gap 事件回调中,分别对连接、断开、广播完成以及订阅事件进行处理。
如上面演示所看到的,当手机作为主机,连接设备后,设备收到连接完成事件,停止广播;手机断开的时候,设备收到断开事件,此时继续调用开始广播函数,因此我们能够再次扫描到设备,重新进行连接。
当在手机点击获取数据的图标,设备收到订阅事件,然后复位定时器。定时器以1ms的周期,模拟心率消息,发送通知消息到手机,从而在手机上观察到变化的心率数据。
更详细的处理步骤,可以查阅源码,NimBLE 协议栈可读性比较高,易于理解。
厉害,不知道资源占用是多少? 支持 52840 吗? 支持,BLE5.0 收藏一个,支持开源协议栈!
页:
[1]