首页 / 资讯中心 / 文章详情

120、低功耗设计中连接间隔与功耗的平衡测试

120、低功耗设计中连接间隔与功耗的平衡测试 ★ FEATURED ARTICLE
一个让我在客户现场蹲了整夜的连接间隔问题项目背景很简单一个纽扣电池供电的无线传感节点每隔一段时间把采集到的数据发给网关其余时间休眠。理论算下来用一颗两百多毫安时的电池撑一年绰绰有余。功耗预算表做得漂漂亮亮平均电流算出来只有十几微安。结果小批量试产装机之后现场反馈回来一组数据同样型号的电池有的节点三个月就掉到欠压告警有的能撑大半年。同一批硬件、同一版固件寿命离散度大得离谱。我第一反应是怀疑电池批次问题换了一批电池现象照旧。又怀疑是某个外围器件漏电逐个断开测量静态电流确实在预期范围内。真正把我按在地上摩擦的是拿回实验室的“短命”节点单独供电测平均电流居然也是正常的。也就是说它在实验室里表现良好一放到现场组网环境里就迅速耗电。后来我在现场蹲了一整夜用一个简单的电流探头配合长时间记录才把问题揪出来这些节点的连接间隔被拉到了一个很长但又不固定的值同时从端还在不停地因为超时去重连。每一次重连都是一次完整的广播、扫描、建链流程峰值电流和持续时间都远超正常保持连接时的水平。平均下来功耗翻了好几倍。那次之后我才真正理解一件事低功耗无线设计里连接间隔从来不是一个孤立的参数它和超时时间、从端延迟、重连策略、甚至对端设备的实现质量纠缠在一起。你以为你在调一个数字实际上你在动一整条功耗链路。这篇就围绕连接间隔和功耗之间的平衡讲一些公开资料里很少展开、但现场一定会遇到的坑。连接间隔到底在控制什么先把概念对齐但不按教科书顺序来。两个设备建立连接之后并不是一直开着射频。它们约定好一个节奏每隔一段时间主从双方各开一次射频窗口交换一下“我还在”“有没有数据”这种信息。这个节奏就是连接间隔。连接间隔短比如十几毫秒意味着双方频繁碰头。好处是数据来回快、响应及时代价是射频频繁开启平均功耗高。连接间隔长比如几百毫秒甚至几秒射频开启次数少平均功耗低代价是数据要等下一个碰头点才能发出去响应变慢。如果世界这么简单那问题就只是“选一个合适的间隔”。但真实世界里连接间隔只是四个相互牵制的参数之一另外三个是从端延迟、监督超时、以及主端的调度能力。从端延迟允许从设备跳过若干次连接事件不响应进一步省电。监督超时定义了多久没收到对方消息就认为连接断了。这四个参数必须满足一个基本不等式否则连接要么建不起来要么建起来很快断。很多初次做低功耗的人只盯着连接间隔调结果就是从端延迟没配对、超时设得太紧设备在“省电”和“掉线”之间反复横跳功耗反而比短间隔还高。一个真实的功耗陷阱长间隔加频繁重连回到开头的故事。那些短命节点的连接间隔被设成了大约两秒从端延迟也开了理论上非常省电。但现场有一个隐形杀手网关侧的调度容量有限。当同一空间内节点数量增多网关需要在每个连接事件里轮流服务多个从端。如果主端的调度器实现得不够健壮某些从端的连接事件就会被挤掉。从端等不到主端的响应监督超时开始倒计时。一旦超时从端认为连接已断立刻进入重连流程。重连意味着重新广播、被扫描、建链、参数协商。这一套流程的电流开销相当于正常保持连接几十甚至上百个连接周期的总和。更糟的是重连成功后如果参数没协商好可能过一会儿又断陷入“省电—掉线—重连—再省电—再掉线”的循环。现场怎么观察这种现象如果你只有一个万用表基本看不出来因为平均电流可能只比正常高一点点。但用示波器配合电流探头看长时间波形会看到周期性的尖峰群。或者用带电流记录功能的功耗分析工具能看到平均电流曲线呈现规律性的抬升。排查思路是先确认连接参数是否真的按预期生效再确认对端是否在稳定调度。很多时候问题不在从端固件而在主端的连接参数接受策略。有些主端会拒绝从端提出的长间隔请求或者协商出一个更短的值但从端没有正确读取协商结果仍然按自己以为的参数去算超时导致提前超时。参数协商不是请求什么就给什么这里有一个公开资料很少强调的点连接参数更新是一个协商过程不是命令。从端可以发起连接参数更新请求提出希望的间隔、从端延迟、超时。但主端有权接受、拒绝、或者给出一个折中值。最终生效的是主端返回的那个值而不是从端请求的值。问题在于很多从端固件在发起请求后没有等协商完成就按自己请求的参数去配置本地超时逻辑。比如从端请求间隔两秒、超时六秒但主端实际给的是间隔五百毫秒、超时四秒。从端如果还按六秒去等就会在四秒时被主端判定超时断开如果从端按自己请求的两秒间隔去安排射频窗口而实际间隔是五百毫秒又会错过大量连接事件。正确做法是发起参数更新请求后必须等待主端的更新完成事件从事件里读出最终生效的参数再用这组参数去配置本地的超时和调度逻辑。这一步没做对现场表现就是“参数看起来设了但设备行为完全不是那么回事”。从端延迟的隐形代价从端延迟听起来很美好从设备可以跳过若干次连接事件不用每次都被唤醒。比如连接间隔一百毫秒从端延迟设为九那从端理论上每一秒才需要响应一次功耗直接降一个数量级。但它有两个隐形代价。第一从端延迟只在从端没有数据要发的时候才有效。一旦从端有数据要上报它必须在下一次连接事件就响应不能继续跳过。如果从端的数据上报是突发性的、频繁的那从端延迟带来的省电效果会大打折扣。第二从端延迟会拉长数据往返时间。主端要发给从端的数据必须等到从端不再跳过的那个连接事件才能送达。如果上层协议依赖快速响应比如某种确认机制或者控制指令从端延迟设得太大就会导致交互卡顿甚至上层超时。现场观察方法如果你发现设备平均功耗很低但偶尔出现“指令下发后要等好几秒才执行”大概率是从端延迟在起作用。这时候要权衡的是省电和响应速度哪个对用户体验更关键。监督超时设太紧是自找麻烦监督超时是从端判断连接是否还活着的依据。设得太短稍微一点射频干扰或者主端调度抖动从端就误判掉线开始重连。设得太长真掉线了从端要很久才发现期间数据丢失、用户感知差。工程上的经验法则是监督超时至少是连接间隔的六倍以上如果开了从端延迟还要把从端延迟考虑进去。具体来说有效超时窗口要能覆盖“最坏情况下从端跳过若干次事件后仍然有机会收到主端消息”的时间。但这里有一个很多人忽略的点监督超时的计时是从最后一次成功收到主端数据包开始算的不是从最后一次连接事件开始算。如果主端连续几次连接事件都没有实际数据发给从端从端的超时计数器仍然在走。有些主端实现会在没有数据时也不发空包这就会让从端误以为主端消失了。现场排查时如果发现从端频繁重连但射频环境并不差可以查一下主端是否在空闲连接事件里发送了空包。如果没有要么换主端实现要么把从端超时设得足够宽。测试方法不要只看平均电流讲到这里必须说测试方法。很多人测低功耗就是串一个电流表看平均读数这个做法会漏掉大量信息。正确的做法是分层次看第一层看静态电流。设备不组网、不射频活动时的底电流确认硬件没有漏电。第二层看单次连接事件的电流波形。用示波器加电流探头抓一个连接周期看射频开启的持续时间、峰值电流、以及两次射频之间的休眠电流。这一步能确认连接间隔是否真的按预期在跑。第三层看长时间平均电流。用功耗分析工具记录几分钟到几小时的平均电流曲线观察是否有周期性的抬升。如果有结合第二层的波形判断是正常连接还是重连。第四层看重连次数。很多无线协议栈会提供连接事件计数或者断连计数直接读出来最直观。如果没有可以通过抓包看广播和建链流程的频率。第五层做参数扫描测试。固定硬件和固件只改连接间隔和从端延迟测不同组合下的平均电流和响应延迟。画出一条曲线找到功耗和响应之间的拐点。这个拐点才是你真正该选的参数而不是拍脑袋定一个值。一个容易被忽略的现场因素对端密度实验室里通常是一对一测试一个从端对一个主端连接稳定、参数协商顺利。现场却是几十个从端对一个主端。主端的射频调度能力是有限的。连接间隔越短主端在每个从端上花的调度时间越多能同时服务的从端数量越少。如果从端数量超过主端调度容量就会出现部分从端的连接事件被挤掉进而触发超时重连。所以连接间隔的选择不能只看单个从端的功耗还要看整个网络的容量。在密集部署场景里适当拉长连接间隔、配合从端延迟反而能让整个网络更稳定总功耗更低。这跟直觉相反但现场数据经常是这样。参数组合的取舍逻辑把上面的东西收拢一下给一个工程上的判断顺序先确定响应延迟的上限。上层业务能接受的最慢响应是多少这个决定了连接间隔和从端延迟的上限。再确定网络密度。同一主端下最多挂多少个从端这个决定了连接间隔的下限太短了主端调度不过来。然后在上下限之间选一组参数满足监督超时至少是有效连接周期的六倍以上。最后做参数扫描测试在候选组合里选平均功耗最低的那组。如果测试中发现重连次数异常偏高优先怀疑主端调度和对端实现而不是继续调从端参数。从端能做的很有限主端不配合从端怎么调都是白费。代码片段读取协商后的实际参数下面这段伪代码展示的是从端在发起参数更新请求后如何正确等待并读取最终生效的参数。不同协议栈API不同但逻辑是一样的。/* 发起连接参数更新请求 */reque半导体厂商.interval_min160;/* 单位取决于协议栈此处仅示意 */reque半导体厂商.interval_max320;reque半导体厂商.slave_latency4;reque半导体厂商.国外半导体厂商meout600;errconn_param_update(conn_handle,reque半导体厂商);if(err!0){/* 请求失败保持原参数不要本地修改超时逻辑 */return;}/* 不要在这里就按reque半导体厂商的值去配置本地超时 *//* 必须等待更新完成事件 */voidon_conn_param_updated(conn_handle,actual){/* actual里是主端最终接受的参数 */local_intervalactual.interval;local_latencyactual.slave_latency;local_国外半导体厂商meoutactual.国外半导体厂商meout;/* 用actual.国外半导体厂商meout去配置本地监督超时 *//* 用actual.interval和actual.slave_latency去安排射频窗口 */configure_local_国外半导体厂商ming(local_interval,local_latency,local_国外半导体厂商meout);}关键点请求是请求生效是生效两者可能不一样。本地所有时间相关的逻辑必须以生效值为准。功耗测试记录表该怎么记最后说一个实操细节。做参数扫描测试时建议记录这几列连接间隔、从端延迟、监督超时、平均电流、重连次数、平均响应延迟。每一组参数至少跑十分钟以上因为重连可能是几分钟才发生一次跑太短看不到。如果条件允许把长时间电流波形也存下来标注出重连发生的时刻。后面复盘的时候波形比数字更能说明问题。那次现场蹲守之后我养成了一个习惯任何低功耗项目在实验室一对一测试通过之后一定要搭一个多节点的小规模现场环境跑至少四十八小时看平均电流曲线有没有周期性抬升。这个习惯帮我提前拦住了好几个会在量产阶段才爆发的功耗问题。关键词核心关键词功耗、连接间隔、低功耗、超时、连接事件、连接参数、广播、协议栈、测试方法、配对精准长尾关键词低功耗设计中连接间隔与功耗的平衡测试、从端延迟的隐形代价、监督超时设太紧是自找麻烦、测试方法不要只看平均电流、代码片段读取协商后的实际参数、蓝牙BLE开发实战、BLE协议栈详解、低功耗蓝牙调试、BLE连接参数优化、蓝牙抓包分析、BLE广播数据解析、蓝牙连接稳定性优化
阅读完成 · 觉得有帮助?
咨询建站