正十七 发表于 2019-3-25 09:47:09

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 协议栈可读性比较高,易于理解。



sunnydragon 发表于 2019-3-26 19:42:27

厉害,不知道资源占用是多少? 支持 52840 吗?

fenglove 发表于 2019-3-26 20:45:30

支持,BLE5.0

cqsrmxxzyx 发表于 2019-3-27 09:21:56

收藏一个,支持开源协议栈!
页: [1]
查看完整版本: NimBLE (蓝牙5.0协议栈)心率服务(HRS)使用