BLE 蓝牙连接参数详解

BLE 蓝牙连接参数详解 学习一下蓝牙连接参数相关知识 ...... 矜辰所致 ...协商连接间隔部分 细节说明修改 2025/10/22 ...部分细节说明修改 2025/12/2 ...文字框架增加第三章节增加苹果设备连接参数说明 2026/2/9 ...更新部分细节描述错误内容 2026/2/25前言在我们学习蓝牙示例的时候只要是从机示例在最初初始化的时候都会设置两个参数 GAPROLE_MIN_CONN_INTERVAL 和 GAPROLE_MAX_CONN_INTERVAL最小连接间隔和最大连接间隔它们属于蓝牙的连接参数那么它们在蓝牙协议中究竟有何意义与他们相关联的参数还有哪些本文我们就来了解一下 Ble 蓝牙连接参数相关知识。沁恒微 RISC-V 蓝牙专栏目录【导航】沁恒微 RISC-V 蓝牙 入门教程目录 【快速跳转】❤️蓝牙篇系列相关博文CH585 蓝牙 示例工程 Central 全解析.我是矜辰所致全网同名尽量用心写好每一系列文章不浮夸不将就认真对待学知识的我们矜辰所致金石为开目录前言一、 基础介绍1.1 基本概念1.1.1 连接间隔1.1.2 从设备延迟1.1.3 监督超时1.2 连接参数更新1.3 关于保活1.4 连接间隔的实际时间1.4.1 连接间隔的确定1.4.2 连接间隔时间是多少1.4.3 为什么 Ble 协议需要范围间隔二、 CH58x 示例体现2.1 初始化2.2 参数更新2.2.1 从机2.2.2 主机2.3 更新结果查看2.4 更新流程三、 补充说明3.1 苹果设备连接参数3.2 苹果手机扫描不到蓝牙结语一、 基础介绍连接参数连接连接顾名思义只有 Ble 蓝牙建立了连接才会生效的参数用于控制从机Peripheral与主机Central之间的通信频率。1.1 基本概念在沁恒微官方 EVT 中示例 BLE 文件夹下面有一份 《沁恒低功耗蓝牙软件开发参考手册》在低功耗蓝牙协议栈部分章节对连接参数有描述。我们这里也过一遍基本概念。1.1.1 连接间隔连接间隔Connection Interval 是指主机与从机之间每次通信的时间间隔。低功耗蓝牙采用的是跳频方案设备在特定的时间在特定的通道上发送和接收数据。两个设备的一次数据发送与接收成为一个连接事件。连接间隔则为两个连接事件之间的时间时间单位:1.25ms (比如 100 → 125ms )连接间隔的范围:7.5ms~4s。不同的应用可能会需要不同的连接间隔连接间隔的影响连接间隔小连接间隔大通信响应快通信响应慢功耗高功耗低适合高吞吐量应用如OTA、音频适合低功耗应用如传感器定时上报1.1.2 从设备延迟从设备延迟SlaveLatency是指 从设备可以跳过的最大事件数就是可以跳过几次间隔不回响应。此参数可以让从机跳过部分连接事件。如果设备没有数据需要用发送那么从机延时可以跳过连接事件并在连接事件期间停止射频从而降低功耗。从设备延迟范围0~499 但需保证有效连接间隔小于16s。比如文档示例如下1.1.3 监督超时监督超时SupervisionTime-out 两个有效连接事件间的最大时间。超过这个时间没有收到包则认为连接断开设备退回未连接状态。时间单位:10 ms监督超时的范围10100ms~320032s。超时时间必须大于有效连接间隔。必须满足Supervision Timeout (1 Slave Latency) × Connection Interval × 2超时时间 (ms)(1延迟次数)×连接间隔 (ms)×21.2 连接参数更新在主机和从机连接以后是可以更新上面的几个连接参数的但是都需要协商。从机可以更改参数主机也可以更改连接参数。在主机示例工程中使用下面函数更新参数/** * brief Update the link connection parameters. * * param connHandle - connection handle * param connIntervalMin - minimum connection interval in 1.25ms units * param connIntervalMax - maximum connection interval in 1.25ms units * param connLatency - number of LL latency connection events * param connTimeout - connection timeout in 10ms units * * return SUCCESS: Connection update started started.BR * bleIncorrectMode: No connection to update.BR */externbStatus_tGAPRole_UpdateLink(uint16_tconnHandle,uint16_tconnIntervalMin,uint16_tconnIntervalMax,uint16_tconnLatency,uint16_tconnTimeout);在从机示例工程中使用下面函数更新参数/** * brief Update the parameters of an existing connection * * param connHandle - the connection Handle * param connIntervalMin - minimum connection interval in 1.25ms units * param connIntervalMax - maximum connection interval in 1.25ms units * param latency - the new slave latency * param connTimeout - the new timeout value * param taskId - taskID will recv L2CAP_SIGNAL_EVENT message * * return SUCCESS, bleNotConnected or bleInvalidRange */externbStatus_tGAPRole_PeripheralConnParamUpdateReq(uint16_tconnHandle,uint16_tconnIntervalMin,uint16_tconnIntervalMax,uint16_tlatency,uint16_tconnTimeout,uint8_ttaskId);更新包含以下参数最小连接间隔、最大连接间隔、从设备延迟、监督超时函数GAPRole_PeripheralConnParamUpdateReqGAPRole_UpdateLink谁调用仅 Peripheral仅 Central底层行为先发协商请求 → 主机回 RSP → 再发 UPDATE_IND直接发 UPDATE_IND或先协商再发协商阶段✅ 有从机→主机✅ 也有4.2 主机先发 PARAM_REQ本地生效通知独立回调函数peripheralParamUpdateCB()centralEventCB()里GAP_LINK_PARAM_UPDATE_EVENT分支返回值SUCCESS / bleAlreadyInRequestedMode …SUCCESS / bleIncorrectMode …主机可以拒从机的“建议”从机的话按理来说应该是可以拒绝的个人测试开发板是没有拒绝自己参数设置外的值。本质上是主机说了算。1.3 关于保活建立连接以后保活永远是主机先发起从机回应 不管有没有从设备延迟主机永远按每个简介间隔询问。如果设定了从设备延迟从机可以在期间不回应但是主机必须按时出现询问。1.4 连接间隔的实际时间上面虽然我们知道了什么事连接间隔但是在我们示例中都需要定义两个时间最小连接间隔和最大连接间隔他是一个范围那么连接上以后他到低是多少时间呢1.4.1 连接间隔的确定连接间隔是如何确定的我们能够很直观的看到从机设备都是需要给定最小最大范围的主机会在自己策略允许的前提下挑一个落在从机区间里的值。虽然是不可控的但是也不是随机的主机内部有自己的算法用户体验策略但它必须先把你给的区间扫一遍主机会根据自己的性能定位在区间内挑一个 ≥ min 且 ≤ max 的 1.25ms 整数倍且固定不变直到下一次更新考虑的方面比如自己系统性能档位iOS ≥15 ms、音频 20 ms、鼠标 30 ms …多从机排班避开已有设备的跳频点功耗策略前台 App 要快、后台要省Wi-Fi 共存避开 100/200 ms 倍数连接间隔的确定 是主机根据自身策略做的确定性选择只是从机无法预知具体会选哪一点。如果想确定一个准确的时间间隔从机可以把最小连接间隔和最大连接间隔设定为相同的时间这样就把连接间隔给固定下来。但是呢主机有可能拒绝的这个要看主机自己的配置和状态比如自己多设备从图占用了某些固定设备的间隔等等。但是即便如此主机还是可以协商其他范围的值比如设定了最小的 6 7.5ms ,手机会重新发起协商换一个值告诉从机从机一般来说无法拒绝 (博主使用的 CH58x 示例来测试是没有拒绝的) 。比如1.4.2 连接间隔时间是多少上面说了实际的连接间隔会在从机和主机建立连接以后由主机确定但是这个时间是多少主机并不会主动告诉从机但是在示例中从机可以通过自己注册的回调函数peripheralParamUpdateCB查看staticvoidperipheralParamUpdateCB(uint16_tconnHandle,uint16_tconnInterval,uint16_tconnSlaveLatency,uint16_tconnTimeout){if(connHandleperipheralConnList.connHandle){peripheralConnList.connIntervalconnInterval;peripheralConnList.connSlaveLatencyconnSlaveLatency;peripheralConnList.connTimeoutconnTimeout;PRINT(Update %x - Int %x \n,connHandle,connInterval);}else{PRINT(ERR..\n);}}1.4.3 为什么 Ble 协议需要范围间隔为什么连接间隔不能是一个固定值反正从机确定主机按照固定值连接就好了。其实上面也说到了如果主机连接多个从机大家有冲突的话就会有设备连接不上了而且这样做是为了在 “用户体验”、“射频共存” 和 “功耗” 三者之间留动态调节空间。比如一些常用的设备设备从机声明区间手机实际分配耳机6 – 1210 ms鼠标8 – 5030 ms温湿度计100 – 20001 s手环40 – 200200 ms手机把四段区间做 TDM时分复用让不同设备错开跳频点避免撞包。另外苹果/安卓设备有硬性指标 :iOS ≥ 15 msHID 除外某些 Android 旧机 ≤ 24 ms 会触发 Wi-Fi 共存模块报警如果从机写死 10 msiPhone 直接砍掉 15 ms此时协议栈需要再挑一个“离你最近且我合法”的值有区间就能 “向上取整”没区间就只能连不上。二、 CH58x 示例体现下面来结合实际代码看看上面的这些参数在程序中用到的地方2.1 初始化在从机例程peripheral中有4个宏定义分别对应了最小连接间隔最大连接间隔从设备延迟监督超时// Minimum connection interval (units of 1.25ms, 67.5ms)//最小连接间隔#defineDEFAULT_DESIRED_MIN_CONN_INTERVAL6// Maximum connection interval (units of 1.25ms, 100125ms)//最大连接间隔#defineDEFAULT_DESIRED_MAX_CONN_INTERVAL100// Slave latency to use parameter update//从设备延迟默认不延迟#defineDEFAULT_DESIRED_SLAVE_LATENCY0// Supervision timeout value (units of 10ms, 1001s)//监督超时 1S 超时#defineDEFAULT_DESIRED_CONN_TIMEOUT100初始化的时候从机使用下面代码设置连接间隔// Setup the GAP Peripheral Role Profile{uint8_tinitial_advertising_enableTRUE;uint16_tdesired_min_intervalDEFAULT_DESIRED_MIN_CONN_INTERVAL;uint16_tdesired_max_intervalDEFAULT_DESIRED_MAX_CONN_INTERVAL;// Set the GAP Role ParametersGAPRole_SetParameter(GAPROLE_ADVERT_ENABLED,sizeof(uint8_t),initial_advertising_enable);GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA,sizeof(scanRspData),scanRspData);GAPRole_SetParameter(GAPROLE_ADVERT_DATA,sizeof(advertData),advertData);GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL,sizeof(uint16_t),desired_min_interval);GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL,sizeof(uint16_t),desired_max_interval);}上面没有设置的从机设备延迟默认为0 如果从机不设置最小最大值就使用默认值官方默认值如下//! Minimum Connection Interval to allow (n * 1.25ms).//Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80).//Read/Write. Size is uint16_t.//Default is 7.5 milliseconds (0x0006).#defineGAPROLE_MIN_CONN_INTERVAL0x311//! Maximum Connection Interval to allow (n * 1.25ms).//Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80).//Read/Write. Size is uint16_t.//Default is 4 seconds (0x0C80).#defineGAPROLE_MAX_CONN_INTERVAL0x312对应的主机初始化的时候也有连接参数的初始化。主机有默认的最小连接间隔最大连接间隔监督超时参数也有用于协商更新的 最小连接间隔最大连接间隔从设备延迟监督超时参数初始化如下voidCentral_Init(){centralTaskIdTMOS_ProcessEventRegister(Central_ProcessEvent);// Setup GAPGAP_SetParamValue(TGAP_DISC_SCAN,DEFAULT_SCAN_DURATION);GAP_SetParamValue(TGAP_CONN_EST_INT_MIN,DEFAULT_MIN_CONNECTION_INTERVAL);GAP_SetParamValue(TGAP_CONN_EST_INT_MAX,DEFAULT_MAX_CONNECTION_INTERVAL);GAP_SetParamValue(TGAP_CONN_EST_SUPERV_TIMEOUT,DEFAULT_CONNECTION_TIMEOUT);2.2 参数更新对于我们主机和从机都可以发起参数更新从机是协商请求主机类似于下达通知。2.2.1 从机从机使用GAPRole_PeripheralConnParamUpdateReq更新连接参数在示例中步骤如下//启动任务事件tmos_start_task(Peripheral_TaskID,SBP_PARAM_UPDATE_EVT,SBP_PARAM_UPDATE_DELAY);//执行事件if(eventsSBP_PARAM_UPDATE_EVT){// Send connect param update request// When the current connection parameters already meet the requirements for update, return 0x18(InvalidRange)GAPRole_PeripheralConnParamUpdateReq(peripheralConnList.connHandle,DEFAULT_DESIRED_MIN_CONN_INTERVAL,DEFAULT_DESIRED_MAX_CONN_INTERVAL,DEFAULT_DESIRED_SLAVE_LATENCY,DEFAULT_DESIRED_CONN_TIMEOUT,Peripheral_TaskID);return(events^SBP_PARAM_UPDATE_EVT);}2.2.2 主机主机使用GAPRole_UpdateLink更新连接参数在示例中步骤如下//启动任务事件tmos_start_task(centralTaskId,START_PARAM_UPDATE_EVT,DEFAULT_PARAM_UPDATE_DELAY);//执行事件if(eventsSTART_PARAM_UPDATE_EVT){// start connect parameter updateGAPRole_UpdateLink(centralConnHandle,DEFAULT_UPDATE_MIN_CONN_INTERVAL,DEFAULT_UPDATE_MAX_CONN_INTERVAL,DEFAULT_UPDATE_SLAVE_LATENCY,DEFAULT_UPDATE_CONN_TIMEOUT);return(events^START_PARAM_UPDATE_EVT);}2.3 更新结果查看这里直接在最前面说清楚从机设备 连接参数更新成功是会在注册的独立的回调函数peripheralParamUpdateCB中处理。主机设备 连接参数更新成功是在回调函数centralEventCB的分支事件GAP_LINK_PARAM_UPDATE_EVENT中处理。角色本地通知通道入口函数Peripheral独立回调peripheralParamUpdateCB()Central统一事件回调centralEventCB()里case GAP_LINK_PARAM_UPDATE_EVENT:主机为什么走任务事件不走单独的回调函数呢因为中心设备要同时管理多条连接如果每条连接都单独开一个回调指针每一个都需要占用 RAM 空间浪费RAM空间而且后期操作的时候不方便使用统一回调可以方便管理多连接。这里额外说明一下对于主机连接多个从机:// 主机保存着 8 条连接的上下文参数更新for(i0;iMAX_CONNECTIONS;i){if(centralConnList[i].stateGAPROLE_CONNECTEDcentralConnList[i].paramUpdateNeeded){// 只更新这一条从机GAPRole_UpdateLink(centralConnList[i].connHandle,newMin,newMax,newLatency,newTimeout);centralConnList[i].paramUpdateNeededFALSE;}}//结果 centralEventCB 中caseGAP_LINK_PARAM_UPDATE_EVENT:p(gapLinkUpdateEvent_t*)pMsg;// p-connHandle 告诉你“到底是哪条连接”PRINT(从机 %04X 新间隔 %d ms\n,p-connHandle,p-connInterval);break;2.4 更新流程上面我们知道了主机和从机都有自己的更新成功接收的地方。那么它们自己发出的更新请求自己是否会触发回调呢其实这个是异步的这个只要记住一点不管参数更新请求是谁先发只要通过协议栈的协商确定通过后同一连接事件末尾双方都会收到通知。比如主机发送GAPRole_UpdateLink- 从机接收到并且同意协议栈自动完成 - 同一连接事件末尾主机进centralEventCB里的GAP_LINK_PARAM_UPDATE_EVENT分支 同时从机进peripheralParamUpdateCB()。从机发送GAPRole_PeripheralConnParamUpdateReq- 主机接收到并且同意协议栈自动完成- 同一连接事件末尾主机进centralEventCB里的GAP_LINK_PARAM_UPDATE_EVENT分支 同时从机进peripheralParamUpdateCB()。中间如果不同意两边都不会发生。三、 补充说明本小节作为补充内容说明一些实际情况下的连接参数的设定持续更新。3.1 苹果设备连接参数iOS 系统对于连接参数有一些要求如果不满足规定iOS 主机会拒绝请求下面参数 (旧规则 )仅供参考因为 IOS 更新有时候会更新这个规则The connection parameter request may be rejected if it does not comply with all of these rules:Interval Max * (Slave Latency 1) ≤ 2 secondsInterval Min ≥ 20 ms iOS 18 15msInterval Min 20 ms ≤ Interval MaxSlave Latency ≤ 4connSupervisionTimeout ≤ 6 secondsInterval Max * (Slave Latency 1) * 3 connSupervisionTimeout.最大连接间隔时间 *从机延迟 1 ≤ 2s最小连接间隔时间 ≥ 20 ms iOS 18 的系统 15ms最小连接间隔时间 20 ms ≤ 最大连接间隔时间从机延迟 ≤ 4超时时间 ≤ 6s最大连接间隔时间 从机延迟 1 * 3 超时时间在博主自己查阅了一些资料以后从 Apple 官方文档《Accessory Design Guidelines for Apple Devices》 中有最新的介绍2026.2.9 查阅最新连接参数如下Peripheral Latency ≤ 30 connection intervals.Supervision Timeout from 6 seconds to 18 seconds.Interval Min ≥ 15 ms.Interval Min ≤ 2 seconds.Interval Min is a multiple of 15 ms.One of the following:Interval Max at least 15 ms greater than Interval Min.Interval Max and Interval Min are both 15 ms.Interval Max * (Peripheral Latency 1) of 6 seconds or less.Supervision Timeout greater than Interval Max * (Peripheral Latency 1) * 3..从机延迟Peripheral Latency≤ 30 个连接间隔。监督超时Supervision Timeout6 秒18 秒。最小连接间隔Interval Min≥ 15 毫秒。最小连接间隔Interval Min≤ 2 秒。最小连接间隔Interval Min必须是 15 毫秒的整数倍。满足以下条件之一最大连接间隔Interval Max比最小连接间隔Interval Min大至少 15 毫秒最大连接间隔Interval Max与最小连接间隔Interval Min均为 15 毫秒。最大连接间隔 ×从机延迟 1≤ 6 秒。监督超时 最大连接间隔 ×从机延迟 1× 3。Apple 官方对此还有另外说明若配件的已连接服务包含低功耗蓝牙 HID 服务如蓝牙键盘、手柄部分设备可能接受低至 11.25 毫秒的连接间隔。注当最大连接间隔与最小连接间隔均设为 15 毫秒时部分设备如 Apple Watch会自动调整为 30 毫秒间隔以更好地平衡功耗与性能约束。Apple Watch 连接参数请求指南最小连接间隔Interval Min≥ 30 毫秒。最小连接间隔Interval Min必须是 30 毫秒的整数倍。满足以下条件之一最大连接间隔Interval Max比最小连接间隔Interval Min大至少 30 毫秒最大连接间隔Interval Max与最小连接间隔Interval Min均为 30 毫秒。3.2 苹果手机扫描不到蓝牙额外说明一个点对于苹果手机使用系统蓝牙除了 HID 设备其他的蓝牙设备都不会显示出来直观的现象就是苹果手机扫描不到普通的蓝牙设备。这个是正常现象这是手机自身的策略问题普通 BLE 设备的广播包在空中是公开的任何设备都能收到。iOS 系统设置之所以不显示是因为苹果认为这些设备不需要在系统层面配对而应该由各自的 App 负责扫描和连接。使用蓝牙调试的 APP 或者小程序调试设备即可正常的扫描和连接。结语到这里关于 BLE 蓝牙连接参数的内容基本全部讲清楚了通过本文的学习大家在以后应用中应该能够根据自己的应用适当的设置对应的参数。当然博主也是学习阶段通过示例代码以及参考了前辈们的文章对于主机发起的参数更新请求除了示例网上好像没有太多解释如果文章中有错误希望大家指出好了本文就到这里谢谢大家