很多人写Python版IoT边缘采集+轻量AI推理节点,一遇到上报延迟、偶发丢包就去乱调MQTT的keepalive、QoS参数,折腾半个月才发现问题全在业务逻辑的细节里。
采集推理逻辑别阻塞上报线程
- 传感器读取、TFLite微模型推理全丢进独立守护线程,主线程只负责MQTT连接维护和数据发送;缓存队列长度设为5即可,满了直接丢弃最旧的缓存,避免堆积占满内存。
- Linux环境下可通过
os.sched_setscheduler把上报线程优先级设为比采集线程高1级,用SCHED_FIFO调度策略,避免CPU高负载时上报任务被挤占。
MQTT参数别照搬网上默认配置
- 电池供电的低功耗场景,keepalive不要用默认60秒,直接设为120秒,每次发完数据留200ms socket等待时间再判断是否断连,实测能省30%以上信令功耗。
- QoS等级不用无脑设1:常规温湿度、状态类上报用QoS0即可,只有异常告警类数据走QoS1,避免网络波动时重传队列占满内存。
from queue import Queue
import threading
# 缓存队列,最多存5条待上报数据
data_queue = Queue(maxsize=5)
# 采集推理线程
def collect_worker():
while True:
raw = sensor.read()
# 跑TFLite微模型推理
infer_result = tflite_model.predict(raw)
if data_queue.full():
data_queue.get() # 丢弃最旧数据避免堆积
data_queue.put((raw, infer_result))
threading.Thread(target=collect_worker, daemon=True).start()
重连逻辑别做过长等待
- 断连重连不要用拉满到30秒的指数退避,前3次重连间隔设为1秒、2秒、3秒,之后固定5秒间隔即可,过长的等待时间会导致异常场景下数据断供太久。
以上参数和逻辑调整后,我在树莓派Zero、ESP32-S3(MicroPython)场景下实测,端到端上报延迟稳定在200ms以内,连续运行30天内存占用波动不超过5MB。
评论一下?