ESP32-连接参数/间隔更新

news2024/11/26 19:37:02

 连接间隔的设置是一个协商的过程,ESP32提供了一些协商的接口,按顺序分析一下。

Step 1:首先是Client连接时对Server要求的连接间隔(确定值)

在连接的时候,Client会把当前的连接间隔发送给Server。在Server的连接事件回调函数中,我们是可以看到这个Client要求的连接间隔的,主要是从这个结构体获得。

再具体些是这样一个结构体。

以下是在连接事件回调函数中查看Client要求的连接间隔的代码,适用于Arduino和ESP-IDF

// 在连接事件回调函数中查看Client要求的连接间隔
// 适用于Arduino和ESP-IDF
esp_gatt_conn_params_t conn_params;
memcpy(&conn_params, &param->connect.conn_params, sizeof(esp_gatt_conn_params_t));
Serial.println(conn_params.interval*1.25); // 换成ESP-IDF的LOG就行

Step 2:然后是Server请求更新间隔范围(是范围哦)

主要是调用这个函数,Server向Client发送的连接间隔更新请求。

esp_err_t esp_ble_gap_update_conn_params(esp_ble_conn_update_params_t *params);

用的这样的一个结构体: 

 在ESP-IDF里面,在Server连接之后,在连接事件的回调函数里请求更新:

case ESP_GATTS_CONNECT_EVT:
    ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_CONNECT_EVT, conn_id = %d", param->connect.conn_id);
    esp_log_buffer_hex(GATTS_TABLE_TAG, param->connect.remote_bda, 6);
    // 在这里把Step1的代码放进来可以看到Client在本次连接开始时要求的连接参数:
    // 以下时Step2的关键代码:
    esp_ble_conn_update_params_t conn_params = {0};
    memcpy(conn_params.bda, param->connect.remote_bda, sizeof(esp_bd_addr_t));
    conn_params.latency = 0;
    conn_params.max_int = 0x20;    // max_int = 0x20*1.25ms = 40ms
    conn_params.min_int = 0x10;    // min_int = 0x10*1.25ms = 20ms
    conn_params.timeout = 400;    // timeout = 400*10ms = 4000ms
    esp_ble_gap_update_conn_params(&conn_params);
    break;

而在Arduino ESP32里面,大佬们已经把这段话封装成了函数,就是下面这个:

 因此在Arduino里面,只需要在连接回调函数里调用这个函数就可以请求更新间隔了。


esp_bd_addr_t connectedAddress;  // 被连接的地址

class MyServerCallbacks: public BLEServerCallbacks 
{
    void onConnect(BLEServer* pServer,esp_ble_gatts_cb_param_t* param) {
    // 在这里把Step1的代码放进来可以看到Client在本次连接开始时要求的连接参数:
    // 以下时Step2的关键代码:
      memcpy(connectedAddress, param->connect.remote_bda, sizeof(esp_bd_addr_t));
      pServer->updateConnParams(connectedAddress,6,6,0,500);
    };

    void onDisconnect(BLEServer* pServer) {
    }
};

Step 3:最后是查看Client和Server的当前连接间隔

连接间隔是一个协商的过程,最开始,也就是刚连接上时,Server是可以看到Client要求的连接间隔的,然后Server请求更新一个更适合自己的参数范围,Client收到请求后,Client的协议栈会根据情况最终决定一个新的连接间隔,这个最终决定权在Client,那要怎么知道是否更新成功呢,或者说怎么知道当前的连接间隔呢。

法1,利用回调事件,仅适用于ESP-IDF的Server端(其实Arduino应该也会有这个事件啦,但是好像没有暴露接口给我们,就不去改源码了)。

主要是通过每次更新后产生的一个gap层的回调事件,通过回调的结构体参数打印:

case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
    ESP_LOGI(GATTS_TABLE_TAG, "update connection params status = %d, min_int = %d, max_int = %d,conn_int = %d,latency = %d, timeout = %d",
    param->update_conn_params.status,
    param->update_conn_params.min_int,
    param->update_conn_params.max_int,
    param->update_conn_params.conn_int,    //当前连接间隔可能不在范围内,因为是由Client决定的
    param->update_conn_params.latency,
    param->update_conn_params.timeout);
    break;

要注意,当前连接间隔可能不在Server请求的范围内,因为决定权最终是由Client决定的。

法2:调用查询函数,这个函数可以用在Server和Client,用在连接后的任意地方,这个函数是:
esp_err_t esp_ble_get_current_conn_params(esp_bd_addr_t bd_addr, esp_gap_conn_params_t *conn_params);

它用到这样一个结构体变量,但是只要新建这个变量就行,然后把指针传到上面这个函数,函数会把结果放进这个结构体

就是下面这段代码

