文章目录

  • 一、蓝牙协议栈启动流程
    • 1.1 初始化代码
    • 1.2 初始化流程
    • 1.3 回调函数里的初始化
  • 二、notify实现
    • 2.1 notify介绍
    • 2.2 notify实现
      • 2.3.1 定义数据
      • 2.3.2 获取连接号conidx
      • 2.3.3 gatt_notification函数的使用
  • 三、notify温度上传测试
    • 3.1 蓝牙调试工具
    • 3.2 蓝牙调试器设置
    • 3.3 测试结果
  • 四、参考链接

  基于sdk开发的好处是方便项目的快速落地,现在用的是SDK里面的源文件,目前只是学习FR801xH芯片的特性,裁剪这个SDK需要点时间,在此之前,就用SDK来解释一下SDK的蓝牙协议栈的启动流程和notify实现方法。可以先复习一下 GATT的内容。

一、蓝牙协议栈启动流程

1.1 初始化代码

void simple_peripheral_init(void)
{// set local device nameuint8_t local_name[] = "Simple Peripheral";gap_set_dev_name(local_name, sizeof(local_name));// Initialize security related settings.gap_security_param_t param ={.mitm = false,.ble_secure_conn = false,.io_cap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT,.pair_init_mode = GAP_PAIRING_MODE_WAIT_FOR_REQ,.bond_auth = true,.password = 0,};gap_security_param_init(&param);gap_set_cb_func(app_gap_evt_cb);gap_bond_manager_init(BLE_BONDING_INFO_SAVE_ADDR, BLE_REMOTE_SERVICE_SAVE_ADDR, 8, true);gap_bond_manager_delete_all();mac_addr_t addr;gap_address_get(&addr);co_printf("Local BDADDR: 0x%2X%2X%2X%2X%2X%2X\r\n", addr.addr[0], addr.addr[1], addr.addr[2], addr.addr[3], addr.addr[4], addr.addr[5]);// Adding services to databasesp_gatt_add_service();speaker_gatt_add_service();                    //创建Speaker profile,//按键初始化 PD6 PC5pmu_set_pin_pull(GPIO_PORT_D, (1<<GPIO_BIT_6), true);pmu_set_pin_pull(GPIO_PORT_C, (1<<GPIO_BIT_5), true);pmu_port_wakeup_func_set(GPIO_PD6|GPIO_PC5);button_init(GPIO_PD6|GPIO_PC5);demo_LCD_APP();                                      //显示屏demo_CAPB18_APP();                                 //气压计demo_SHT3x_APP();                                  //温湿度gyro_dev_init();                                   //加速度传感器//OS Timeros_timer_init(&timer_refresh,timer_refresh_fun,NULL);//创建一个周期性1s定时的系统定时器os_timer_start(&timer_refresh,1000,1);}

1.2 初始化流程

  由上面的初始化函数可以看到如下的启动流程

  • gap_set_dev_name设置蓝牙设备的名称
  • gap_security_param_init设置蓝牙安全连接的参数
  • gap_set_cb_func注册GAP层的回调函数,GAP层产生的诸如连接成功、连接断开等事件都会进入这个回调函数里处理。
  • gap_bond_manager_init绑定初始化,绑定的意思是把配对产生的信息存储在flash里。
  • gap_address_get获取本地的mac地址
  • sp_gatt_add_service添加sp服务
  • speaker_gatt_add_service添加speaker服务

1.3 回调函数里的初始化

上面是明面上的初始化过程,下面要介绍的是通过回调实现的看不到的流程,大部分任务都由api完成,完成后会产生一个事件,根据事件执行不同的功能。

void app_gap_evt_cb(gap_event_t *p_event)
{switch(p_event->type){case GAP_EVT_ADV_END://广播结束。示例:adv_end,status:0x00{co_printf("adv_end,status:0x%02x\r\n",p_event->param.adv_end.status);//gap_start_advertising(0);}break;case GAP_EVT_ALL_SVC_ADDED://所有的 service 都添加完毕。{co_printf("All service added\r\n");sp_start_adv();
#ifdef USER_MEM_API_ENABLE//show_mem_list();//show_msg_list();//show_ke_malloc();
#endif}break;case GAP_EVT_SLAVE_CONNECT://做为 slave 链接建立。示例:slave[0],connect. link_num:1{sp_conidx = p_event->param.slave_connect.conidx;co_printf("slave[%d],connect. link_num:%d\r\n",p_event->param.slave_connect.conidx,gap_get_connect_num());gatt_mtu_exchange_req(p_event->param.slave_connect.conidx);gap_conn_param_update(p_event->param.slave_connect.conidx, 6, 6, 0, 500);}break;case GAP_EVT_DISCONNECT://链接断开, 可能是 master 或 slave。示例:Link[0] disconnect,reason:0x13{co_printf("Link[%d] disconnect,reason:0x%02X\r\n",p_event->param.disconnect.conidx,p_event->param.disconnect.reason);sp_start_adv();
#ifdef USER_MEM_API_ENABLEshow_mem_list();//show_msg_list();show_ke_malloc();
#endif}break;case GAP_EVT_LINK_PARAM_REJECT://链接参数更新被拒绝 示例:co_printf("Link[%d]param reject,status:0x%02x\r\n",p_event->param.link_reject.conidx,p_event->param.link_reject.status);break;case GAP_EVT_LINK_PARAM_UPDATE://链接参数更新成功。 示例:Link[0]param update,interval:6,latency:0,timeout:500co_printf("Link[%d]param update,interval:%d,latency:%d,timeout:%d\r\n",p_event->param.link_update.conidx,p_event->param.link_update.con_interval,p_event->param.link_update.con_latency,p_event->param.link_update.sup_to);break;case GAP_EVT_PEER_FEATURE://收到对端的 feature 特性回复 示例:co_printf("peer[%d] feats ind\r\n",p_event->param.peer_feature.conidx);show_reg((uint8_t *)&(p_event->param.peer_feature.features),8,1);break;case GAP_EVT_MTU:co_printf("mtu update,conidx=%d,mtu=%d\r\n",p_event->param.mtu.conidx,p_event->param.mtu.value);break;case GAP_EVT_LINK_RSSI:co_printf("link rssi %d\r\n",p_event->param.link_rssi);break;case GAP_SEC_EVT_SLAVE_ENCRYPT:co_printf("slave[%d]_encrypted\r\n",p_event->param.slave_encrypt_conidx);break;default:break;}
}

  服务添加完成后产生了一个GAP_EVT_ALL_SVC_ADDED事件,这个事件的条件下,执行sp_start_adv广播函数,连在一起就是在家添加完服务后开始蓝牙广播。
  到此,FR801xH的蓝牙协议栈的启动部分解释完毕,你可以在回调函数里去执行对应蓝牙事件下的操作,比如蓝牙连接成功、蓝牙断开等。

二、notify实现

2.1 notify介绍

  如果设备主动给手机发信息,则可以通过notification的方式,这种方式不用手机去轮询地读设备上的数据。notify的应用场景就是数据的实时上传。

2.2 notify实现

  实现notify需要的api函数是gatt_notification,使用方法

2.3.1 定义数据

uint8_t sp_conidx;//蓝牙连接号conidx
extern uint8_t sp_svc_id;//服务号

2.3.2 获取连接号conidx


  在蓝牙设备与手机连接成功后,在回调函数里获得连接号

     case GAP_EVT_SLAVE_CONNECT://做为 slave 链接建立。示例:slave[0],connect. link_num:1{sp_conidx = p_event->param.slave_connect.conidx;co_printf("slave[%d],connect. link_num:%d\r\n",p_event->param.slave_connect.conidx,gap_get_connect_num());gatt_mtu_exchange_req(p_event->param.slave_connect.conidx);gap_conn_param_update(p_event->param.slave_connect.conidx, 6, 6, 0, 500);}break;

  GAP_EVT_SLAVE_CONNECT:从机连接成功事件。

2.3.3 gatt_notification函数的使用

  在任意一个位置将入以下代码即可向指定的属性发送notify。这里是在获得温度后将发送温度。

 gatt_ntf_t ntf_att;ntf_att.att_idx = SP_IDX_CHAR4_VALUE;ntf_att.conidx = sp_conidx;ntf_att.svc_id = sp_svc_id;uint8_t show_string[30]={0};sprintf((char *)show_string,"temperature: %f",(float)temperature/1000);ntf_att.p_data = (uint8_t *)show_string;ntf_att.data_len = sizeof(show_string);gatt_notification(ntf_att);

  SP_IDX_CHAR4_VALUE:UUID为FFF4,接收notify的通道,在手机设置蓝牙接收用UUID时需要用到。

三、notify温度上传测试

3.1 蓝牙调试工具

本次使用的蓝牙调试工具是蓝牙调试器。

3.2 蓝牙调试器设置

  TX特征UUID与前面的SP_IDX_CHAR4_VALUE一致。

3.3 测试结果

  串口调试助手显示启动流程,与前面分析的启动流程一致。


  温度数据实时上传测试成功。

四、参考链接

BLE安全机制

富芮坤FR801xH蓝牙协议栈启动流程和notify实现温度数据主动上传相关推荐

  1. 富芮坤FR801xH使用SDK开发蓝牙GATT协议栈教程

    文章目录 一.FR801xH蓝牙芯片介绍 1.1 芯片外设资源 1.2 部分参数 1.3 芯片架构 二.开发(验证)板介绍 2.1 开发板资源 2.2 开发板烧录和串口调试方式 三.蓝牙协议栈SDK介 ...

  2. 基于富芮坤fr8016 蓝牙5.0 芯片设计的BLE HID Joystick 游戏摇杆设备

    文章目录 ble hid 学习笔记 HID报告描述符与BLE HID profile之间关系 1.HID报告描述符 富芮坤fr8016 设计Joystick例子 1.描述X轴Y轴Z轴 2.描述按钮 3 ...

  3. 富芮坤FR801XH作为主机连接SYD8811

    SYD8811使用开发板,代码使用的是透传例程:Source Code\SYD8811_ble_peripheral\1.SYD8811_BLE_UART_notifyen_open_power FR ...

  4. 富芮坤蓝牙FR801xH开发环境搭建

    富芮坤蓝牙FR801xH方案开发资源包网盘下载链接:网盘 提取码:30qu 搭建过程: 安装Keil开发工具:mdk525.exe 可以从Keil官网下载:http://www.keil.com/fi ...

  5. 基于富芮坤的FR801 BLE芯片开发

    基于富芮坤的FR801 BLE芯片开发 前言:本篇主要讲解如何利用官方的SDK和ble 协议栈知识开发所需的功能 注意:因为官方是每个工程都导入同一个底层-所以一旦修改了components ,全部工 ...

  6. 【富芮坤】 RF801xH的rost demo添加 OTA 功能

    [富芮坤] RF801xH的rost demo添加 OTA 功能: 官方的rost demo 并没有蓝牙的OTA功能.需要自己修改添加OTA功能进去. 操作步骤 步骤一:修改官方工程配置否则编译不过: ...

  7. 富芮坤FR8008A开发环境

    1. 富芮坤FR8008A介绍 FR8008A官网有详细介绍 首页-企业官网 2.富芮坤FR8008A开发资料 keil软件: https://www.keil.com/download/produc ...

  8. 硬件采集数据怎么上传服务器,如何使用4G蓝牙网关进行数据采集和数据上传

    原标题:如何使用4G蓝牙网关进行数据采集和数据上传 从技术效果上看,WiFi拥有宽带高.传输速度快等优点主要用于电脑.智能手机等的通信.蓝牙通信技术拥有功耗低,传输速率快等优点,是目前适用于数据采集和 ...

  9. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(上)

    目录 一.背景 1.1.run方法整体流程 1.2.刷新的整体调用流程 1.3.本文解读范围 二.准备刷新 2.1.准备刷新的流程 2.2.初始化上下文环境中servlet相关属性源 2.3.校验re ...

最新文章

  1. boost::test模块类属性工具的单元测试
  2. html5 - canvas
  3. 如何编写更少,更好的代码,或Project Lombok
  4. 老不死的笔,德国神设计!陪伴一辈子!不用墨水的金属永恒笔!
  5. Bsdiff:Bsd断电差分升级
  6. Git:常用的命令(不断迭代完善)
  7. hdu 2544(最短路)
  8. atitit。全局变量的设计与实现 java php的异同
  9. MATLAB中基于GUI的噪声抑制imnoise,medfilt2命令
  10. UVa 12261 High Score (贪心“向左走,向右走”)
  11. qt geomery的单位是什么_生命吗哪QT灵修11月28日
  12. 微信小程序实现举报功能
  13. 不用找,你想要的节日 节庆 节气展板展架模板素材都在这里
  14. 三原色亮度最高_色彩搭配三原色
  15. android 中文网站
  16. 寒冬降临程序猿们如何过冬
  17. 单片机毕业设计 stm32火灾报警系统
  18. LMMSE信道估计算法如何求自相关矩阵
  19. 基于聚类(Kmeans)算法实现客户价值分析系统(电信运营商)
  20. 瞬渺光电代理THZ光谱仪成功客户

热门文章

  1. 搜狗怎么做收录?我们来看看搜狗官方的回答
  2. mysql5.7.10 二进制包_mysql 32 位安装教程mysql5.7 二进制包安装
  3. 浏览器兼容性和HTTP状态了解
  4. 马云曾经偶像,终于把阿里留下的 1400 亿败光了!
  5. (FAQ)VM log是做什么的,4 Way VM又是什么
  6. 吉林大学计算机学数A吗,2020考研:没有A+学科的985你还会去吗?
  7. java打印api_java 调用打印机API无法打印的问题,请问找到解决方案了吗?
  8. python之pypinyin
  9. libvlc_media_add_option 函数中的参数设置
  10. php开发商城系统怎么样?有哪些PHP开源商城系统推荐?