ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

自建物联网平台设备接入层实战:从协议选型到MQTT接入全解析

自建物联网平台设备接入层实战:从协议选型到MQTT接入全解析 1. 从零自建物联网平台设备接入层到底要解决什么问题做物联网平台这件事最容易被低估的就是设备接入这一层。很多人觉得设备能联网、能发数据就完事了但实际上设备连接层的设计决定了你后面数据的质量、系统的稳定性和扩展边界。这一篇是这个“Build Your Own IoT Platform”系列的第二部分我专门把 Connecting to Devices 拿出来讲因为我自己在第一次自建 IoT Platform 的时候就是在这一块踩了最多坑。为什么单独写设备连接因为前面你可能还在设计产品原型、画架构图但一旦进入真正接线、烧固件、连服务器的阶段所有问题都会从抽象变成具体这个设备怎么证明自己的身份断网了怎么办消息会不会丢数据到了服务端之后怎么和这个设备对应起来这些都不是用一个云产品能简单掩盖的你需要自己把链路打通。这篇文章适合谁如果你正好在计划自建私有物联网平台或者已经在用开源 Broker 做设备接入希望把设备端和服务端的连接细节梳理清楚那这篇可以帮你少走不少弯路。我会从协议选型、设备侧实现、服务端接入、完整实操到问题排查都过一遍。目标是让你看完之后能独立把一台真实设备接到自己的平台上并且知道每一步为什么这么做。1.1 为什么要自己搭平台而不是直接买现成的这个问题我在团队里被问过很多次。现成的物联网云平台确实很方便注册账号、创建产品、烧录 SDK半天就能看到数据上云。但当你遇到下面这些情况现成平台就会变成一道墙。首先是数据边界。有些项目对数据存放位置有明确要求数据必须留在自己的服务器或者内网环境里这时候所有数据都要经过第三方平台的方案直接被否掉。其次是大规模定制。现成平台通常给你一套固定的设备模型、消息格式、告警规则你可以配置但很难深度修改。做产品原型还行一旦要做差异化功能比如自定义设备影子、私有协议解析、和设备内部业务系统深度联动你得想办法在人家平台上“绕路”。还有一个很容易被忽略的成本问题。平台按连接数、消息量、存储空间计费设备规模到几千台、消息频率高一点账单涨得很快。自建平台初期要花精力但长期按固定服务器成本走心里反而有底。当然我不是建议所有场景都自建。如果你只是做三五台设备的小试验直接用现成平台是最快的。但如果你和我一样需要掌握整个链路、想把它作为一个长期基础设施来打磨那早一点把设备接入层亲手搭起来回报会很大。1.2 设备连接层在平台中的位置一个自建物联网平台简单拆开看是五层设备端、接入网关、消息处理、数据存储、应用展示。设备连接层就是这里的“接入网关”和“消息处理”的组合它是设备数据的唯一入口也是指令下发时的统一出口。我习惯把这层称为平台的“门卫室”。设备要进来先要通过身份认证进门之后你要告诉它应该去哪条走廊携带的数据要用什么格式如果它很久没活动要怎么处理。所有后面做数据分析、实时监控、告警联动的前提都是这一层能稳定地收到可信、有序、可追溯的设备消息。如果设备接入没有设计好后面数据清洗、存储、展示全都会被污染。这一层还承担了一个容易被忽略的职责协议转换。设备端的硬件千奇百怪有的走 MQTT有的走 HTTP有的是私有串口协议通过网关转发。接入层的职责是屏蔽这些差异把不同接入方式产生的消息统一成平台内部的标准事件让上层业务不用关心消息到底来自哪种设备。这也是后面我们做数据建模和指令下发的基础。2. 设备接入协议选型MQTT、CoAP、HTTP还是私有TCP协议选型是设备连接的第一步也是最容易“吵起来”的一步。每个团队都有自己的一堆理由有的说 HTTP 简单有的说 MQTT 才是物联网标配还有的直接告诉你“我们设备是老协议改不了”。我的经验是没有绝对最好的协议只有最适合当前场景的协议。但多数场景下MQTT 确实值得优先考虑。2.1 主流协议横向对比先把几个常见选项放在一张表里看这样选型时心里会有个轮廓。协议模型是否长连接QoS支持适用场景主要优点主要缺点MQTT发布/订阅是是传感器上报、指令下发、大规模设备接入低带宽、低功耗、异步解耦、社区生态好Broker 需要额外维护调试稍复杂CoAP请求/响应类似HTTP可无连接是Confirmable/Non-confirmable资源受限的嵌入式设备、UDP环境基于UDP开销小支持组播生态相对小复杂交互能力弱HTTP/HTTPS请求/响应否不支持靠应用层重试设备低频率上报、简单API调用通用、简单、防火墙友好长连接成本高服务端推送能力弱私有TCP自定义是可自定义心跳自定义特殊硬件、已有私有协议完全可控可针对底层优化开发量大兼容性和可维护性差这张表里最关键的分水岭是“服务端能否主动推动数据到设备”。HTTP 在标准模型里是做不到的设备必须时刻轮询或者靠 WebSocket 等扩展能力。而物联网里大量场景是“平台主动控制设备”比如远程开关灯、调整温控器、下发配置。MQTT 的发布/订阅模型天然就是一个通道双向通信非常顺畅。2.2 为什么我把 MQTT 作为首选我目前所有自建平台项目里除了极个别历史遗留设备一律先用 MQTT。理由不复杂。第一消息异步解耦。设备端不需要关心服务端有多少个消费者它只管往某个 Topic 发布消息。平台侧无论是实时流处理、告警模块还是存储模块都各自订阅需要的 Topic。这种模式在系统扩容时特别舒服新增一个分析模块只需要增加一个订阅者不用改设备端代码。第二QoS 机制能帮你平衡实时性和可靠性。QoS 0 最多一次适合高频遥测数据QoS 1 至少一次适合控制指令和重要事件QoS 2 恰好一次适合计费等绝不能重复的业务。注意QoS 不是免费的午餐级别越高消息确认链路越复杂性能也越低。我在实际项目里的默认组合是批量遥测 QoS 0事件类数据 QoS 1控制指令 QoS 1 应用层确认。第三心跳和遗嘱机制非常贴合物联网场景。设备通过 Keep Alive 向 Broker 证明自己还活着Broker 一旦在指定时间内没收到心跳可以主动断开连接。遗嘱消息可以为突然离线的设备发布一条“我下线了”的事件这比你自己去扫描所有设备状态要简单得多。很多做设备状态管理的朋友一开始不知道这个特性还在服务端写定时任务纯属浪费时间。2.3 选型时容易被忽略的细节协议选型不能只看网络层面还要看硬件资源。我当时接手过一个项目设备主控芯片只有几十 KB 可用内存跑完整 MQTT 客户端库有点吃力。加上业务上报频率很低每次只需要上传几个字节温湿度数据最后我们采用了 HTTP POST 上报 MQTT 长连接接收指令的混合方案。上报走 HTTP简单无状态指令下发走 MQTT服务端可以随时推。这种“上报走轻量、下发走实时”的组合在资源受限设备上很实用。另外一个容易踩坑的是网络环境。如果设备分布在不同的局域网、甚至移动网络后面你就要考虑 NAT 穿透和防火墙策略。MQTT 默认走 1883 端口很多办公网络和家用路由器默认不开放你需要保证设备能访问到对应端口。如果网络条件比较苛刻可以把 Broker 前置到 443 端口走 WebSocket 或 TLS这样大多数防火墙都能放行。这些细节在选型阶段就要提前想好不然真到了批量部署的时候才发现端口不通那才叫难受。3. 设备侧连接实现身份、消息与保活协议定好之后真正写设备端代码之前必须先把“身份”“消息格式”“保活策略”三件事定下来。这三件事不做好后面每加一种设备就要痛苦一次。3.1 设备身份与认证设计设备连接平台的第一步是告诉平台“我是谁”。我见过不少项目直接用设备 MAC 地址作为唯一标识但这有个问题MAC 地址容易伪造而且在某些虚拟化环境下不可靠。更常见的是平台在设备注册时给每个设备生成一个全局唯一的设备 ID同时下发一个密钥或令牌设备连接时用它做认证。在 MQTT 里这些信息可以映射到三个字段Client ID设备全局唯一标识比如device_xxxxxxxxxxxxBroker 用它识别连接。Username可以是设备所属产品的标识比如product_xxx方便在 Broker 层做分组管理。Password设备密钥可以是动态生成的令牌也可以是设备证书的指纹。不要把真实的密钥明文烧死在设备代码里。我建议设备首次激活时通过一个一次性激活接口换取短期会话令牌后续连接都使用令牌。如果硬件条件不支持至少也要保证密钥存储在设备的安全存储区并且可以远程轮换。很多物联网安全事件就是设备密钥硬编码导致的全网沦陷值得警惕。顺便说一句设备 ID 的生成规则也要有讲究。我习惯用产品ID-批次号-序号这种可读格式比如sensor_temp_a12-202405-0001。它看起来长但排查问题时能一眼看出设备来源比一长串无规律 UUID 好用得多。3.2 Topic 结构与数据格式设计设备与服务端之间的通信全部通过 Topic 进行所以 Topic 设计的好坏直接影响后续维护难度。这里有三条原则含义明确、便于通配订阅、避免层级过深。我常用的 Topic 结构是devices/{deviceId}/telemetry devices/{deviceId}/event devices/{deviceId}/command devices/{deviceId}/command_acktelemetry周期性上报的遥测数据比如温湿度、电量。event设备主动上报的事件比如按钮按下、告警触发。command平台下发指令给设备。command_ack设备对指令的确认回复。这样设计的好处是服务端可以用一个通配符订阅devices//telemetry接收所有设备的遥测也可以用精确 Topic 单独控制某台设备互不干扰。消息内容我统一用 JSON 格式并强制带一个版本号和毫秒级时间戳{ v: 1, ts: 1733100000000, data: { temperature: 26.5, humidity: 60.2 } }加v字段是为了以后消息体升级时还能兼容旧设备加ts是因为网络传输有延迟服务端需要以设备时间为准排序。这两点是我在项目里吃过亏之后才补上的。早期消息里没有时间戳设备离线一段时间后重新上线数据排序完全乱套后面对账对到怀疑人生。3.3 心跳、遗嘱与自动重连的实现思路长连接设备最担心的问题是“连接断了但客户端不知道”。所以心跳机制非常必要。MQTT 里设备发起 CONNECT 包时带一个 Keep Alive 值单位是秒。Broker 如果在 1.5 倍时间内没收到客户端任何消息就会判定连接断开。我在设备端一般这样设置如果数据上报周期是 10 秒Keep Alive 就设为 30 秒到 60 秒。取这个值的原因是上报本身也是一种活动会刷新心跳时间所以 Keep Alive 只要覆盖最大上报间隔的两到三倍即可不必设得太短太短反而会让弱网环境下的设备频繁掉线。遗嘱消息Last Will是配合心跳用的。设备连接时可以告诉 Broker“如果我异常掉线请替我发布一条消息到某个 Topic。”我在服务端就订阅这个 Topic任何设备非正常离线都能立刻感知。自动重连必须设计退避策略否则大批设备同时断网后一起重连会对 Broker 形成“重连风暴”。我常用的指数退避算法如下import random delay 1 max_delay 60 while not connected: try: connect() break except Exception: sleep(delay random.uniform(0, 1)) delay min(delay * 2, max_delay)这里加随机抖动是为了避免多台设备在同一时刻重试。实际项目里如果 1000 台设备同时掉线没有退避策略第一批请求就能把 Broker 和网络打满。这个坑我替大家踩过了切记。4. 服务端接入层搭建Broker、鉴权与数据接入设备端再完善服务端接不住也是白搭。服务端接入层是整个平台的“网关”这一节我会从 Broker 选型、鉴权配置、后端订阅、指令下发四个方向展开。4.1 Broker 选择先别急着上集群自建物联网平台最核心的组件就是 MQTT Broker它负责接收所有设备的长连接、处理消息路由。很多人一上来就想着搞集群、高可用其实对绝大多数初期项目来说一台配置好一点的服务器跑单机 Broker 就够了。我在不同阶段用过三个 Broker简单对比一下Broker特点适用规模Mosquitto轻量、稳定、配置简单依赖少几百台到几千台设备适合学习和中小项目EMQX功能丰富内置规则引擎、监控面板集群支持好几千台以上设备需要批量管理和扩展性VerneMQ基于 Erlang分布式能力较强自动集群对多节点集群有强需求的场景我的建议是第一个项目用 Mosquitto因为它简单、资源占用小能让你把注意力放在业务逻辑上。当设备量上来需要在线状态展示、规则转发、共享订阅等能力时再平滑迁移到 EMQX。这个迁移过程不会浪费之前的设计因为 MQTT 协议是标准的设备和后端代码都能复用。4.2 快速配置 Mosquitto 开启鉴权与 ACL默认安装的 Mosquitto 允许匿名连接这在公网环境等于裸奔。所以第一件事就是关掉匿名访问配置用户密码。创建密码文件sudo mosquitto_passwd -c /etc/mosquitto/passwd device_001然后修改 Mosquitto 配置文件/etc/mosquitto/mosquitto.confallow_anonymous false password_file /etc/mosquitto/passwd listener 1883 protocol mqtt如果还需要 WebSocket 访问可以再加一个监听端口listener 8083 protocol websockets加上密码文件只是第一步还要做 ACL访问控制列表让每个设备只能访问自己的 Topic不能随便订阅别人的数据。Mosquitto 的 ACL 配置如下acl_file /etc/mosquitto/acl # 设备只允许发布自己的遥测和事件 topic read devices/device_001/command topic write devices/device_001/telemetry topic write devices/device_001/event topic write devices/device_001/command_ack这样即使密钥泄露影响范围也控制在单台设备不会让攻击者拿到全量数据。生产环境建议再叠加 TLS 加密用 CA 签发的证书保证传输层安全。4.3 后端服务订阅消息去重与幂等写入设备消息进入 Broker 之后还需要一个后端服务把它们消费、解析、写入存储。这个小服务我一般用 Python 写因为 Paho MQTT 客户端库简单、跨平台适合快速迭代。一个最基本的订阅程序如下import paho.mqtt.client as mqtt import json import time def on_connect(client, userdata, flags, rc): print(connected with result code, rc) client.subscribe(devices//telemetry, qos1) def on_message(client, userdata, msg): try: payload json.loads(msg.payload) device_id msg.topic.split(/)[1] ts payload.get(ts, int(time.time() * 1000)) data payload.get(data, {}) save_to_database(device_id, ts, data) except Exception as e: # 解析失败的消息需要单独记录不能静默丢弃 log_to_dlq(msg.topic, msg.payload, str(e)) client mqtt.Client() client.username_pw_set(backend, backend_password) client.on_connect on_connect client.on_message on_message client.connect(localhost, 1883, 60) client.loop_forever()这里有个关键点当订阅 QoS 为 1 时服务端可能收到重复消息。所以写入数据库时要用“设备 ID 时间戳”作为唯一键或者先查重再插入保证幂等。否则网络抖动一次你会看到数据凭空多了一条后面统计报表全是错的。我还会专门建一个死信队列表所有解析失败或格式异常的消息都落进去。这个习惯非常重要因为设备端是多种多样的总有一些设备发来奇怪的数据如果你直接丢弃事后发现数据缺失再去设备上查日志成本高到无法接受。4.4 指令下发链路设计指令下发是自建平台里最有存在感的功能。设备端一直长连接挂着平台端通过发布消息到devices/{deviceId}/command设备收到后执行动作再发command_ack确认。这里的核心难点是“如何保证指令一定被执行”。MQTT 的 QoS 1 只能保证消息送达但设备收到指令后执行失败、或者执行成功但 ack 丢了服务端是无感知的。所以我在指令里加了一个request_id设备执行完必须回传同样的request_id{ request_id: c_12345, action: set_temperature, params: { value: 26 } }服务端发布指令后把request_id标记为待确认状态并启动超时定时器。如果 30 秒内没收到对应的command_ack就重新下发几次重试都失败就告警。这套“应用层确认 超时重试”机制比单纯依赖 MQTT QoS 可靠得多。5. 实操过程ESP32 接入自建平台的完整链路这一节我们走一遍实实在在的接入流程。我用 ESP32 作为设备端通过 MQTT 接入一个本地自建的 Mosquitto Broker。整个过程包括硬件准备、设备端代码、服务端验证三个环节。5.1 准备硬件与环境硬件方面ESP32 开发板一块温湿度传感器 DHT11 或 DHT22 一个公母杜邦线若干。软件方面需要Arduino IDE 或 ESP-IDF 开发环境PubSubClient 库Arduino 生态最常用的 MQTT 客户端库本机安装好的 Mosquitto Broker接线很简单DHT11 的 VCC 接 3.3VGND 接 GNDDATA 接 GPIO 4。DHT11 的供电和数据引脚中间接一个 4.7kΩ 上拉电阻会更稳定但很多模块板自带电阻可以不接。5.2 设备端代码关键部分下面是 ESP32 的关键代码片段。里面定义了设备 ID、用户名、密码、Topic 等参数并在回调函数里处理服务端下发的指令。#include WiFi.h #include PubSubClient.h #include DHT.h #define DHTPIN 4 #define DHTTYPE DHT11 const char* ssid your_wifi_ssid; const char* password your_wifi_password; const char* mqtt_server 192.168.1.100; const char* device_id device_001; const char* mqtt_username device_001; const char* mqtt_password your_device_secret; const char* tele_topic devices/device_001/telemetry; const char* cmd_topic devices/device_001/command; WiFiClient espClient; PubSubClient client(espClient); DHT dht(DHTPIN, DHTTYPE); void reconnect() { while (!client.connected()) { Serial.print(Attempting MQTT connection...); if (client.connect(device_id, mqtt_username, mqtt_password)) { Serial.println(connected); client.subscribe(cmd_topic); } else { Serial.print(failed, rc); Serial.println(client.state()); delay(5000); } } } void callback(char* topic, byte* payload, unsigned int length) { String message String((char*)payload).substring(0, length); // 解析指令 JSON根据 action 执行对应动作 // 完成后发布 command_ack } void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } client.setServer(mqtt_server, 1883); client.setCallback(callback); dht.begin(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); static unsigned long lastSend 0; if (millis() - lastSend 10000) { float h dht.readHumidity(); float t dht.readTemperature(); String payload String({\v\:1,\ts\:) millis() ,\data\:{\temperature\: String(t) ,\humidity\: String(h) }}; client.publish(tele_topic, payload.c_str()); lastSend millis(); } }这里我特意没有把重连退避逻辑写进这个简单的reconnect()函数里实际项目里请把第三小节的指数退避思路加进去。另外client.loop()必须高频调用它是维持 MQTT 收发包的关键少了它你会发现设备连接很快超时。5.3 在服务端验证整条链路设备代码烧录之前先在 Broker 机器上跑一个订阅命令观察消息是否真实到达mosquitto_sub -h localhost -t devices//telemetry -v设备启动几秒后你应该能看到类似输出devices/device_001/telemetry {v:1,ts:...,data:{temperature:26.5,humidity:60.2}}如果看不到先检查 Broker 日志再用mosquitto_pub手动发一条消息确认 Broker 本身工作正常。图形化工具我推荐 MQTTX跨平台支持模拟设备调试时非常直观。它还能同时订阅多个 Topic方便你观察指令和确认消息的交互。5.4 参数计算与调优示例接入完成之后还要算一笔账你的平台到底能扛多少设备、需要多大带宽。假设每台设备每 10 秒上报一次遥测每条消息约 90 字节。上报频率是 0.1 条/秒单设备带宽大约是 90 字节 × 0.1 9 字节/秒。如果设备数量是 1000 台总入口速率就是 9 字节/秒 × 1000 9000 字节/秒约 72kbps。这个量级对服务器和网络完全构不成压力。但如果同时存在指令下发每条指令约 80 字节假设有 10% 的设备每秒收到一条指令就是 80 × 100 8000 字节/秒也算不上高。真正需要关注的是 Broker 的连接数。每台设备占用一个 TCP 连接单机 Mosquitto 在默认配置下撑住几千个并发连接通常没问题但如果连接数上万就要提高系统文件描述符上限并且考虑横向扩展。我建议你在压力测试时把每秒消息数、连接数、CPU 和内存指标都记录下来这会在后期做容量规划时帮到你。6. 常见问题与排查技巧实录设备接入过程中有些问题每个人都会碰到。我把最常见的几类整理出来按现象、原因、排查步骤来写可以直接对照着用。6.1 认证失败与连接被拒设备端日志报Connection refused / Not authorized最常见的原因有三个用户名密码错误、Client ID 冲突、ACL 配置没生效。排查时先用mosquitto_sub或mosquitto_pub手动测试mosquitto_sub -h localhost -u device_001 -P your_device_secret -t test -v如果手动测试也不行说明 Broker 端认证配置有问题。检查mosquitto.conf里password_file路径是否正确allow_anonymous是否已经关闭ACL 文件是否包含了topic read/write权限。还有一个不起眼但很常见的坑多个设备使用了相同的 Client ID后连接的设备会把先连接的设备踢下线。此时设备表现为反复重连服务端日志里会出现Client already connected。6.2 设备频繁掉线与重连风暴设备连接几分钟就掉线然后重启又连上周而复始。这通常是心跳机制不匹配导致的。先看设备的 Keep Alive 设置再看看 Broker 是否设置了最大心跳时间。有些设备为了保证实时性把心跳设成 5 秒但网络一抖动就容易超时而 Broker 默认可能不允许过大的 Keep Alive。我的建议是设备端心跳时间保持在 30 秒以上除非你确实需要秒级在线状态。如果批量设备同时掉线十有八九是网络故障或 Broker 重启导致。此时必须检查设备端退避策略。没有随机抖动的指数退避还是会造成重连风暴。另外也可以在 Broker 前加一层负载均衡不让所有设备都直连同一台实例这样单台故障时能缓解重连压力。6.3 消息重复、乱序与丢失使用 QoS 1 时会收到重复消息这是协议语义决定的不是 Bug。服务端要做幂等处理用设备 ID、时间戳或消息序号去重。消息乱序也是一个常见问题尤其是设备离线一段时间后重新上线积压的旧消息和新消息混在一起到达。我在消息格式里强制加了ts时间戳存储时按(device_id, ts)排序可以很大程度缓解乱序问题。注意如果你用 MQTT 的 retain 消息机制也要小心它带来的不确定性retain 消息会一直被 Broker 保存设备订阅时立刻收到旧数据容易造成业务误判。消息丢失则基本都发生在 QoS 0 场景。如果你对某些事件数据不能容忍丢失就把这些消息的 QoS 改为 1同时接受重复消息的可能性。6.4 网段与端口导致连不上设备能和 Broker 同网段相连换到另一个网络就不行。这种情况优先检查端口是否被防火墙拦截。1883 端口在办公网和云厂商安全组里经常默认不放行要么开放端口要么把 MQTT 服务迁移到 443 端口并启用 WebSocket/TLS。在云服务器上还要注意安全组规则很多人改了 Broker 监听地址但忘了同步安全组导致外部设备始终连不上。排查时可以先用telnet broker_ip 1883测试端口连通性如果能通但 MQTT 连不上再看认证和 ACL。6.5 问题速查表现象可能原因优先排查手段连接被拒 Not authorized用户名/密码错误或ACL缺失手动mosquitto_sub测试认证设备反复掉线重连Client ID 冲突或 Keep Alive 过短查看 Broker 日志检查 CONNECT 参数消息重复使用 QoS 1 导致重复投递服务端做幂等去重消息乱序积压消息和新消息混合使用毫秒级时间戳排序收不到指令Topic 订阅关系不对或 ACL 未授权用 MQTTX 手动订阅查看批量设备同时掉线Broker 重启或网络抖动启用指数退避随机抖动7. 后续扩展与实际应用心得把设备连上平台只是第一步后面更重要的是让它“连得稳、连得安全、连得可管理”。7.1 从“能连上”到“连得稳”如果你希望平台能支撑生产环境建议尽早补上设备影子、会话保存和离线消息这几个能力。设备影子是平台侧保存的设备状态缓存即使设备离线应用层也能读取最新状态会话保存让设备重新上线后能收到离线期间下发的指令离线消息则把指定 Topic 在设备离线期间积累的消息持久化待设备上线后补发。这些能力有的需要 Broker 支持比如 EMQX 的离线消息和保留会话有的需要自己在业务层实现。7.2 安全加固的几个方向设备接入的安全不能只依赖一条密码。生产环境至少要往三个方向做一是传输加密给 Broker 配置 TLS 证书设备端校验 CA防止中间人窃听。二是设备身份升级从用户名密码方式逐步过渡到 TLS 双向认证每台设备烧录唯一客户端证书平台通过校验证书链确认设备身份。三是密钥生命周期管理定期轮换设备密钥吊销可疑设备这一块最好做成一个小工具方便运营人员操作。7.3 踩坑后的真实体会做设备接入这一路我最大的体会是协议选型别追求炫酷设计消息格式时多留一点余地身份认证宁可一开始做复杂一点也不要后面补。尤其是 Topic 结构和消息字段一旦设备量产改起来等于所有固件都要升级。我印象最深的一次事故就是早期没有在消息里加时间戳设备端因为某种原因重启后所有数据的时间都变成了服务器接收时间结果一整天报表数据全乱。从那以后我定了一条铁律所有设备上报数据必须带设备时间戳服务端数据校验先看时间再看内容。自建物联网平台的设备接入层没有太多玄学就是把细节抠到位。希望这篇文章能帮你把这条路走得顺一点。如果你也在做类似的事情欢迎把你的经验分享出来让这个领域少掉一点坑。
返回列表