NRF52832学习笔记(1)—— 添加自有service(基于SDK15.3)

2023-11-17

前言:

SDK版本15.3

评估板:pca10040

在uart的例程中添加battery service

添加之前,手机连上设备之后扫描到的service如下:

一、分配ram空间

softdevice的flash code是确定,但ram是不确定,和sevice的多少以及以下几个宏有关:

  • #define NRF_SDH_BLE_TOTAL_LINK_COUNT 1  //一共同时可以支持多少个连接,使用默认值即可
  • #define NRF_SDH_BLE_PERIPHERAL_LINK_COUNT 1  //作为从模式的连接同时能有几个,使用默认值即可
  • #define NRF_SDH_BLE_CENTRAL_LINK_COUNT 0  //作为主模式的连接同时能有几个,使用默认值即可
  • #define NRF_SDH_BLE_GATT_MAX_MTU_SIZE 247  // MTU 值的大小,使用默认值即可,nrf51 系列中 mtu 的默认值为23
  • #define NRF_SDH_BLE_VS_UUID_COUNT 1  //用户自定义的base UUID有几个,使用默认值即可,因为例程中的uart service 使用了一个的128bit的 uuid ,所以这是 count 值为1。因为此次实验添加的是自有 service ,所以 base uuid 只有uart service 一个。每添加一个 base uuid , count 值就+1,同时每增加一个uuid,IRAM1的起始地址就要增加0x10,size 同时减少0x10。

  • #define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1408  //Attribute table总共占多少协议栈RAM空间,该值必须是4的倍数。
  • #define NRF_SDH_BLE_SERVICE_CHANGED 0  //要不要包含service change characteristic,使用默认值即可

二、代码修改

2.1 添加文件

  • 添加service文件,文件路径为..\..\..\..\..\..\components\ble\ble_services\ble_bas

  • 添加sensorsim文件(此文件只是为了演示电量变化而添加的传感器数据模拟器,正式项目可以不用加),文件路径为..\..\..\..\..\..\components\libraries\sensorsim

该文件需要在keil的工程配置文件中设置文件路径才可以使用:

2.2 配置sdk_config.h文件

  • 使能bas service

2.3 添加头文件

在main.c文件中添加 

  • #include "ble_bas.h"
  • #include "sensorsim.h"(此文件只是为了演示电量变化而添加的传感器数据模拟器,正式项目可以不用加)

2.4 添加bas实例

在main.c文件中添加实例

BLE_BAS_DEF(m_bas);                                                                 /**< Structure used to identify the battery service. */

2.5 bas service初始化

在services_init(void) api中添加以下代码:

    ble_bas_init_t     bas_init;

    // Initialize Battery Service.
    memset(&bas_init, 0, sizeof(bas_init));

    bas_init.evt_handler          = NULL;
    bas_init.support_notification = true;
    bas_init.p_report_ref         = NULL;
    bas_init.initial_batt_level   = 100;
		
    // Here the sec level for the Battery Service can be changed/increased.
    bas_init.bl_rd_sec        = SEC_OPEN;
    bas_init.bl_cccd_wr_sec   = SEC_OPEN;
    bas_init.bl_report_rd_sec = SEC_OPEN;

    err_code = ble_bas_init(&m_bas, &bas_init);
    APP_ERROR_CHECK(err_code);

到此为止,手机已经可以正常查询到设备的 bsa service了。

以下为使用 sensorsim 功能模拟设备的电量变化并主动上报

2.6 添加变量和宏定义

#define BATTERY_LEVEL_MEAS_INTERVAL     APP_TIMER_TICKS(2000)                       /**< Battery level measurement interval (ticks). */
#define MIN_BATTERY_LEVEL               81                                          /**< Minimum simulated battery level. */
#define MAX_BATTERY_LEVEL               100                                         /**< Maximum simulated 7battery level. */
#define BATTERY_LEVEL_INCREMENT         1                                           /**< Increment between each simulated battery level measurement. */

APP_TIMER_DEF(m_battery_timer_id);                                                  /**< Battery timer. */

static sensorsim_cfg_t   m_battery_sim_cfg;                         /**< Battery Level sensor simulator configuration. */
static sensorsim_state_t m_battery_sim_state;                       /**< Battery Level sensor simulator state. */

2.7 在main(void)中添加 sensor simulator 初始化和 timers start

sensor_simulator_init();
application_timers_start();

