原创 【富芮坤物联网开发板评测】评测二 例程ble_peripheral建profile部分源码分析

2020-4-28 22:47 3294 14 3 分类: MCU/ 嵌入式 文集: FR8016HA

根据文档《FREQ BLE SDK User Guide V1.0.5》和《Fr801xH 如何构建系统》说明知道,FR801xH SDK包含以下组件:

l BLE 5.0 协议栈和常见 Profile
l BLE SIG Mesh 协议栈
l 多个中间件组件
l 非抢占式操作系统
l 保持链接睡眠和关机睡眠调用接口
l 多种外设驱动
l 调试函数和错误处理
l 系统常用辅助函数

其中协议栈部分、OSAL以库的形式提供,类似TI BLE协议栈。

          本例程dev1.0/ble_simple_peripheral新建了2profile,分别为simple_profile_service服务和speaker_service服务。下面来进行代码分析,固化128K ROM里的BootLoader会引导进入库里定义好的三个弱函数(应用层需要重写功能定义):

i.             user_custom_parameters

ii.             user_entry_before_ble_init

iii.             user_entry_after_ble_init

作用文档里有涉及,不赘述。当进入启动代码platform/app_boot_vectors.sReset_Handler上电初始化,最终进入跟用户打交道的user_entry_after_ble_init函数,先开启两个用户任务按键和音频处理分支:

void user_task_init(void)
  • {
  •     user_task_id = os_task_create(user_task_func); //创建用户任务(按键)
  •     audio_task_id = os_task_create(audio_task_func);//创建音频任务
  • }
  • 复制代码

    之后就开始添加ATT 数据库,这是本文重点。蓝牙设备名称、MAC地址、安全特性参数等设置完成,就开始新建profile

              // Adding services to database

          sp_gatt_add_service();                                           //创建Simple Profile

              speaker_gatt_add_service();                                   //创建Speaker profile

    如上图所市,2profile分别为:simple_profile_service(0x0000fff0-0000-1000-8000-00805f9b34fb)speaker_profil(0x0000d0ff-0000-1000-8000-00805f9b34fb),以simple_profile为例:

    ATT属性组添加service声明、特征声明、特征值、特征描述符、特征CCC配置(可选)等:

    const gatt_attribute_t simple_profile_att_table[SP_IDX_NB] =
  • {
  •     // Simple gatt Service Declaration
  •     ……
  •    // Characteristic 1 Declaration
  •     …….
  •    // Characteristic 5 Declaration
  •     …….
  • }
  • 复制代码

    声明了5个特征0xfff1~0xfff5:

    Profile描述定义simple_profile_att_table属性数组,同时要定义一个特征操作访问函数包括读写处理函数,其中有读回调sp_gatt_read_cb和写回调sp_gatt_write_cb

    最后调用gatt_api.h协议栈APIgatt_add_service)来添加进数据库,到此一个用户profile新建并成功进入ATT属性组了。整个关键函数结构如下:

    void sp_gatt_add_service(void)
  • {
  •     simple_profile_svc.p_att_tb = simple_profile_att_table;
  •     simple_profile_svc.att_nb = SP_IDX_NB;
  •     simple_profile_svc.gatt_msg_handler = sp_gatt_msg_handler;
  •     sp_svc_id = gatt_add_service(&simple_profile_svc);
  • }
  • 复制代码

    在手机nRF connect上读写就会触发刚才两个对应回调函数,比如给特征值1写入0x1122centralperipheral提示如下:

     

    作者: 南霁云, 来源:面包板社区

    链接: https://mbb.eet-china.com/blog/uid-me-1821704.html

    版权声明:本文为博主原创,未经本人允许,禁止转载!

    PARTNER CONTENT

    文章评论0条评论)

    登录后参与讨论
    我要评论
    0
    14
    关闭 站长推荐上一条 /3 下一条