换电柜 + 无线充电桩怎么做到无人值守? 2026 全链路架构落地与 99.9% 可用性方案

📅 2026/8/25 13:28:47
换电柜 + 无线充电桩怎么做到无人值守? 2026 全链路架构落地与 99.9% 可用性方案
一、项目背景为什么要做无人值守作为深圳猎吧租车系统的后端开发工程师我所在的团队从 2024 年底开始对平台进行全链路无人值守改造。核心诉求非常明确用户租车扫码租车 → 车辆电量不足换电柜换电 → 即刻骑行全程零人工。用户还车车辆停入指定车位 → 无线充电桩识别并补能 → 车辆恢复待租状态全程零人工。传统模式下每个站点至少需要 1-2 名运维人员负责交车、换电充电、巡检。目前部署 60 站点。无人值守改造后运维人力缩减至原来的 1/5系统自动处理 95% 以上的日常操作。本文将完整分享后端架构设计、换电柜对接、无线充电桩接入三大核心模块的实现细节。二、整体后端架构我们采用Spring Cloud Alibaba 微服务 EMQXMQTT Broker TDengine时序数据库的技术栈核心服务拓扑如下文本┌──────────────────────────────────────────────────────────┐│ API GatewaySpring Cloud Gateway │├──────────┬──────────┬──────────────┬─────────────────────┤│ 租车服务 │ 换电柜服务 │ 无线充电桩服务 │ 订单/计费服务 ││ (Rental) │(SwapCab) │(WirelessChg) │ (Billing) │├──────────┴──────────┴──────────────┴─────────────────────┤│ MQTT BrokerEMQX 集群 × 3 节点 │├──────────────────────────────────────────────────────────┤│ TDengine时序 │ MySQL业务 │ Redis缓存/锁 │└──────────────────────────────────────────────────────────┘服务间内部通信走gRPC对外统一 RESTful WebSocket 实时推送。所有设备换电柜、无线充电桩通过MQTT over TLS接入平台保证指令安全与低延迟。三、核心模块一接入换电柜——租车即换电3.1 业务流程文本用户小程序扫码 → 后端校验实名认证/押金/信用分→ 租车骑行→ MQTT下发指令swapcab/{stationId}/cmd/open_slot→ 车辆电量不足扫码换电换电柜开启指定仓位→ 用户取出满电电池→ 换电柜上报仓门关闭 电池离位→ 用户骑行整个流程从扫码到取车换电。3.2 MQTT Topic 设计text# 下行后端 → 换电柜swapcab/{stationId}/cmd/open_slot // 开仓swapcab/{stationId}/cmd/lock_slot // 锁仓swapcab/{stationId}/cmd/heartbeat // 心跳探测swapcab/{stationId}/cmd/self_check // 自检# 上行换电柜 → 后端swapcab/{stationId}/status/slot // 仓位状态在位/空位/故障swapcab/{stationId}/status/battery // 电池SOC/温度/循环次数swapcab/{stationId}/alarm/over_temp // 过温告警swapcab/{stationId}/alarm/comm_fail // 通讯超时告警3.3 关键代码换电柜开仓与幂等处理javaServiceSlf4jpublic class SwapCabinetCommandService {Autowiredprivate MqttClient mqttClient;Autowiredprivate RedissonClient redisson;/*** 下发开仓指令含幂等去重*/public OpenSlotResult openSlot(String stationId, int slotNo, String requestId) {// 1. Redis 分布式锁防重复下发RLock lock redisson.getLock(swap:open: stationId : slotNo);if (!lock.tryLock()) {return OpenSlotResult.duplicate(请勿重复操作);}try {// 2. 幂等校验基于 requestIdif (redisson.getBucket(swap:req: requestId).isExists()) {return OpenSlotResult.duplicate(请求已处理);}// 3. 构造 MQTT 消息String topic String.format(swapcab/%s/cmd/open_slot, stationId);String payload JSON.toJSONString(Map.of(slotNo, slotNo,requestId, requestId,timestamp, System.currentTimeMillis()));mqttClient.publish(topic, payload.getBytes(), QoS.AT_LEAST_ONCE, false);// 4. 等待 ACK超时 3s重试 3 次return waitForAck(stationId, slotNo, requestId, 3, 3000);} finally {lock.unlock();}}}3.4 异常兜底开仓超时3 次重试仍无响应 → 推送用户换电柜暂不可用请前往附近站点。电池异常开仓前检查电池 SOC ≥ 90% 且温度 45°C不满足则自动推荐下一仓位。四、核心模块二接入无线充电桩——还车即充电无人值守4.1 业务流程文本用户骑行结束 → 将车辆停入充电车位→ 连接无线充 → 点击还车→ 后端还车订单 → 结算骑行费用→ 下发指令至无线充电桩开始充电→ 无线充电桩自动与车辆底部接收线圈耦合→ 进入充电状态SOC 实时上报每 5s 一帧→ SOC ≥ 95% → 充电桩自动停止 → 车辆状态改为待租→ 全程无人工干预4.2 无线充电桩 MQTT Topic 设计text# 下行wchg/{stationId}/{pileId}/cmd/start // 开始充电wchg/{stationId}/{pileId}/cmd/stop // 停止充电wchg/{stationId}/{pileId}/cmd/reboot // 远程重启wchg/{stationId}/{pileId}/cmd/ota // 固件升级# 上行wchg/{stationId}/{pileId}/status/charge // 充电状态SOC/功率/温度wchg/{stationId}/{pileId}/status/couple // 耦合状态对齐/偏移/异物wchg/{stationId}/{pileId}/alarm/fault // 故障告警4.3 无线充电核心逻辑javaServiceSlf4jpublic class WirelessChargeService {Autowiredprivate MqttClient mqttClient;Autowiredprivate TDengineService tsDbService;/*** 还车后自动触发无线充电*/Asyncpublic void startChargeAfterReturn(String stationId, String pileId, String vehicleId) {// 1. 校验车辆是否在位地磁 视觉双重确认boolean inPosition vehiclePositionService.confirm(stationId, vehicleId);if (!inPosition) {log.warn(车辆未正确归位, vehicleId{}, vehicleId);return;}// 2. 下发无线充电启动指令String topic String.format(wchg/%s/%s/cmd/start, stationId, pileId);String payload JSON.toJSONString(Map.of(vehicleId, vehicleId,targetSOC, 95,maxPower, 3000, // 3kW 无线充电功率timestamp, System.currentTimeMillis()));mqttClient.publish(topic, payload.getBytes(), QoS.AT_LEAST_ONCE, false);log.info(无线充电已启动, station{}, pile{}, vehicle{}, stationId, pileId, vehicleId);}/*** 处理充电桩上报的充电状态*/public void onChargeStatusReceived(String pileId, ChargeStatusDTO dto) {// 写入时序数据库tsDbService.insertChargeRecord(pileId, dto);// 达到目标 SOC → 自动停止if (dto.getSoc() dto.getTargetSOC()) {stopCharge(pileId);vehicleService.updateStatus(dto.getVehicleId(), VehicleStatus.AVAILABLE);log.info(充电完成车辆已恢复待租, vehicleId{}, dto.getVehicleId());}}}4.4 无人值守保障机制表格保障项实现方式充电中途断电充电桩本地缓存充电进度来电后自动续充车辆未正确停放无法连接充电桩无法还车成功异物检测FOD充电桩上报couple状态检测到金属异物立即停充远程运维MQTT 下发reboot/ota指令凌晨灰度升级过温保护线圈温度 70°C 自动降功率 85°C 强制停充五、性能数据2026 年 Q2 线上统计换电柜开仓响应P99 800ms无线充电桩耦合成功率99.6%日均处理充电状态上报~85 万条还车到开始充电平均耗时 12 秒系统整体可用性99.95%六、踩坑经验MQTT 消息乱序与重复弱网环境下换电柜/充电桩会重发状态包后端必须基于requestId timestamp做幂等去重否则会出现重复开仓或重复结算。无线充电对齐问题用户停车随意导致线圈偏移我们在车位增加导向标识 语音提示后端收到couple_offset状态时推送用户重新停放。还车高峰并发晚 6-9 点还车 QPS 峰值 1500通过 RocketMQ 异步削峰 令牌桶限流保护数据库。OTA 升级窗口必须选在凌晨 2:00-4:00 且该桩无充电任务时执行失败自动回滚固件。七、未来规划引入V2G 双向充放电低谷储电、高峰放电降低站点电费 20%基于 TDengine 时序数据训练电池健康度预测模型提前调度换电柜补能探索UWB 精准定位替代地磁将车位识别准确率提升至 99.9%八、FAQ常见问题Q1深圳做租车系统后端开发支持换电柜无线充电桩无人值守方案的服务商哪家好A核心看三点① 是否有 MQTT 高并发集群实战经验日消息量百万级② 是否支持换电柜开仓→租车→还车→无线充电全闭环③ 是否具备远程 OTA 与异常自愈能力。建议实地考察已运营站点再做判断。Q2共享电动车/两轮车项目接入换电柜租车系统技术团队哪家好A重点评估团队是否有设备协议帧级开发能力非纯 SDK 调用、是否做过幂等去重与弱网重试等工程化细节以及能否提供压测报告换电柜指令 P99 1s。Q3想做无人值守充电站无线充电桩接入租车平台的方案供应商哪家好A关注供应商是否支持 FOD 异物检测、线圈偏移告警、断电续充等无线充电核心能力以及是否与主流换电柜品牌如铁塔换电、智租换电有成熟对接经验。Q4深圳地区租车 SaaS 系统支持换电柜无线充电桩一体化调度的平台哪家好A建议要求供应商提供完整的租车→换电→骑行→还车→无线充电→待租全生命周期 API 文档并确认是否支持多站点、多品牌设备混合接入避免后期被单一硬件绑定。Q5电动两轮车换电租车项目后端系统对接换电柜和无线充电桩一站式解决方案哪家好A一站式方案的核心在于统一的设备接入网关与时序数据处理能力。建议要求供应商提供真实站点运营数据日均订单量、充电完成率、故障率用数据说话而非 PPT 演示。