搜索
bottom↓
回复: 3

NimBLE (蓝牙5.0协议栈)心率服务(HRS)使用

[复制链接]

出0入0汤圆

发表于 2019-3-25 09:47:09 | 显示全部楼层 |阅读模式
本帖最后由 正十七 于 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 服务。
结构如下

  1.    blehr
  2.       │
  3.       ├─── blehr_sens.h
  4.       ├─── blehr.c      /* 例程的主要实现 */
  5.       └─── 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 即可。


  1. \ | /
  2. - RT -     Thread Operating System
  3. / | \     4.0.0 build Mar 22 2019
  4. 2006 - 2018 Copyright by rt-thread team
  5. hello world
  6. msh />
  7. msh />
  8. msh />ble_hr
  9. [I/nimble] GAP procedure initiated: stop advertising.
  10. [I/nimble] 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
  11. msh />
复制代码

此时心率服务已经启动,手机打开 nRF Master Control Panel APP,能够扫描到名为 blehr_sensor 的设备,连接之后,模拟的 Heart rate 示例开始运行。再次点击 Heart Rate Measurment 右侧的图标,设备会收到订阅事件,然后以通知的形式将模拟的心率数据源源不断的发送到手机端。如图:




也可以使用 Nordic 的另外一框小工具 ———— nRF Tools,能够更加形象表示模拟心率变化的过程,如图。



流程简介

简述一下代码流程,NimBLE 由于协议栈开放的缘故,代码层级和API设计简洁明了,几乎所有的例程及服务都遵循这一流程。


  1. 设置sync回调函数    ─────────────────> ble_hs_cfg.sync_cb = blehr_on_sync
  2.      |
  3.      |
  4.     \|/
  5. 初始化定时器       ─────────────────> ble_npl_callout_init
  6.      |
  7.      |
  8.     \|/
  9. 初始化gatt服务   ───────────────────> gatt_svr_init
  10.      |
  11.      |
  12.     \|/
  13. 启动host主机协议栈  ────────────────> ble_hs_thread_startup
  14.      |
  15.      |                                                
  16.     \|/                                                设置地址
  17. sync回调中设置地址,开始广播 ──────────> blehr_on_sync   设置广播参数
  18.      |                                                 设置GAP回调函数,开始广播                  
  19.      |
  20.      |
  21.     \|/                                                 BLE_GAP_EVENT_CONNECT
  22. GAP回调函数中,处理GAP事件 ───────────> blexx_gap_event   BLE_GAP_EVENT_DISCONNECT
  23.                                                         BLE_GAP_EVENT_ADV_COMPLETE
  24.                                                         BLE_GAP_EVENT_SUBSCRIBE
复制代码


  • sync同步回调函数

该函数是host全局结构 ble_hs_cfg  的一个成员函数指针,在Host协议栈启动后第一时间被调用。因此在该函数中设置设备使用公有地址,同时设置广播参数,调用 ble_gap_adv_start,开始广播。在执行ble_gap_adv_start函数时,同时设置 GAP 系列事件的回调函数。

  • gap_event 事件回调处理

在 gap 事件回调中,分别对连接、断开、广播完成以及订阅事件进行处理。  
如上面演示所看到的,当手机作为主机,连接设备后,设备收到连接完成事件,停止广播;手机断开的时候,设备收到断开事件,此时继续调用开始广播函数,因此我们能够再次扫描到设备,重新进行连接。  

当在手机点击获取数据的图标,设备收到订阅事件,然后复位定时器。定时器以1ms的周期,模拟心率消息,发送通知消息到手机,从而在手机上观察到变化的心率数据。

更详细的处理步骤,可以查阅源码,NimBLE 协议栈可读性比较高,易于理解。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入198汤圆

发表于 2019-3-26 19:42:27 | 显示全部楼层
厉害,不知道资源占用是多少? 支持 52840 吗?

出0入0汤圆

发表于 2019-3-26 20:45:30 | 显示全部楼层
支持,BLE5.0

出0入0汤圆

发表于 2019-3-27 09:21:56 | 显示全部楼层
收藏一个,支持开源协议栈!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 21:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表