车联网实战:TDMQ MQTT + 云函数打造车辆状态智能响应链路
随着车联网规模化落地,车辆终端数量持续增长,状态上报、事件告警、远程控制等业务对云端架构提出了更高要求:
海量设备接入和弱网环境下保障消息的低延迟、稳定收发;
消息到达后快速完成业务判断、流程联动和结果回传。
本文以车辆低电量告警为例,演示如何通过 TDMQ MQTT + 云函数 SCF 构建事件驱动的车辆状态智能响应链路,实现从设备上报、消息触发、函数处理到指令回传的高效闭环。
方案架构:TDMQ MQTT 与 SCF 如何协同
车端与云端的通信通常包含两类形态,它们对架构的诉求差异很大:
两者通过 MQTT 触发器无缝衔接,可以把车端状态变化直接转化为云端业务响应。
TDMQ MQTT
MQTT 是基于发布/订阅模式的轻量级通信协议,构建于 TCP/IP 之上,天然适合车机、传感器等资源受限的终端设备。腾讯云 TDMQ MQTT 是面向物联网、车联网 等场景打造的高可用 MQTT 消息队列服务:
全面兼容标准 MQTT 5.0 协议
支持 千万级 终端接入
轻量级消息通信 与上下行消息分发
千万级 Topic Filter 通配符订阅
内置 消息查询、消息轨迹追踪等 可观测性能力
Topic Filter
MQTT 协议定义了带通配符的订阅方式:+ 匹配单层路径、# 匹配多层路径。例如订阅 sh/tcu/+/battery 可一次性接收所有车辆的电量事件,无需在应用层做分流,TDMQ MQTT 在服务端完成过滤与投递。
云函数 SCF
腾讯云云函数(SCF)是事件驱动的无服务器计算服务,能够由 MQTT 消息触发并按需执行,无需开发者关心底层服务器部署、扩容与运维。在车联网场景中,SCF 可根据车辆状态上报实时触发告警判断、指令生成等后续业务流程,并根据消息流量自动伸缩;同时,不同业务逻辑可拆分为独立函数,围绕 MQTT Topic 解耦演进。
整体架构:从车端上报到指令下发
下图展示了一条完整的事件驱动链路,重点关注图中标注的四个阶段——它们分别由车端 SDK、TDMQ MQTT、SCF、HTTP API 承担,互相之间通过 Topic 解耦。
车端接入:车端 TCU 通过 MQTT SDK 与 TDMQ MQTT 建立长连接,周期性将电量、位置等状态发布到结构化 Topic(如
sh/tcu/{vin}/battery),同时订阅下行控制 Topic(如sh/tcu/{vin}/command)接收云端指令。
消息路由:状态消息到达 TDMQ MQTT 后,下游各业务函数通过不同的 Topic Filter 订阅各自关心的消息子集。例如 Battery Guard 函数订阅
sh/tcu/+/battery,即可匹配所有车辆的电量事件。新增或下线消费方对发布端完全无感——这是整条架构 松耦合 的关键。
业务处理:每个云函数绑定自己的 MQTT 触发器,当匹配消息到达时自动触发执行。多个业务函数可以围绕同一事件源独立演进——推送提醒、智能导航、省电控制各自处理,避免把所有逻辑堆叠在单个常驻服务中。
指令回传:业务函数产生的控制指令(如「空调降档」)通过 MQTT HTTP API 发布到车端下行 Topic(如
sh/tcu/{vin}/command),车端 TCU 实时收到并执行。
至此,车辆状态感知、云端决策与车端执行形成完整的事件驱动响应闭环。
实战演示:车辆低电量告警
场景介绍
当车辆 TCU 检测到电量不足时,将电量状态通过指定 Topic 发送到 TDMQ MQTT,下游多个云函数监听并响应。不同云函数配置不同 Topic Filter 和消息属性匹配条件,灵活实现各自的服务,例如:
发送手机端低电量提醒
自动导航到最近的充电站
通过云端服务下发指令到 TCU,动态限制空调功率以节省电量
本演示聚焦第三个场景,用一个最小可运行的例子串起整条链路:
目标:电量 ≤ 30% 时云端自动把空调降档;≤ 10% 时直接关空调。
Topic 路由
sh/tcu/VIN001/battery | ||
sh/tcu/+/batteryBatteryGuard() | ||
sh/tcu/VIN001/command |
组件与运行环境
TCU Emulator — 车端模拟器(Rust)
TCU Emulator 通过 MQTT Rust SDK 与 TDMQ MQTT 通信,实现电量上报与指令接收。
程序入口(main.rs):配置 MQTT 连接并启动模拟器。
#[tokio::main]async fnmain() -> anyhow::Result<()> {let vin = "VIN001";// 1. 拼接 MQTT 接入点(mqtts 表示走 TLS)let access_point = format!("mqtts://mqtt-xxx.tencenttdmq.com:8883?client_id={}", vin);let mut opts = MqttOptions::parse_url(&access_point)?;opts.set_keep_alive(Duration::from_secs(30)); // 30s 心跳保活opts.set_credentials("root", "password"); // 鉴权(生产环境请用密钥)// 2. 启动模拟器:内部循环上报 + 订阅控制指令let mut emu = TcuEmulator::new(vin.to_owned(), opts);emu.run().await?;Ok(())}
数据上报循环(lib.rs):每秒上报一次电量,电量随空调功率消耗递减。
pub async fnrun(&mut self) -> anyhow::Result<()> {// 订阅控制指令 Topic(接收云端下发的 ac_power 指令)let command_topic = format!("sh/tcu/{}/command", self.vin);self.client.subscribe(command_topic, QoS::AtLeastOnce).await?;while self.battery > 0 {tokio::time::sleep(Duration::from_secs(1)).await;// 电量按当前空调档位递减,模拟真实耗电self.battery -= self.ac_power.load(Ordering::Relaxed);let status = BatteryStatus { battery: self.battery };// 发布到 sh/tcu/VIN001/battery(此处省略发布细节)}Ok(())}
接收云端指令:解析 MQTT 消息,动态调整空调功率。
fn process_event(event: Event, ac_power: &Arc<AtomicU8>){if let Incoming(Packet::Publish(publish))= event {if let Ok(cmd)= serde_json::from_slice::<Command>(&publish.payload) {info!("收到控制指令: {:?}", cmd);// 用原子变量更新空调档位,主循环下一秒生效ac_power.store(cmd.ac_power, Ordering::Relaxed);}}}
Battery Guard — 云端响应函数(Java)
Battery Guard 是 Java 云函数。函数入口接收 MqttEvent(触发消息)和 Context(运行上下文):
public class Main {public String mainHandler(MqttEvent event, Context context) {logger.info("request-id={}", context.getRequestId());trySavePower(event);return objectMapper.writeValueAsString(event);}}
核心逻辑:根据电量决定响应策略。
privatestaticvoidtrySavePower(MqttEvent event){for (Record record : event.getRecords()) {BatteryStatus status = objectMapper.readValue(record.getBody(), BatteryStatus.class);if (status.getBattery() <= 10) {turnOffAc(record); // ≤ 10%:关闭空调,保续航} else if (status.getBattery() <= 30) {savePower(record); // ≤ 30%:降低空调功率}}}
决策策略对照
> 30% | |||
10% ~ 30% | savePower() | {"ac_power": 1} | |
≤ 10% | turnOffAc() | {"ac_power": 0} |
控制指令发布:通过 HTTP 接口发布到 TDMQ MQTT,路由回 TCU。
static void publish(Record record, int targetAcPower) {String host = System.getenv("HOST");// 由上行 Topic 推导下行 Topic:sh/tcu/VIN001/battery → sh/tcu/VIN001/commandString topic = record.getProps().get("firstTopic")+ "/" + record.getProps().get("secondTopic");String commandTopic = topic.substring(0, topic.lastIndexOf('/') + 1) + "command";String url = String.format("https://%s/topics/%s?qos=1",host, URLEncoder.encode(commandTopic));Command cmd = new Command();cmd.setAcPower(targetAcPower);// HTTP POST 发送(细节略)}
这里的 HTTP 仅用于云函数向 TDMQ MQTT 发布下行控制消息;车端上行仍然通过 MQTT SDK 直连,二者职责不同。
前端展示页面
一个轻量 HTML 页面通过 MQTT WebSocket 订阅电量 Topic,实时展示状态变化:
client.on('message', (topic, message) => {if (topic.endsWith('command')) return; // 跳过控制指令const battery = JSON.parse(new TextDecoder().decode(message));setLinearProgress(battery.battery); // 更新电量进度条});
部署与运行效果
先决条件
已开通腾讯云 TDMQ MQTT 实例并记录接入点
在实例下创建命名空间,并配置 Topic:
sh/tcu/+/battery、sh/tcu/+/command创建鉴权用户与权限(替换示例代码中的
root/password)已开通云函数 SCF,并与 TDMQ MQTT 实例处于同地域
部署步骤
打包并部署 Battery Guard 云函数,配置 MQTT 触发器订阅
sh/tcu/+/battery浏览器打开前端展示页面(订阅 WebSocket)
启动 TCU Emulator 模拟器
运行后可观察到:电量持续上报、前端同步更新;电量降至阈值时函数自动触发,空调随之降档/关闭。
运行日志示例
[00:01] INFO TCU Emulator started, VIN=VIN001, battery=100%[00:02] INFO Battery: 98% → published to sh/tcu/VIN001/battery[00:12] INFO Battery: 48% → published[00:18] WARN Battery: 28% ≤ 30% threshold[00:18] SCF savePower() triggered → ac_power: 2 → 1[00:18] OK Command published: {"ac_power":1} → sh/tcu/VIN001/command[00:19] INFO TCU received command: ac_power=1, 空调已降档[00:25] ALERT Battery: 8% ≤ 10% threshold[00:25] SCF turnOffAc() triggered → ac_power: 1 → 0[00:25] OK Command published: {"ac_power":0} → sh/tcu/VIN001/command[00:26] INFO TCU received command: ac_power=0, 空调已关闭
链路验证:电量 ≤ 30% 时 SCF 自动触发 savePower(),空调从 2 档降到 1 档;≤ 10% 时触发 turnOffAc(),空调关闭。指令经 MQTT 路由回 TCU 并立即生效,前端同步更新。
方案优势
实时响应,零轮询:MQTT 消息到达即触发 SCF,无需常驻消费进程,从事件发生到系统响应延迟极低。
Serverless 弹性 + 成本优化:SCF 按消息频率自动伸缩,车端波峰波谷天然适配,零闲置成本,运维复杂度低。
松耦合,易演进:MQTT Topic 作为消息总线把"上报"与"处理"完全解耦。新增/下线业务模块(通知、导航、节能)对发布端无感。
全链路可观测:TDMQ MQTT 内置消息轨迹追踪与查询,配合 SCF 调用日志,从设备发送、Broker 路由、函数触发到指令回传每一步均可追溯。
延伸场景:不止于车联网
如果您的业务也有相关需求,欢迎在评论区留下您的使用场景和问题。
欢迎加入腾讯云 TDMQ MQTT 交流群
往期推荐
TDMQ MQTT 铂金版正式上线!全组件独占,最高支持100万 TPS,1000万连接数!
A2A over MQTT:腾讯云 TDMQ 创新 Agent 协作新模式
3-4月产品月报 | CKafka 公网架构与管理能力全面升级,RocketMQ 5.x 集群能力增强
百万级延迟消息稳定投递 - TDMQ Pulsar 的新解法:多级时间轮
扫描下方二维码关注本公众号,
了解更多微服务、消息队列的相关信息!