使用宏来简化,在Nordic52832 的sdk17.0.2中添加自定义Service和attribute

2023-11-11

sdk17.0.2附带的example中,各种类型和函数等都过度包装了,一个很简单的东西,定义了一层又一层,很容易让人看的头皮发麻。
为了降低添加Service和处理各种handler的难度,使用宏来简化添加自定义Service和attribute

typedef struct ble_bas_s ble_bas_t;
typedef struct
{
    ble_bas_evt_handler_t        evt_handler;                    
    bool                         support_notification;         
    ble_srv_report_ref_t       * p_report_ref;                 
    uint8_t                      initial_batt_level;             
    ble_srv_cccd_security_mode_t battery_level_char_attr_md;     
    ble_gap_conn_sec_mode_t      battery_level_report_read_perm; 
} ble_bas_init_t;
struct ble_bas_s
{
    ble_bas_evt_handler_t    evt_handler;            /**< Event handler to be called for handling events in the Battery Service. */
    uint16_t                 service_handle;            /**< Handle of Battery Service (as provided by the BLE stack). */
    ble_gatts_char_handles_t battery_level_handles;     /**< Handles related to the Battery Level characteristic. */
    uint16_t                 report_ref_handle;         /**< Handle of the Report Reference descriptor. */
    uint8_t                  battery_level_last;        /**< Last Battery Level measurement passed to the Battery Service. */
    bool                     is_notification_supported; /**< TRUE if notification of Battery Level is supported. */
};
typedef struct
{
    ble_bas_evt_type_t evt_type;    /**< Type of event. */
    uint16_t           conn_handle; /**< Connection handle. */
} ble_bas_evt_t;
typedef enum
{
    BLE_BAS_EVT_NOTIFICATION_ENABLED, /**< Battery value notification enabled event. */
    BLE_BAS_EVT_NOTIFICATION_DISABLED /**< Battery value notification disabled event. */
} ble_bas_evt_type_t;

static void services_init(void)

memset(&bas_init_obj, 0, sizeof(bas_init_obj));
//BLE_BAS_DEF(m_bas);                                     /**< Battery service instance. */
err_code = pvt_ble_bas_init(&m_bas, &bas_init_obj);
APP_ERROR_CHECK(err_code);//需要调用pvt_ble_bas_init返回值,pvt_ble_bas_init必须加入return err_code。

uint32_t pvt_ble_bas_init(ble_bas_t * p_bas, const ble_bas_init_t * p_bas_init)

ble_bas_init_t          bas_init_obj;
bas_init_obj.support_notification = true;
bas_init_obj.p_report_ref         = NULL;
bas_init_obj.initial_batt_level   = 100;
bas_init_obj.evt_handler          = on_bas_evt;//在services_init加上这行代码,不会有bas实时数据
err_code = msy_ble_bas_init(&m_bas, &bas_init_obj);
// APP_ERROR_CHECK(err_code);
return err_code;//尤为重要

ret_code_t msy_ble_bas_init(ble_bas_t * p_bas, const ble_bas_init_t * p_bas_init)

// Initialize service structure
p_bas->evt_handler               = p_bas_init->evt_handler;
p_bas->is_notification_supported = p_bas_init->support_notification;
p_bas->battery_level_last        = INVALID_BATTERY_LEVEL;
// Add service
BLE_UUID_BLE_ASSIGN(ble_uuid, BLE_UUID_BATTERY_SERVICE);
err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, 
                                    &ble_uuid, 
                                    &p_bas->service_handle);
VERIFY_SUCCESS(err_code);
// Add battery level characteristic
err_code = battery_level_char_add(p_bas, p_bas_init);
return err_code;

static ret_code_t battery_level_char_add(ble_bas_t * p_bas, const ble_bas_init_t * p_bas_init)

    ble_gatts_char_md_t char_md;
    ble_gatts_attr_md_t cccd_md;
    ble_gatts_attr_t    attr_char_value;
    ble_uuid_t          ble_uuid;
    ble_gatts_attr_md_t attr_md;
   
    // Add Battery Level characteristic
    if (p_bas->is_notification_supported)
        memset(&cccd_md, 0, sizeof(cccd_md));
        
    memset(&char_md, 0, sizeof(char_md));
    BLE_UUID_BLE_ASSIGN(ble_uuid, BLE_UUID_BATTERY_LEVEL_CHAR);
    
    memset(&attr_md, 0, sizeof(attr_md));
   initial_battery_level = p_bas_init->initial_batt_level;
   
   memset(&attr_char_value, 0, sizeof(attr_char_value));
   err_code = sd_ble_gatts_characteristic_add(p_bas->service_handle, &char_md,
                                               &attr_char_value,
                                               &p_bas->battery_level_handles);
  
  if (p_bas_init->p_report_ref != NULL)
        // Add Report Reference descriptor
        BLE_UUID_BLE_ASSIGN(ble_uuid, BLE_UUID_REPORT_REF_DESCR);
        memset(&attr_md, 0, sizeof(attr_md));
       
        init_len = ble_srv_report_ref_encode(encoded_report_ref, p_bas_init->p_report_ref);
        memset(&attr_char_value, 0, sizeof(attr_char_value));
        err_code = sd_ble_gatts_descriptor_add(p_bas->battery_level_handles.value_handle,
                                              &attr_char_value,
                                              &p_bas->report_ref_handle);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用宏来简化,在Nordic52832 的sdk17.0.2中添加自定义Service和attribute 的相关文章