esp_gap_conn_params_t conn_params;
esp_err_t ret = esp_ble_get_current_conn_params(connectedAddress, &conn_params);
Serial.println(ret);
Serial.println(conn_param2.interval*1.25);

好了,这样就可以知道当前实际的连接间隔了。

Step 4:回到最初的设置

回到最初,说的是一开始Client会给Server发送一个初始的连接间隔,那这个初始的间隔俺们能不能自己设置呢。我找了一个这个接口,这个应该是在连接建立之前让Client调用来进行设置的,很奇怪,设置的是一个范围而不是一个具体的值。

esp_err_t esp_ble_gap_set_prefer_conn_params(esp_bd_addr_t bd_addr, uint16_t min_conn_int, uint16_t max_conn_int, uint16_t slave_latency, uint16_t supervision_tout);

由于没有对这个函数进行测试,这里简单说说我的总结(猜想),最开始,用这个函数设置了Client的连接间隔范围,协议栈从中选定一个初始连接间隔对Server发起连接,Server通过Step1可以看到这个初始连接间隔,Server通过Step2发来一个它需要的连接间隔范围,Client的协议栈在两个范围内取交集,如果没有交集则优先满足Client的范围。我们最后通过Step3可以查到最终的连接间隔是什么。也就是说,Client的协议栈才是最终的老大。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/872471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue.js2+Cesium1.103.0 十一、Three.js 炸裂效果

