1. 搭建前先想清楚:这套平台到底要解决什么问题
最近帮朋友团队从零搭了一套物联网平台,从设备接入、数据存储到最终的可视化展示,前后大概用了不到一周的业余时间。整个过程踩了不少坑,也总结出一些可以直接复用的经验,这里完整分享一下,给正准备搭平台或者正在选型的朋友一个参考。
先说清楚这里说的“物联网平台”是什么。它不是指阿里云 IoT、华为云 IoT 那种商业 PaaS 服务,而是一套自托管的、能跑在自己服务器或虚拟机上的完整链路:设备端通过 MQTT 协议上报数据,平台侧负责接入、解析、存储、告警,最后用 Web 页面把数据展示出来。适合的场景包括:实验室环境里的 IoT 教学与实训、中小规模的生产环境监控、产品原型验证,以及想搞懂物联网数据流转全过程的个人学习项目。
平台要解决的痛点其实很明确。市面上商业物联网平台虽然功能全,但价格高、定制难、数据不落地,很多场景下你只是需要一个可控的、能改代码的私有平台。尤其是教学实训和原型验证场景,学生或开发者需要能看清楚数据是怎么从传感器一路跑到数据库和前端页面的,这要求平台足够透明,每一层都能拆开看、能手动操作。商业平台哪怕功能再强,也很难满足这种“从头到尾可控”的需求。
另一个要考虑的问题是技术栈选型。物联网平台不是单点技术,而是设备端、接入层、存储层、业务层、展示层五段式结构。每段都有成熟的工具,但组合方式非常多样,选型不同,后续的开发难度和运维成本差异巨大。我这次选择的是“EMQX + Node-RED + InfluxDB + Grafana”这套组合,后面我会逐个环节说明为什么这么选,以及有哪些替代方案和取舍。
适合来参考这篇内容的人,我总结为三类:一是刚接触到物联网、想快速跑通一套完整平台的入门者;二是学校或培训机构需要搭建物联网仿真实训环境、设计实验项目的老师;三是在企业内部做 IoT 原型验证,需要用最短时间做出可演示、可扩展的平台的开发者。
2. 整体架构选型:为什么我选 EMQX + Node-RED + InfluxDB 这套组合
2.1 五段式架构:每段都能独立替换才是关键
物联网平台的架构看起来简单,但真正动手时容易在选型和接口设计上纠结。我把整个链路拆成五段:设备端、接入层、数据处理层、存储层、展示层。每一段只做自己该做的事,段与段之间通过标准协议衔接,这样任何一段出问题都能单独排查、单独替换。
设备端用 ESP32、STM32 或树莓派这类常见硬件,实现传感器数据采集和 MQTT 发布。接入层是平台的入口,负责维护成千上万个设备的长连接,处理 MQTT 协议的订阅发布,并把消息路由给后续组件。数据处理层做规则引擎、数据清洗、格式转换,把原始报文变成业务数据。存储层负责时序数据的落盘,供历史查询和统计分析。展示层则是 Web 仪表盘或移动端页面,把数据变化实时呈现出来。
选择这五段各自的技术时,我的原则只有一个:标准优先,避免自造协议。设备端和接入层之间必须走 MQTT,这是物联网事实标准;存储层必须考虑时序数据的写入和查询特性;展示层最好能复用开源仪表盘,避免从头写图表组件。基于这些原则,最终选型是很自然的推导结果。
2.2 接入层选 EMQX 而不是自写 MQTT Broker
有人可能问:MQTT Broker 不是很多吗,Mosquitto 不是更轻量吗?为什么选 EMQX?我的考虑是这样:Mosquitto 确实轻量,但它的扩展能力、可视化管理、集群支持都比较弱,适合嵌入式设备上内嵌使用或极小的测试环境。EMQX 的优势在于高性能、插件丰富、有 Dashboard 管理界面,支持规则引擎直接转发数据,后续接入大量设备或做集群扩展都很方便。
这次选型 EMQX 还有个实际原因:Node-RED 里有现成的 MQTT 节点,EMQX 的 Webhook 能直接把消息推给 Node-RED 的 HTTP 接口,两者结合非常顺滑。如果从零写 Broker 或网关,链路调试成本会高很多。
2.3 数据处理用 Node-RED:可以不写后端代码就完成所有转流
Node-RED 是一个可视化编排工具,用“节点拖拽 + 连线”的方式实现数据流处理。对于物联网平台这种典型的数据流转场景,Node-RED 简直是量身定做的:MQTT 接收节点、JSON 解析节点、函数计算节点、HTTP 请求节点、数据库写入节点全都开箱即用,不需要写一行后端代码就能把“设备数据 → 格式转换 → 入库 → 告警通知”整个链路串起来。
我需要说清楚的一点是,Node-RED 不是玩具。我们这次搭的平台虽然以教学演示为目标,但 Node-RED 同样可以部署在正式生产环境,有完善的日志、断线重连和调试机制。对于中小规模场景(几百台设备、每秒几十条消息),它完全扛得住。如果哪天业务量暴涨,Node-RED 之上再叠加微服务也不冲突,因为它本身就是通过标准 HTTP 和数据库接口与外部系统交互的。
2.4 存储选 InfluxDB:时序数据就该用时序数据库
物联网产生的数据天生是时序的:每台设备、每个传感器,在时间轴上不断产生数值。传统关系型数据库不是不能存,而是查询和聚合效率太差。举个例子,你要查过去一小时温度的平均值,在 MySQL 里可能要写几十行 SQL 做时间窗口分组,而在 InfluxDB 里一条查询命令就能完成,性能还高一个量级。
InfluxDB 2.x 版本自带桶(Bucket)、标记(Tag)、字段(Field)等概念,还集成了 Flux 查询语言,非常契合物联网数据模型。同时它自带的 UI 可以做简单的数据探索,但更专业的可视化我还是交给了 Grafana,后者的仪表盘生态实在太丰富了。
2.5 工具选型对比表
| 层级 | 本次选型 | 常见替代 | 选型理由 |
|---|---|---|---|
| 设备端 | ESP32 / 树莓派 | STM32、Arduino | 生态成熟、自带 Wi-Fi、易上手 |
| 接入层 | EMQX | Mosquitto、EMQX 社区版 | 高性能、规则引擎、可视化 Dashboard |
| 数据处理 | Node-RED | 自写 Java/Go 后端 | 可视化编排、无需写复杂后端代码、调试方便 |
| 存储层 | InfluxDB 2.x | TimescaleDB、MySQL+定时任务 | 时序数据读写性能强、查询语法贴合场景 |
| 展示层 | Grafana + Node-RED Dashboard | ECharts 自研页面 | 图表丰富、告警功能完整、开发工作量小 |
3. 设备接入层实操:从物联网设备到平台的第一公里
3.1 MQTT 协议要点:Topic 设计是第一优先级
设备接入是整个平台最复杂、最容易出问题的一环。很多初学者在设备端把数据发出去就算完事,结果到了平台侧发现解析不了、区分不了设备、消息拥塞,问题的根源往往在 Topic 设计阶段就埋下了。
Topic 设计的核心原则是“层级清晰、设备可区分、语义明确”。我这次用的是三级 Topic 结构:/projectID/deviceType/deviceID。每个字段都有明确用途:projectID 用于区分不同项目或租户,deviceType 区分传感器类型(温湿度、烟感、定位等),deviceID 是设备唯一标识。这样做的好处有三个:第一,订阅时可以按层级模糊匹配,比如+/temperature/+可以订阅所有温度传感器的数据;第二,在 EMQX 的规则引擎中可以根据 Topic 段做消息路由;第三,排查问题时通过 Topic 就能快速定位是哪台设备上报的数据。
再强调一下最常见的错误:Topic 设计过于扁平。有人把所有设备都发到同一个 Topic(比如data/upload),设备标识全靠 JSON 报文里的一个字段区分。这样短期能跑通,但一旦设备数量增加,要做设备级权限控制、按设备类型分流时就非常痛苦,相当于给自己埋雷。吸取教训,Topic 的第一版设计就要认真做,不然后面越用越难受。
3.2 设备端模拟实操:不依赖硬件也能验证全部链路
搭建平台初期,不一定每个环节都有真实硬件可以联调。我用 Python 脚本模拟了一组传感器设备,每隔 5 秒向 MQTT Broker 发布一次温湿度数据。这个模拟脚本也可以直接用在后续的仿真实训中,学生不需要自己焊电路也能跑通整个物联网链路。
import json import random import time from paho.mqtt import client as mqtt_client BROKER = "192.168.1.100" PORT = 1883 TOPIC = "demo-001/temperature/sensor-001" client = mqtt_client.Client(client_id="sim-device-001") client.connect(BROKER, PORT, keepalive=60) while True: payload = { "temperature": round(random.uniform(20.0, 35.0), 2), "humidity": round(random.uniform(40.0, 70.0), 2), "ts": int(time.time() * 1000) } client.publish(TOPIC, json.dumps(payload), qos=1) print(f"published: {payload}") time.sleep(5)这段代码就是一个最基础设备端的骨架。paho-mqtt 是 Python 生态最常见的 MQTT 客户端库。发布时设置 qos=1 是为了保证消息至少送达一次,适合温湿度这种不要求严格实时性的数据。如果你做的是控制指令下发,建议 qos=0 或 1 都行,因为控制指令通常有应用层应答机制,不需要 MQTT 层重复投递。
3.3 设备接入时要命的认证问题
设备接入还有一个绕不开的问题:认证。在本地调试时可以不开启认证,但一旦平台要部署到局域网之外的服务器上,就必须配置 EMQX 的用户名密码认证,否则任何知道 Broker 地址的人都能往你的 Topic 里发消息。
EMQX 的认证配置很灵活,常见方案是使用内置数据库认证。在 Dashboard 里为每台设备创建独立的用户名和密码,设备端连接时携带这些凭据。更进阶的做法是通过 HTTP 认证插件对接你的业务系统,实现设备注册、动态颁发凭据。这个阶段建议先用简单方案,但架构上要留出扩展口。
有一个小细节容易被忽略:设备端的 client_id 必须是唯一的。MQTT 协议规定,如果两个客户端使用相同的 client_id 连接同一个 Broker,先连的会被踢下线。我们在实训中经常看到“设备频繁掉线”的现象,排查到最后发现就是多台设备复用了同一个 client_id。
3.4 实操心得:连接稳定性调试的三个阶段
设备接入的调试我一般分三步走。第一步,先检查网络连通性,确认设备能 ping 通 Broker 的 IP;第二步,用 MQTT 客户端工具(比如 MQTTX)手动连接 Broker,验证用户名密码和 Topic 是否有效;第三步,用模拟脚本测试数据上报,同时打开 EMQX Dashboard 的监控页面观察连接数和消息速率。
这三个阶段不能跳步,尤其是不要直接从硬件开始调。我见过太多人在 ESP32 上反复改代码,最后发现是 Broker 地址配错了,白白浪费一下午。先用手头的工具把链路打通,再切换到真实硬件,整个调试验证过程会特别顺。
4. 数据存储与流转:让海量时序数据有地方住
4.1 InfluxDB 数据模型:Measurement、Tag、Field 怎么设计
InfluxDB 的数据模型和其他数据库很不一样,它把一行数据分成三部分组成:Measurement(类似关系型数据库的表)、Tag(带索引的标签)、Field(实际存储的值)。设计数据模型的原则是:需要经常用来筛选、分组、聚合的字段设为 Tag,实际展示和计算的值设为 Field。
以温湿度数据为例,我的设计是:Measurement 命名为environment;Tag 设device_id、device_type、location;Field 设temperature和humidity。这样做的好处是查询“某个教室所有设备的平均温度”时,InfluxDB 会通过 Tag 索引快速定位,而不是全表扫描。
在设计阶段要提醒自己不要做的一件事:把时间戳写在 Field 里。InfluxDB 每一行数据自带时间戳,这就是它高效处理时序数据的基石。有人习惯把数据里的 ts 字段也存进去,结果查询时两组时间对不上,逻辑混乱,后面排查起来特别崩溃。
4.2 Node-RED 将 MQTT 消息写入 InfluxDB
Node-RED 里有一个现成的 InfluxDB 输出节点,配置好数据库地址、组织、Bucket 和测量名称后,就能直接把消息写入。但真实场景下,设备上报的原始 JSON 往往不能直接入库,需要先经过一个转换步骤。
我这里做了一个函数节点,把设备原始数据重映射成 InfluxDB 可接受的格式:
const raw = msg.payload; // 已解析的 JSON 对象 const parts = msg.topic.split("/"); // topic: demo-001/temperature/sensor-001 const fields = { temperature: raw.temperature, humidity: raw.humidity }; const tags = { device_id: parts[2], device_type: parts[1] }; msg.payload = [ { measurement: "environment", tags: tags, fields: fields, timestamp: new Date(raw.ts).valueOf() * 1000000 } ]; return msg;这里有个容易踩的坑:InfluxDB 的时间戳单位是纳秒,如果设备端给的是毫秒时间戳,直接写入会导致时间错乱,必须乘以 1000000 转换成纳秒。如果不转换,Grafana 上看到的时间会和真实时间差了很大一截,很容易让人误判是时区问题。我第一版就犯了这个错误,折腾了好一阵子。
4.3 数据保留策略与存储成本控制
物联网平台数据增长非常快。一台设备每 5 秒上报一条数据,一天就是 17280 条,一个月就是约 52 万条。如果不设保留策略,存储空间很快被撑爆。
InfluxDB 2.x 的 Bucket 自带保留策略,按照需求设置不同时长的数据保留周期。我一般把原始数据保留 30 天,聚合后的统计数据保留一年或更长,这样既能满足近期排查需求,又不会无限占用磁盘。规则引擎或定时任务可以每隔几分钟把原始数据聚合成平均值、最大值、最小值,存入另一个长期保留的 Bucket,这一招非常实用。
5. Web 应用与可视化:把数据变成能看能用的界面
5.1 Grafana 接入 InfluxDB 数据源
Grafana 接 InfluxDB 数据源非常简单,安装 Grafana 后在数据源配置里选择 InfluxDB,填好 URL、组织、Token、Bucket 信息,再写查询语句就行。我这里的查询语句用的是 Flux 语言:
from(bucket: "iot-data") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "environment") |> filter(fn: (r) => r._field == "temperature") |> aggregateWindow(every: 1m, fn: mean)这段查询的意思是:从 iot-data 桶里取出 environment 测量中 temperature 字段的数据,按每分钟窗口做平均值聚合。Grafana 的变量机制可以做到让用户在页面顶部选择设备 ID、时间范围,图表随之联动刷新,体验非常好。
5.2 告警规则配置:别等设备坏了才发现
可视化只是平台的一半,另一半是告警。Grafana 支持为图表绑定告警规则,当查询结果满足条件时触发通知。我配置了两类告警:一是温度超限(连续 5 分钟超过 35 度),二是设备离线(5 分钟内没有任何数据到达)。通知渠道可以接钉钉 Webhook、邮件或企业微信。
这里有一个实操要点:告警配置中“连续 N 分钟”这个参数非常关键。如果只配置单次触达阈值,传感器偶发抖动就会产生大量误报。我实测下来,设置“连续 3 个采样周期超过阈值”作为告警条件,误报率能降低 90% 以上。代价是告警会延迟几分钟,但在大多数物联网场景下这个延迟完全可接受,远比误报造成的“狼来了”效应要好。
5.3 终端控制指令下发:让平台不只看数据还能控制设备
数据可视化做完后,我补了一个控制链路:从 Web 页面下发指令,通过 Node-RED 把指令转换成 MQTT 消息发布到设备的控制 Topic,设备端订阅该 Topic 后执行对应动作。这看似简单,但整个物联网平台的闭环就具备了。
我们做了一个风扇控制实验:页面上的开关状态改变后,Node-RED 捕获变更,向/demo-001/actuator/relay-001/command发布 JSON 消息{"action": "on"},设备端夹具收到后点亮 LED 或开启风扇。这节内容太适合作为实训项目了,学生能看到数据的流入,也能看到指令的流出,整个逻辑就通了。
实现这个功能的 Node-RED 流程特别简单:一个 HTTP 输入节点接收网页的 POST 请求,一个 MQTT 输出节点连接 Broker 发布消息。同时可以用一个 MQTT 输入节点订阅设备状态回传的 Topic,把设备“实际上已经执行了”的反馈显示在页面开关上。这才是完整的指令闭环。
5.4 展示层的扩展方向:自研可视化也有其必要
Grafana 适合做内部看板、运维监控,但如果是面向终端用户的产品页面,还是要自研前端界面。Node-RED 提供轻量的 Dashboard 功能,可以快速拖动生成操作面板。如果需求更复杂,可以用 Vue 或 React 读取 InfluxDB 的 API 或 Node-RED 提供的 HTTP 接口,按需定制页面。
我的建议是:原型验证阶段千万别从自研前端开始,先把 Grafana 或 Node-RED Dashboard 用起来。等确认了业务逻辑、用户交互方式后,再投入精力开发正式页面。很多团队一上来就前后端齐上,结果一个星期的工时花在页面布局上,核心链路反而没有验证清楚。
6. 仿真实训场景:物联网平台能玩的常见实验项目
6.1 实验一:环境监测数据采集与可视化
这个实验是物联网仿真实训最常见的入门项目。每台模拟设备周期性上报温度、湿度、光照强度等数据,平台端实时展示曲线并记录到数据库。学生需要完成设备端模拟、Topic 定义、数据入库、图表展示全流程。
从这个实验学到的东西是整个平台的骨架逻辑:数据怎么来、怎么存、怎么展示。我会让学生在实验报告里重点写清楚 Topic 设计和数据模型设计,因为这是后面所有实验的地基。很多学生急着跑通页面效果,最后问起来 Topic 为什么这么设计、Tag 和 Field 怎么区分,答不上来,说明根基没打牢。
6.2 实验二:设备管理与状态监控
第二个实验要求平台具备设备上下线感知能力。EMQX 支持遗嘱消息机制,设备非正常断开连接时,Broker 会帮忙发一条遗嘱消息到指定 Topic,平台监听这个 Topic 就能感知设备掉线。加上设备心跳机制,可以在仪表盘上清晰展示每台设备的在线状态。
这个实验特别适合讲“连接保活”概念。学生纷纷体验了“暴力拔网线”导致设备掉线的效果,再观察遗嘱消息的延迟和 MQTT 心跳超时时间的关系,对 MQTT QoS 和 session 机制的理解会比看书深刻得多。
6.3 实验三:告警联动与自动控制
第三个实验是把数据、告警、控制串成一个完整故事,也是我认为最有教学价值的实验:环境温度超过阈值后,平台不仅要在页面上告警,还要自动下发指令打开风扇。
实现逻辑是通过 Node-RED 的 function 节点对每条数据进行判断,满足条件后调用 MQTT 发布节点,向执行器发送控制命令。还可以记录一条告警事件到数据库,供后续查询和分析。这个实验涵盖了物联网平台三大核心能力:感知、判断、执行,做一遍下来对整体认识会非常清晰。
6.4 实验四:多设备并发与数据分流
进阶实验是同时启动 10 台以上模拟设备,每台设备以自己的频率上报数据,平台端要做两类处理:一类是按设备维度展示各自的实时曲线,另一类是计算所有设备的总平均值并展示在总览面板。
这个实验会真实暴露系统并发能力的瓶颈。比如 Node-RED 的并发线程数、InfluxDB 的写入吞吐量、浏览器端渲染过多图表时的性能。学生能直观感受“代码在单台设备上没问题,设备多了就各种问题”的工程现实。通过调整模拟设备的发布频率(从每秒一条改成每毫秒一条),大家也能测试出这套平台的性能上限。
7. 常见问题排查:连接、丢包、定时任务这几个老坑
7.1 设备频繁掉线?先查 client_id 和 keepalive
设备掉线是最常见的问题。排查步骤我建议按固定顺序来:先在 EMQX Dashboard 的连接列表里看客户端列表,确认设备是否有重连记录;再看设备端日志有没有断连报错;最后检查 client_id 是否唯一、keepalive 参数是否设置得太短。
keepalive 参数也值得注意。MQTT 客户端在连接时设置心跳间隔,默认通常是 60 秒,但如果你所在网络环境不太稳定,建议缩短到 30 秒甚至 20 秒。心跳越短,Broker 感知掉线的速度越快,但网络开销也越大,需要平衡。我通常设置在 30 秒左右,效果比较均衡。
7.2 EMQX 收不到消息?先查 QoS 和订阅关系
设备端显示发布成功,但 EMQX Dashboard 看不到消息速率,这种问题基本出在订阅关系上。一个典型的误操作是:设备发布到demo-001/temperature/sensor-001,但是 Node-RED 订阅的是demo-001/temperature/+,按道理能收到,但如果 EMQX 开启了权限控制,订阅动作会被拒绝。
另一个问题是 QoS 等级不匹配。发布端 QoS 为 2、订阅端 QoS 为 1,实际投递等级按两者较低者执行。如果消息经常丢,可以检查是不是设了 QoS 0。在同网段、内网环境下 QoS 0 问题不大,但跨公网时会导致较高概率的消息丢失现象,建议至少使用 QoS 1。
7.3 InfluxDB 查询超时?注意聚合窗口和查询范围
当数据量增长后,Grafana 图表加载变慢,大概率是查询范围太大或聚合力度太细。如果在 Grafana 里选了“最近 7 天”的时间范围,同时按秒级聚合,数据点数量可能达到百万级,图表渲染自然卡顿。
解决办法是合理设置aggregateWindow的窗口大小。查看最近 1 小时的数据,按 10 秒聚合就够;查看最近 7 天的数据,至少要按 5 分钟聚合。Grafana 的变量机制也能帮助用户按需选择聚合粒度,而不是一刀切。
7.4 时间显示不对?先校准时区和时间戳单位
在排查物联网平台数据时,时间问题是出现频率最高的隐性 bug。第一步要确认 InfluxDB 的默认时区设置,第二步确认写入数据的时间戳单位是纳秒,第三步确认 Grafana 面板的时区选择与浏览器时区一致。哪一步没做对,图表上的曲线就会错位或者完全没有数据。
一个验证时间问题的小技巧:在 InfluxDB 的 Data Explorer 里执行一条查询,看返回数据的时间是否符合预期,能直接跳过 Grafana 环节来定位问题。如果 InfluxDB 里的时间是对的但 Grafana 显示不对,大概率是面板时区配置问题。
8. 最后再分享几个让平台更稳定的小技巧
8.1 用 Docker Compose 一键拉起全部组件
我强烈建议整个平台用 Docker 部署。EMQX、Node-RED、InfluxDB、Grafana 都有官方镜像,通过 Docker Compose 一次性启动,所有服务之间的网络配置在同一个 compose 文件里就能搞定。这样无论是换服务器还是给学生准备实验环境,都是执行一条命令的事。
services: emqx: image: emqx/emqx:5.1.1 container_name: iot-emqx ports: - "1883:1883" - "18083:18083" node-red: image: nodered/node-red:3.1.3 container_name: iot-nodered ports: - "1880:1880" volumes: - node-red-data:/data influxdb: image: influxdb:2.7.1 container_name: iot-influxdb ports: - "8086:8086" volumes: - influxdb-data:/var/lib/influxdb2 grafana: image: grafana/grafana:10.2.0 container_name: iot-grafana ports: - "3000:3000" volumes: - grafana-data:/var/lib/grafana这个编排文件里每个服务的数据都挂载到了 Docker volume 上,容器重启或升级后数据不会丢。第一次启动后,只需要按 IP 加端口分别进入各服务的初始化页面,做初始账号配置和数据源连接即可。
8.2 关键数据先备份再折腾
物联网平台配置好后,有两类内容必须定期备份:Node-RED 的流程配置和 Grafana 的仪表盘配置。Node-RED 的流程可以导出成 JSON 文件,Grafana 的仪表盘也能通过 UI 导出。我在每次调整完流程或图表后都会导出一份放到项目目录里,和代码一起做版本管理。否则一旦 Docker 容器数据卷异常,几天的工作成果可能就没了。
8.3 压测小工具:验证平台的承载上限
如果想知道这套平台到底能扛多少设备,可以用一个简单的多线程发布脚本做压测。Python 里用线程池同时开 100 个客户端,每个客户端每秒发一条消息,统计 EMQX Dashboard 上的消息速率指标,就能比较直观地了解平台性能瓶颈。一般来说,单机 EMQX 处理几千条每秒的消息没什么问题,瓶颈通常出现在 Node-RED 的单线程事件循环和 InfluxDB 的写入吞吐上。
根据我个人的实际操作体会,这套组合方案最大的价值不是某一个组件的性能有多强,而是它让整条物联网数据链路保持了一目了然的可解释性:每一个环节都有直观的界面可以查看、有日志可以追踪、有标准协议可以对接。这种“即使出了任何问题也找得到原因”的确定性,在做技术选型时往往比纸面性能数字更重要。对于想要快速搭建物联网平台、又希望后续能持续迭代扩展的团队来说,这套方案是一个花最小成本就能跑通全部业务逻辑的稳妥起点。