2.8 添加battery定时器

  • 在 timers_init() api中添加以下代码
    // Create timers.
    err_code = app_timer_create(&m_battery_timer_id,
                                APP_TIMER_MODE_REPEATED,
                                battery_level_meas_timeout_handler);
    APP_ERROR_CHECK(err_code);
  • 添加battery_level_meas_timeout_handler(void * p_context) api
/**@brief Function for handling the Battery measurement timer timeout.
 *
 * @details This function will be called each time the battery level measurement timer expires.
 *
 * @param[in] p_context  Pointer used for passing some arbitrary information (context) from the
 *                       app_start_timer() call to the timeout handler.
 */
static void battery_level_meas_timeout_handler(void * p_context)
{
    UNUSED_PARAMETER(p_context);
    battery_level_update();
}
  • 添加battery_level_update(void) api
/**@brief Function for performing battery measurement and updating the Battery Level characteristic
 *        in Battery Service.
 */
static void battery_level_update(void)
{
    ret_code_t err_code;
    uint8_t  battery_level;

    battery_level = (uint8_t)sensorsim_measure(&m_battery_sim_state, &m_battery_sim_cfg);

    err_code = ble_bas_battery_level_update(&m_bas, battery_level, BLE_CONN_HANDLE_ALL);
    if ((err_code != NRF_SUCCESS) &&
        (err_code != NRF_ERROR_INVALID_STATE) &&
        (err_code != NRF_ERROR_RESOURCES) &&
        (err_code != NRF_ERROR_BUSY) &&
        (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
       )
    {
        APP_ERROR_HANDLER(err_code);
    }
}

三、测试

经过以上操作就可以在手机端使用bas service了。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NRF52832学习笔记(1)—— 添加自有service(基于SDK15.3) 的相关文章

  • 汇承4.0蓝牙BLE串口助手HC-COM的使用方法及出错的原因和改正方法

    本文主要介绍在使用汇承4 0蓝牙BLE串口助手HC COM xff0c 通过手机向蓝牙模块发送数据 或者通过手机向与蓝牙模块连接的单片机发送指令时 xff0c 串口中断函数的编写方法及出错的原因和改正方法 我们怎么把指令发送出去 xff0c
  • nRF52832的I2C例程代码

    nRF52832的I2C例程代码 include 34 nrf drv i2c h 34 include 34 app error h 34 define I2C SCL PIN 0 SCL引脚号 define I2C SDA PIN 1
  • [BLE]CC2640之定时器(Clock)事件

    一 定时器 xff08 Clock xff09 所谓定时器本质上递减计数器 xff0c 当计数器减到零时可以触发某种动作的执行 这种动作可以通过回调函数来实现 xff0c 当定时器计时完成后 xff0c 自定义的回调函数会立即被调用 回调函
  • [BLE]低功耗蓝牙之GAP、GATT

    一 开篇 本篇主要介绍一下关于BLE开发过程中必须了解的两个协议 xff1a GAP xff08 通用访问协议 xff09 GATT xff08 通用属性协议 xff09 两个协议都隶属于Host层 xff0c 直接关系到应用层开发 xff
  • BLE Mesh(四)BLE Mesh 安全

    BLE Mesh Security 1 Mesh Security is Mandatory2 Mesh Security Fundamentals3 Separation of Concerns and Mesh Security Key
  • BLE低功耗蓝牙协议栈

    目录 一 BLE低功耗蓝牙协议栈 1 蓝牙核心协议 Bluetooth Core 2 蓝牙应用层协议 Bluetooth Application 3 BLE低功耗蓝牙核心协议层详解 Bluetooth Core 物理层 PHY 链路层 LL
  • BLE MESH组网(一)简介和基本概念

    BLE MESH组网 一 BLE MESH简介 BLE MESH来源 BLE MESH用处 BLE MESH的通讯方式 管理洪水 市场内蓝牙设备支持 安全性 BLE MESH协议栈模型 BLE MESH基本概念 节点 元素 模型和状态 地址
  • nRF52832 — 连接指定name、UUID、addr的蓝牙设备

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要
  • BLE蓝牙协议 — 自适应调频算法简单实现

    写在前面 转载文章 若有不妥 通知后我会立即删除 最近看了大神刘权写的 BLE4 0低功耗蓝牙协议总结 感觉收获颇丰 其中有一节是讲解蓝牙的自适应调频算法的 但是代码实现不方便阅读 原文是这样的 小生不才 斗胆做了一下调整 还望大神海涵 下
  • 解密蓝牙mesh系列

    转载自 蓝牙技术联盟 蓝牙mesh网络 低功耗 低功耗蓝牙 低功耗蓝牙 Bluetooth Low Energy 是一项相当成功的无线技术 如今已经很难找到不支持低功耗蓝牙的智能手机或平板电脑了 可以说它是可穿戴技术兴起的关键因素 在医疗设
  • 蓝牙协议介绍

    1 广播 ADV Advertising 1 1 BLE 报文结构 BLE引入access address 概念 用来指明接收者身份 概 其中 0x8E89BED6 这个access address 比较特殊 它表示要发给周边所有设备 即广
  • BLE MESH组网(五)配置BLE MESH

    BLE MESH 五 配置BLE MESH 前言 概述 配置协议 供应程序 信标 邀请 交换公钥 前言 2017 年 5 月 全球最臭名昭著的勒索软件 WannaCry 在全球范围内积极攻击计算机 劫持用户数据索要赎金 这次攻击影响了 15
  • 蓝牙 BLE 协议学习: 有关概念介绍

    背景 在学校内就用过蓝牙技术参加过比赛 并拿了奖 而蓝牙作为物联网中比较常见的协议 有必要进行深入的学习 此后的文章会以 ble v4 0 进行学习 介绍 蓝牙技术最初由电信巨头爱立信公司于 1994 年创制 当时是作为 RS232 数据线
  • nRF52832 — 使用nRF52832的I2S播放音频

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要说的话
  • Android - BlueTooth BLE 之 Central 与 Peripheral

    一 前言 Andorid 5 0 之前是无法进行 外围设备开发的 在Android 5 0 API 21 android bluetooth le包下 新增加 Scaner相关类和 Advertiser 相关类 目前最后使用Scanner相
  • NRF52832学习笔记(2)—— 添加DFU功能(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在 uart 的例程中添加 DFU 功能 使用 s132 的协议栈 因为官方的 BootLoader 工程用的是s132的协议栈 一 准备工作 在开始实验之前必须先准备以下软件 gcc a
  • BLE学习(4):蓝牙地址类型和设备的隐私

    蓝牙地址也被称为蓝牙MAC地址 它能唯一标识一个蓝牙设备的48位的值 在蓝牙规范中 它被称为BD ADDR 蓝牙的地址类型可以分为两种 public addresses和random addresses 其中random addresses
  • Dialog DA14585——基本硬件资源配置

    GPIO DA14585共有3中类型的封装 WLCSP34pin QFN40pin QFN48pin 除去专用的RST GND XTAL ANT VBAT脚后 分别有14 25 32个IO口可用 目前最常用的封装类型是QFN40 处理单元
  • NRF52832学习笔记(1)—— 添加自有service(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在uart的例程中添加battery service 添加之前 手机连上设备之后扫描到的service如下 一 分配ram空间 softdevice的flash code是确定 但ram是
  • Android Ble 连接设备失败 onConnectionStateChange status 返回133

    Android Ble 连接设备失败时回调函数 onConnectionStateChange status 返回133 开始找问题 各种mac地址 权限 线程 找了个遍 结果就是返回纹丝不动 又因为 mBluetoothGatt mBlu

随机推荐

  • cJSON介绍与应用—基于VS以及STM32单片机

    一 cJSON介绍 cJSON是一个使用C语言编写的JSON数据解析器 具有超轻便 可移植 单文件的特点 使用MIT开源协议 cJSON的源码文件只有两个 1 cJSON h 2 cJSON c 使用的时候 只需要将这两个文件复制到工程目录
  • 数据仓库是什么?和数据库有何区别?

    在具体学习数据仓库之前先看一下数据中心的整体构架以及数据流向 DB 是现有的数据来源 可以为mysql SQLserver 文件日志等 为数据仓库提供数据来源的一般存在于现有的业务系统之中 ETL 是 Extract Transform L
  • Doxygen 详细使用

    doxygen的安装和基本使用可参考 Doxygen的安装和基本使用 常用选项 doxygen的所有选项的参考文档 doxygen官网文档 2 样式说明 doxygen可以自己自定义样式 手写 css文件 可以查看doxygen的源码 进行
  • 激光雷达LMS111在ROS上的使用

    LMS111 10100 在ROS上的测试与使用 准备工作 设备 硬件 LMS111 101000激光雷达 软件 ubuntu16 04 ROS 开始 设备连接 将激光雷达与处理器 电脑 工控机等 通过以太网连接好 激光雷达默认的IP地址为
  • Pytorch学习笔记(I)——预训练模型(三):VGG11网络结构

    VGG VGG11 VGG13 VGG16 VGG19 ResNet ResNet18 ResNet34 ResNet50 ResNet101 ResNet152 VGG features Sequential 0 Conv2d 3 64
  • Matlab神经网络训练函数train

    0 前言 本文基于MatlabR2009a分享神经网络的训练过程 1 启动训练 在Matlab中使用train函数对神经网络进行训练的时候 会弹出以下窗体 图1 1 由上图中的Netrual Network项可见 这是一个两层的网络 2 算
  • 适合Python入门的5本基础书籍

    Python 3标准库 对程序员而言 标准库与语言本身同样重要 它好比一个百宝箱 能为各种常见的任务提供完美的解决方案 所以本书是所有Python程序员都必备的工具书 全书以案例驱动的方式讲解了标准库中数百个模块的使用方法 如何工作 和工作
  • Java Web 远程调试

    Java Web 远程 调试 Tomcat 下载压缩版服务器 环境 Tomcat Eclipse 做远程调试我们并不需要其他特殊插件 1 配置Tomcat bin startup bat 在前面增加代码 SET CATALINA OPTS
  • linux三剑客awk命令详解之函数

    awk函数 在awk命令中 可以自定义函数 awk也有内置的函数 本篇文章主要介绍awk中的内置函数 awk内置函数分类 在awk中 内置函数主要分为算数函数 字符串函数 时间函数 其他函数等 以下列出一些常用的内置函数 算数函数 常用的主
  • html无法导入,如何修复“ImportError:无法导入名称'HTMLParseError'”?

    我正在尝试导入BeautifulGroup 但运行脚本时遇到错误 Traceback most recent call last File LinkCrawler py line 5 in from bs4 import Beautiful
  • CH9-网络编程

    案例9 2 模拟微信聊天 案例介绍 1 案例描述 在如今 微信聊天已经人们生活中必不可少的重要组成部分 人们的交流很多都是通过微信来进行的 本案例要求 将多线程与UDP通信相关知识结合 模拟实现微信聊天小程序 通过监听指定的端口号 目标IP
  • matlab模糊控制工具箱使用和模糊控制pid实例参考

    Matlab模糊控制工具箱为模糊控制器的设计提供了一种非常便捷的途径 通过它我们不需要进行复杂的模糊化 模糊推理及反模糊化运算 只需要设定相应参数 就可以很快得到我们所需要的控制器 而且修改也非常方便 下面将根据模糊控制器设计步骤 一步步利
  • 4-2 背包问题(贪心)

    4 2 背包问题 贪心 与0 1背包问题类似 所不同的只是在选择物品i装入背包时 可以选择物品的一部分而不一定要全部 1 i n 用贪心算法解背包问题的基本步骤是 首先计算每种物品单位重量的价值vi wi 然后 依贪心选择策略 将尽可能多的
  • html css 粗略浏览笔记

    1 HTML 不是一种编程语言 而是一种标记语言 元素是 HTML 页面的根元素 HTML 链接是通过标签 来定义的 HTML 图像是通过标签 来定义的 换行 br HTML 元素可以设置属性 属性总是以名称 值对的形式出现 比如 name
  • idea+sbt

    1 idea新建sbt scala项目 https blog csdn net aliceyangxi1987 article details 76423334 2 自己下载sbt集成到idea项目里 https www cnblogs c
  • LeetCode-1325. Delete Leaves With a Given Value

    Given a binary tree root and an integer target delete all the leaf nodes with value target Note that once you delete a l
  • Linux安装oracle 19C

    一 下载软件 我这边下的是ZIP Linux x86 64 二 安装依赖 yum install compat libcapl elfutils libelf devel fontconfig devel gliba devel kshli
  • Windows 10使用WSL部署Chatgpt_academic

    目录 一 在windows10中安装Ubuntu系统 二 在Ubuntu系统中安装anaconda3和GPT Academic 本文主要介绍windows10使用WSL安装Ubuntu系统 然后通过安装anaconda3来部署chatgpt
  • Unity——虚拟轴

    1 虚拟轴的概念 简单来说 虚拟轴就是一个数值在之间的数轴 其中最重要的数值为 1 0 1 2 虚拟轴的模拟 以按键模拟为例 用按键模拟虚拟轴需要2个按键 一个为负轴按键 按键1 一个为正轴按键 按键2 在没有按下任何按键的时候 虚拟轴的数
  • NRF52832学习笔记(1)—— 添加自有service(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在uart的例程中添加battery service 添加之前 手机连上设备之后扫描到的service如下 一 分配ram空间 softdevice的flash code是确定 但ram是