Vue.js2Cesium1.103.0 十一、Three.js 炸裂效果 Demo ThreeModelBoom.vue <template><div:id"id"class"three_container"/> </template><script> /* eslint-disable eqeqeq */ /* eslint-disable no-unused-vars */ /* eslint-d…

物流行业数据分析

文章目录 物流行业数据分析一、数据预处理1、数据清洗① 重复值、缺失值、格式调整② 异常值处理 2、数据规整 二、 数据分析1、配送服务是否存在问题2、是否存在尚有潜力的销售区域3、商品是否存在质量问题 三、总结参考 物流行业数据分析 Excel适合处理低量级数据&#xff0…

【Hystrix技术指南】(7)故障切换的运作流程原理分析(含源码)

背景介绍 目前对于一些非核心操作&#xff0c;如增减库存后保存操作日志发送异步消息时&#xff08;具体业务流程&#xff09;&#xff0c;一旦出现MQ服务异常时&#xff0c;会导致接口响应超时&#xff0c;因此可以考虑对非核心操作引入服务降级、服务隔离。 Hystrix说明 官方…

解决Idea 多模块,maven项目是多层级文件夹的子项时无法加入git管理的问题

问题 多模块项目&#xff0c;引入模块无法做git管理&#xff0c;第一个项目没有git分支标志&#xff0c;也不能像其他项目一样右键出git选项。 解决方法 发现该模块是多层级的文件夹结构&#xff0c;也就是项目本身在一个文件夹下。应该是要管理该文件夹。 Settings-Versi…

python使用装饰器记录方法耗时

思路 python使用修饰器记录方法耗时&#xff0c;目的是每当方法执行完后&#xff0c;可以记录该方法耗时&#xff0c;而不需要在每个方法的执行前后&#xff0c;去创建一个临时变量&#xff0c;来记录耗时。 方式一&#xff08;不推荐&#xff09;&#xff1a; 在每个方法的…

【java面向对象中static关键字】

提纲 static修饰成员变量static修饰成员变量的应用场景static修饰成员方法static修饰成员方法的应用场景static的注意事项static的应用知识&#xff1a;代码块static的应用知识&#xff1a;单例设计模式 static静态的意思&#xff0c;可以修饰成员变量&#xff0c;成员方法&a…

AbstractQueuedSynchronizer

目录 AQS是什么AQS什么样内部类成员变量方法public如果不使用AQS会怎样 AQS的应用ReentrantLockSyncNonfairSyncFairSync 其他实现 AQS是什么 AbstractQueuedSynchronizer&#xff08;AQS&#xff09;是Java中的一个并发工具&#xff0c;位于java.util.concurrent.locks包中&a…

最新Ubuntu LVGL SDL模拟器安装

前言 本文主要说明Ubuntu 23.4安装LVGL 9.0以及基于SDL的模拟环境。 代码下载 访问lv_port_pc_eclipse可以看到相信信息&#xff0c;官方已经打包好了整个代码环境。 安装CMAKE。 sudo apt install cmake安装SDL。 sudo apt-get update && sudo apt-get install …

HTML(JavaEE初级系列12)

目录 前言&#xff1a; 1.HTML结构 1.1认识HTML标签 1.2HTML文件基本结构 1.3标签层次结构 1.4快速生成代码框架 2.HTML常见标签 2.1注释标签 2.2标题标签&#xff1a;h1-h6 2.3段落标签&#xff1a;p 2.4换行标签&#xff1a; br 2.5格式化标签 2.6图片标签&#…

新手家长必读:英国ISEB考试局CEO为低龄留学家庭深度解析ISEB

大家都知道&#xff0c;英国私校备考难就难在流程繁琐&#xff0c;菁英私校笔面试风格各异&#xff0c;考试时间各不相同。但在进入私校笔面试之前&#xff0c;还有非常重要的一步——通过ISEB pre-test考试。      作为英校申请敲门砖&#xff0c;学生在注册之后&#xff…

STM32 F103C8T6学习笔记7:双机无线串口通信

今日尝试配通俩个C8T6单片机之间的无线串口通信&#xff0c;文章提供原理&#xff0c;源码&#xff0c;测试效果图&#xff0c;测试工程下载&#xff1a; 目录 传输不规范问题&#xff1a; 串口通信资源&#xff1a; 单个串口资源理解&#xff1a; 单片机串口资源&#xf…

ModaHub魔搭社区:Milvus Cloud向量数据库不可小觑

向量数据库不可小觑 事实上,向量数据库并不是一个新的数据库技术,只是一直以来并没有什么亮眼的技术突破,因此显得有点“籍籍无名”。然而,当向量检索找到典型应用场景,成为普遍需求后,向量数据库的真正价值才日益凸显。 云和恩墨创始人,中国数据库联盟(ACDU) 主席盖…

[ Docker ] 部署 nps 和 npc 实现内网穿透

nps 原作者已停止维护&#xff0c;现在用 yisier1/nps 云主机上运行 nps 创建目录 mkdir -p /root/docker/nps mkdir /root/repo下载必要文件 Docker 镜像 docker pull yisier1/npsGit 仓库 git clone https://github.com/yisier/nps.git /root/repo cp -r /root/repo/nps…

【密码学】维京密码

维京密码 瑞典罗特布鲁纳巨石上的图案看起来毫无意义&#xff0c;但是它确实是一种维京密码。如果我们注意到每组图案中长笔画和短笔画的数量&#xff0c;将得到一组数字2、4、2、3、3、5、2、3、3、6、3、5。组合配对得到24、23、35、23、36、35。现在考虑如图1.4所示的内容&a…

yolov5部署 单线程与多线程对比

单线程 部署代码可参考&#xff1a; Yolov5 ONNX Runtime 的 C部署_爱钓鱼的歪猴的博客-CSDN博客 main.cpp #include "detector.h" #include <chrono> using namespace std;// 识别线程 void *detect_thread_entry(void *para){}int main(int argc, char *ar…

分布式应用:Zabbix监控MariaDB

目录 一、理论 1.Zabbix监控MariaDB 二、实验 1.Zabbix监控MariaDB 一、理论 1.Zabbix监控MariaDB &#xff08;1&#xff09;环境 zabbix服务端&#xff1a;192.168.204.214 zabbix客户端&#xff1a;192.168.204.215 &#xff08;2&#xff09;MareaDB安装 安装 za…

文献阅读:AnnoLLM: Making Large Language Models to Be Better Crowdsourced Annotators

文献阅读&#xff1a;AnnoLLM: Making Large Language Models to Be Better Crowdsourced Annotators 1. 文章简介2. 方法介绍3. 实验考察 1. 实验结果2. 消解实验3. Consistency & Stability 4. 结论 & 思考 文献链接&#xff1a;https://arxiv.org/abs/2303.16854 …

STM32F429IGT6使用CubeMX配置SPI通信(W25Q256芯片)

1、硬件电路 需要系统性的看一下W25Q256芯片手册 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置SPI 4、生成工程配置 5、相关代码 #define sFLASH_ID 0XEF4019 // W25Q256#define SPI_FLASH_PageSize 256 #define SPI_FLASH_PerWritePageSize 256#def…

爬虫小白-如何辨别请求头referer/origin反爬

目录 一、网站分析二、最终代码一、网站分析 1、网站,研究这块数据从哪个接口来的 2、反爬参数:请求头referer/origin校验和x-api-key 3、详细分析流程,看b站十一姐时一视频, 或者知识星球时光漫漫图文文章 二、最终代码 # -*- coding: utf-8 -*- # @Time : 2023-08-13

为了监控上厕所次数,我开发了一个软件

背景 最近整了一个好玩的东西&#xff0c;一个快捷指令&#xff0c;实现点击之后显示当前的日期&#xff0c;同时后台将这个时间记录到一个文件里。文件在icloud上&#xff0c;实现多个设备的同步。话不多说&#xff0c;先看看效果吧。 这个是我的“软件”图标&#xff1a; 怎…