随机推荐

  • Python文件操作常用的API(open函数使用)

    打开文件 获取文件对象 fp open file mode encoding file 要操作的文件路径 使用的时候注意目录的拼接 mode 打开方式 encoding 编码方式 关于第一个参数file需要注意的是 文件的路径 使用的时候要
  • 30个简单又实用的Python代码

    作者 billy 版权声明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 1 重复元素判定 def all unique lst return len lst len set lst x 1 1 2 2 3 2 3 4
  • 冬至,这一天,与汤圆饺子一样暖心的——还有我呢

    冬至 送你一碗万事如意的汤圆 一碗幸福安康的饺子 用真情煮水 以祝福调味 让你吃出一天好运气 一年好福气 视腾与你相伴 这一天 与汤圆饺子一样暖心的 还有我呢
  • 下载对应版本的torch-geometric

    本篇主要针对使用torch geometric读取数据时出现错误 The data object was created by an older version of PyG If this error occurred while loa
  • css fixed定位失效问题

    css fixed定位失效问题 fixed定位失效问题的原因多半在于fixed定位的元素其祖先的transform perspective 或 filter属性非none 导致fixed定位不再参照视口进行定位 而是参照祖先进行定位 MDN
  • c语言int型能储存的最大数,int类型在内存中的存储方式

    Q1 int类型在内存中是以何种方式存储的 要解决这个问题 我们需要首先比较深入地理解下int类型 本文中的int类型的相关数据都以32位操作系统下的VC 6 0编译器环境为准 在下表中可以看到 int类型表示带有符号的整型 而unsign
  • AMD第四代EPYC拼上最后一块拼图 智能边缘市场烽烟再起

    2023年5月初 有媒体爆料称 代号 Siena 锡耶纳 的AMD EPYC 霄龙 8004系列处理器已通过了SATA IO的验证 当时的EPYC 8004可谓犹抱琵琶半遮面 9月18日 AMD正式推出EPYC 8004系列处理器 千呼万唤
  • JVM-内存结构

    目录 1 什么是JVM 2 jvm的内存结构 2 1程序计数器 2 1 1定义 2 1 2Java程序的运行原理 2 2虚拟机栈 2 2 1定义 2 2 2栈内存溢出 2 3线程运行诊断 3 本地方法栈 4 堆 4 1定义 4 2堆内存溢出
  • shell脚本之如使用return和exit

    文章目录 shell脚本之如使用return和exit 一 exit和return基础 EXIT退出指令举例 在函数中使用return语句退出举例 二 最佳实践 三 子脚本返回非零状态码时导致主控脚本退出中断的问题 问题描述 重要 问题分析
  • Windows下julia编程环境搭建

    Windows下julia编程环境搭建 jupyter notebook环境配置 julia vscode环境配置 参考 jupyter notebook环境配置 安装包下载并安装 安装时可以勾选add julia to path http
  • 带你深入了解==和equals 的区别 ?

    1 功能不同 是判断两个变量或实例是不是指向同一个内存空间 equals 是判断两个变量或实例所指向的内存空间的值是不是相同 2 定义不同 equals 在JAVA中是一个方法 在JAVA中只是一个运算符号 3 运行速度不同 比 equal
  • Vulkan Android 实战 - 接口导入

    大家好 接下来将为大家介绍Android Vulkan 实战 接口导入 首先要确定手机是否支持Vulkan 可以下载一个AIDA64应用app 在设备中如果能找到vulkan设备 说明支持 否则不支持 严格按照官方介绍的步骤一步步执行 就能
  • 网站备案后可以换服务器吗,域名备案后可以更换服务器吗

    域名备案后可以更换服务器吗 内容精选 换一换 不可以 只有购买了华为云产品资源 如有确定的 包年 包月 弹性云服务器 包年 包月 弹性公网IP 华为云才是您的接入商 才可以代操作申请网站备案 您可以购买如下任一产品 用于网站备案使用 ECS
  • perl子程序调用

    perl子程序调用 use strict 使用严格的编程方式 sub用来定义子程序 参数在 这个数组里 数组里的第一个元素是 0 sub large if 0 gt 1 print 0 else print 1 large 15 12 su
  • Oracle数据单实例多实例服务示例

    在我们工作时 有时需要一个oracle实例被不同网段的ip访问 从而需要开通2个或以上的实例服务 如下为例子 listener ora文件内容 listener ora Network Configuration File oracle a
  • Kendo UI开发教程(12): Kendo MVVM 数据绑定(一) attr

    Kendo UI MVVM数据绑定支持的绑定属性有 attr checked click custom disabled enabled events html invisible style text value visible 这些属性
  • 储存测试

    declare result code varchar2 400 result info varchar2 400 begin for i in 20170420 20170430 loop 循环体 P JH AUDIT ECS ALL i
  • 找出总分最高的学生

    找出总分最高的学生 TOC 给定N个学生的基本信息 包括学号 由5个数字组成的字符串 姓名 长度小于10的不包含空白字符的非空字符串 和3门课程的成绩 0 100 区间内的整数 要求输出总分最高学生的姓名 学号和总分 输入格式 输入在一行中
  • AOSP预置第三方应用

    一 选择需要编译的aosp版本 下载源码并进行编译 这里可以自行自行参考网络上的文章进行操作AOSP 镜像使用帮助 进入aosp目录 初始化编译环境 选择对应的版本 没有实体机 直接编译运行在虚拟机的版本 source build envs
  • 使用宏来简化,在Nordic52832 的sdk17.0.2中添加自定义Service和attribute

    sdk17 0 2附带的example中 各种类型和函数等都过度包装了 一个很简单的东西 定义了一层又一层 很容易让人看的头皮发麻 为了降低添加Service和处理各种handler的难度 使用宏来简化添加自定义Service和attrib