先交代一下背景:这几年物联网项目从“能用就行”逐渐变成了“稳定、可控、可扩展”,很多团队在选平台时会卡在一个问题上——数据放公有云不放心、按设备数买商业授权又太贵,于是“私有化部署 + 开源”成了最现实的折中路线。我自己帮客户落地过几套物联网平台,从几百台设备的小型网关项目到几万台的产线数据采集都有涉及,这篇就按实际踩坑经验,把目前值得关注的几个开源物联网云平台一次讲清楚,重点说说各自适合什么场景、部署时候有哪些坑、以及怎么从零搭起来。
1. 为什么需要私有化部署的开源物联网云平台
1.1 私有化部署到底解决了什么问题
很多刚接触物联网的人会有个疑问:阿里云 IoT、腾讯云 IoT 这些现成的平台不香吗?香,但香的前提是你接受“设备数据全部过第三方服务器”。实际做项目的时候,这往往不只是数据隐私的问题,而是客户那边的硬性要求:设备数据不出内网、平台要部署在客户机房、后续可定制化开发。还有些项目是学校和研究所的横向课题,数据不能交给外部服务,再加上经费有限,这时候开源平台就是唯一能走得通的路。
私有化部署的好处可以归纳成三点:
- 数据完全掌握在自己手里。采集上来的温度、电量、位置、生产参数,全部落在自己的服务器或内网存储里,不会经过任何第三方。
- 可以按需裁剪和改代码。开源项目拿下来,界面不喜欢可以改前端,协议不满足可以加 decoder,业务逻辑甚至可以整个重写,这是商业闭源平台给不了的自由度。
- 成本上更具可预测性。商业 SaaS 一般按设备数、消息量、存储空间阶梯计费,设备多了费用线性增长;自建平台主要是一次性硬件投入加维护人力,长期运行的边际成本更低。
当然,私有化部署也不是没有代价。你得自己处理高可用、备份、版本升级、安全加固这些问题,相当于把平台运维的活也接了过来。对于团队规模小、没有专职运维的项目,这需要提前做好心理准备。
1.2 开源方案与商业 IoT 平台的现实差距
拿商业物联网平台最好用的“设备影子”“场景联动”“告警中心”这些功能来说,开源平台大多数已经覆盖了类似能力,只是在产品化程度上差一些。比如 ThingsBoard 有实体、资产、设备、告警、仪表盘一套完整的抽象模型,JetLinks 有设备接入网关和完整的协议解析框架。二者对真实业务的覆盖度已经相当高。
差距主要集中在三块:
- 官方技术支持。开源平台通常只有社区版,出了问题得自己去 GitHub 提 issue 或者翻源码,不像商业平台有工单系统兜底。
- 工业协议覆盖。西门子、Modbus、OPC UA 这些工业协议虽然 ThingsBoard 有扩展可以对接,但原生支持程度显然不如专门做工业物联网的商业平台。
- 大并发性能调优。几千台设备同时在线,普通默认配置可能扛得住;几万台并发上来,需要自己对 Kafka、Cassandra、负载均衡做深度调优,这个能力是文档上看不出来的。
我的建议是:如果你的场景是常规物联网数据采集、展示、告警,开源平台的默认能力足够了;如果涉及非常冷门的协议或极高并发,先看有没有成熟的商业方案,再做选型判断,避免后期推翻重来。
2. 主流开源物联网云平台横向对比与选型建议
2.1 ThingsBoard:功能最全的老大哥
ThingsBoard 是目前 GitHub 上 Star 最多、社区最活跃的开源物联网平台之一,Java 技术栈,支持 MQTT、HTTP、CoAP、LwM2M 等设备接入协议。它的特点用一个字概括就是“全”:设备管理、数据可视化、规则引擎、告警中心、多租户权限体系、OAuth2 集成、审计日志……你能想到的物联网平台该有的功能,它基本都有。
ThingsBoard 社区版是 Apache 2.0 协议,可以免费商用,这也是它能在中小团队里流行起来的重要原因。部署方面官方提供 Docker 一键部署,单机版最低配置 2 核 4G 就能跑起来,门槛并不高。社区版之外还有专业版(PE),多了白标、高级权限、客户门户等企业功能,但那个是收费的,本篇文章聚焦社区版。
如果要说 ThingsBoard 的短板,那就是对前端二次开发不太友好。它采用自定义的 Angular 组件体系,想改仪表盘样式或新增页面,需要花不少时间研究它的组件机制。插件和规则节点虽然丰富,但真要到“改源码”的程度,Java 技术栈的编译调试成本摆在那里,小团队需要掂量一下。
2.2 JetLinks:国产化、中文文档、模块解耦
JetLinks 是国内团队开发的开源物联网平台,基于 Spring Boot 和 Spring WebFlux 构建,技术栈偏现代,响应式编程模型带来更高的并发吞吐能力。它的核心优势集中在三点:中文文档特别完整、前后端分离且模块解耦好(jetlinks-community 是后端,jetlinks-ui-antd 是前端)、协议解析层设计得清晰,二次开发的切入成本远低于 ThingsBoard。
设备接入方面,JetLinks 支持 MQTT、TCP、UDP、HTTP 等通用协议,也内置了消息协议编解码的脚手架。它最亮眼的是一套“产品-设备-物模型”的建模方式,可以在界面上直接定义属性、事件、服务,不需要写代码就能搭出一个完整的设备数据模型。这个设计思路很贴近国内工业互联网和智慧城市项目的需求文档,和团队里产品经理、项目经理沟通时特别省力。
JetLinks 的部署依赖 Redis、Elasticsearch、PostgreSQL 这几个外部组件,首次上手会比 ThingsBoard 复杂一些。但一旦跑起来,二次开发的体验比 ThingsBoard 好不少,尤其是需要定制业务页面、和别的系统做单点登录对接的场景。
2.3 EMQX + Node-RED:轻量级的“攒机”方案
如果你的目标是快速搭建一个私有化的设备接入层,不一定需要一整套“平台”的完整功能,EMQX 加 Node-RED 的组合可能是效率最高的选择。EMQX 是一个基于 Erlang/OTP 的高并发 MQTT Broker,单节点可以轻松支撑百万级连接,天生为物联网消息接入而生。Node-RED 是图形化的流式编程工具,通过拖拽节点就能实现数据解析、规则处理和业务转发。
这套组合的思路是:EMQX 负责海量设备接入和消息路由,Node-RED 消费 MQTT 消息,用 Flow 实现设备数据处理和告警逻辑。存储可以用 InfluxDB 这类时序数据库,展示用 Grafana。整体方案的优点是完全组件化,哪个环节出问题可以单独替换,没有平台绑定的问题;缺点是“平台级”能力需要自己拼,比如多租户、设备影子、固件升级这些,没有现成的一体化界面可用。
这个方案适合两类人:一类是嵌入式工程师,只做设备数据上报和远程控制,不需要复杂的业务管理系统;另一类是做原型验证的技术团队,48 小时内先搭一个能收数、能展示、能告警的 demo,后续再决定是否上重型平台。
2.4 Kaa IoT Platform、SiteWhere 和 ThingsIX 等备选
除了上面几个主流选择,还有几个备选方向值得提一下。
Kaa IoT Platform 是一个老牌的物联网中间件,支持设备管理、数据采集和远程配置,Java 技术栈,社区版也是开源可用的。它的特点是抽象层次高,适合做多项目多租户的复杂业务建模,但社区的迭代速度近几年偏慢,中文资料也比较少。
SiteWhere 定位是物联网数据 ingestion 和管理平台,基于微服务架构,可以跑在 Kubernetes 上。它的设备通信模块支持 MQTT、AMQP 等,适合有容器化运维能力的团队,但整体上手难度比 ThingsBoard 高一个量级。
如果你研究的重点是低功耗广域网(LPWAN)场景,尤其涉及 LoRaWAN 网关和节点管理,那最成熟的私有化选择其实是 ChirpStack。它专注 LoRaWAN 网络服务器,并且提供了清晰的 Web 管理界面和 gRPC API,很多智慧园区项目会拿 ChirpStack 做接入网关,上层再对接其他物联网平台。
2.5 一张表看懂选型
| 平台 | 技术栈 | 协议支持 | 部署难度 | 适合场景 | 典型劣势 |
|---|---|---|---|---|---|
| ThingsBoard | Java / Angular | MQTT、HTTP、CoAP、LwM2M | 低(Docker 一键) | 通用物联网平台、多租户 SaaS 化 | 前端二次开发不友好 |
| JetLinks | Spring Boot / React | MQTT、TCP、UDP、HTTP | 中(依赖 ES+Redis) | 国内项目、深度二次开发 | 外部组件较多,集群部署复杂 |
| EMQX + Node-RED | Erlang / Node.js | MQTT、MQTT-SN、CoAP | 低 | 海量连接、原型验证 | 需要自行拼装完整平台能力 |
| Kaa IoT Platform | Java / Angular | MQTT、HTTP | 中 | 多租户复杂建模 | 社区迭代慢、资料少 |
| SiteWhere | Java / 微服务 | MQTT、AMQP | 高 | Kubernetes 云原生团队 | 上手成本高 |
| ChirpStack | Go / Vue | LoRaWAN | 中 | 低功耗广域网、LoRa 网关管理 | 只覆盖 LoRaWAN 接入层 |
选型这件事,没有“最好的平台”,只有“当前团队能力和业务需求最匹配的平台”。对外展示要求高、重界面重报表,优先 ThingsBoard;要做古早代码改造、深度业务集成的国内项目,JetLinks 更加顺手;纯接入层方案就直接 EMQX 起步。
3. 私有化部署的架构设计与核心功能落地
3.1 整体架构:设备接入、消息中间件、业务服务与存储
不管选哪个平台,物联网私有化部署的参考架构大致是分层的:设备端通过 MQTT/HTTP 接入,中间经过消息中间件做流量削峰,业务服务对上行数据进行解析、存储、告警和指令下发,最后通过 Web 应用提供给用户操作。以 ThingsBoard 为例,它的架构可以简化为这样的流向:
- 设备 -> 网关(可选)-> ThingsBoard Transport 层(MQTT/HTTP/CoAP) -> 规则引擎 -> 存储(PostgreSQL/Cassandra) -> 仪表盘。
- 指令下发方向:用户操作仪表盘 -> 规则引擎 -> Transport 层 -> MQTT Topic 下发给设备。
这个架构里,消息中间件往往是最考验选型的一环。ThingsBoard 默认用内存队列做消息路由,小规模场景足够;上万设备并发上报时,建议改成 Kafka 持久化队列,实现削峰填谷,避免数据库被瞬时写入打满。JetLinks 基于 WebFlux 本身就具备异步非阻塞的处理能力,配合 Redis 做消息缓冲,高并发场景下表现更有优势。
存储层要根据数据特点拆分:设备基础信息适合 PostgreSQL 这类关系型数据库,时序数据(温度、电量、位置)必须用时序数据库才能扛住高频写入。ThingsBoard 社区版支持 PostgreSQL 或 Cassandra 二选一存储时序数据,如果是千万级消息量的项目,直接在部署时就选 Cassandra,不要等数据量上来了再迁移,那个成本非常高。
3.2 设备接入协议:MQTT 是绝对主力
协议选型直接决定设备接入的难度和稳定性。目前在物联网平台领域,MQTT 是当之无愧的主力协议,原因在于它基于发布/订阅模型,天然适合海量设备的双向通信,协议报文精简,对嵌入式设备友好,而且还支持遗嘱消息和保留消息,能够实现设备在线状态感知和离线告警。
实际项目中,MCU 或 SoC 侧一般用 MQTT 库连接平台,连接参数通常需要关注三块:
- Broker 地址和端口:TLS 加密走 8883,非加密走 1883。
- Client ID:只能唯一,多设备共用同一个 Client ID 会导致连接互相踢下线,这是个经典坑。
- 用户密码认证:平台通过用户名密码鉴权,涉及设备证书或 Token 的对应关系。
除了 MQTT,HTTP 协议在某些低频率上报场景也会用到,比如设备每小时上报一次数据,用 HTTP POST 更简单,不用维护长连接。CoAP 主要面向资源受限的 NB-IoT 设备,ThingsBoard 支持端到端 CoAP 接入,但实际项目里用得不多,大多设备还是以 MQTT 为主。
3.3 规则引擎:真正拉开平台差距的模块
很多人把物联网平台简单理解成“设备管理 + 数据展示”,但项目做深了会发现,真正产生价值的是数据加工和自动响应能力,这部分就是规则引擎的活。以 ThingsBoard 的规则引擎为例,它由“规则链”(Rule Chain)和多个“节点”(Node)组成,数据流走向是:消息进入规则链 -> 通过判断节点分流 -> 进入处理节点执行动作。
我常用的一个典型数据流是这样的:
- 设备上报 JSON 数据。
- “消息类型切换”节点判断是遥测数据(telemetry)还是设备属性(attribute)。
- “脚本”节点解析 JSON 字段,把温度值取出来做阈值判断。
- 温度大于 80 度时,走“告警”节点创建一条告警记录。
- 数据同步存入时序数据库,供仪表盘实时查询。
这个能力在 JetLinks 里叫做“规则引擎”,提供了类似的可视化编排;在 EMQX + Node-RED 方案里,通过 Node-RED 的 function 节点和 switch 节点实现同样的逻辑。无论哪种实现方式,思路都是先把数据标准化,再做分支判断和动作执行。
需要注意的细节是,规则引擎脚本里的异常一定要兜底。实际跑数据时经常会有设备上报空字段、字符串数字混用、时间格式不统一这类脏数据,如果脚本里没有空值判断,规则链会直接抛异常,消息就丢了。我在 ThingsBoard 里习惯在规则链最前面加一个“log”节点,把所有进链消息先打一条日志,这样即使后面处理异常,也能靠日志回溯原始消息。
3.4 设备管理与权限体系的设计要点
平台的功能不只是收数和展示,设备生命周期管理和用户权限设计在真实项目里同样重要。设备管理至少要覆盖这几个环节:
- 设备注册:手工添加还是批量导入。小项目手工添加没问题,几百台设备批量注册就要用 CSV 导入或者调平台 API。
- 设备凭据:ThingsBoard 支持 Access Token、X.509 证书、MQTT Basic 三种鉴权方式。Access Token 最简单,直接在设备配置里填一个 Token 字符串,最适合开发调试;生产环境安全要求高就上 X.509 证书。
- 设备分租户:多项目共用一套平台时,用租户隔离各项目的设备、仪表盘和用户。ThingsBoard 的租户(Tenant)、客户(Customer)、设备(Device)三级体系可以支撑“一个平台服务多个独立项目”的场景。
权限体系这块,我的建议是“一开始就设计好,不要上了生产再加”。物联网平台最怕的是设备和用户关系混乱,比如给了用户所有设备的控制权限,一旦设备被误操作,后果可能是现场设备停机。生产环境一定要遵循最小权限原则:普通用户只能看到分配给他的设备,只能调用授权范围内的指令服务。
4. 手把手实操:以 ThingsBoard 为例完成私有化部署
4.1 环境准备与安装方式选型
选择 ThingsBoard 做实操案例,是因为它的 Docker 部署最简单、社区资料最多、最容易复现。准备一台 Linux 服务器(Ubuntu 20.04/22.04 均可),最低配置 2 核 4G 内存、20G 磁盘。小于这个配置,编译和运行会比较吃力;生产环境建议 4 核 8G 起。
安装之前先确认服务器装了 Docker 和 Docker Compose。没有的话,用下面命令快速部署:
curl -fsSL https://get.docker.com | bash sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version这里注意国内网络拉取 Docker 镜像可能比较慢,可以配置镜像加速器再继续,否则 ThingsBoard 相关镜像(加起来好几个 GB)可能在下拉阶段就卡死。配置镜像加速的方法比较常规,这里不做展开。
4.2 Docker Compose 一键部署 ThingsBoard
用 Docker Compose 方式部署 ThingsBoard 社区版最省心。官方仓库里提供了编排文件,直接执行:
git clone https://github.com/thingsboard/thingsboard-docker-compose.git cd thingsboard-docker-compose然后需要决定数据库类型。默认的docker-compose.yml使用 PostgreSQL 单库存储实体和时序数据,适合快速体验;如果测试环境机器配置够用,建议用docker-compose.postgres-cassandra.yml这个版本,时序数据由 Cassandra 处理,长期跑数据不会因为 PostgreSQL 单表膨胀而变慢。
选好编排文件后启动:
docker-compose -f docker-compose.postgres-cassandra.yml up -d首次启动需要拉镜像、初始化数据库,持续几分钟到十几分钟不等,视网络状况而定。启动完成后可以通过日志确认状态:
docker-compose logs -f tb-core看到类似Started ThingsBoard的日志,说明平台已经启动成功。浏览器访问http://服务器IP:8080,默认系统管理员账号是sysadmin@thingsboard.org,密码为sysadmin。还有租户管理员账号tenant@thingsboard.org,密码tenant,可以通过不同角色体验多租户功能。
4.3 创建设备并模拟上报 MQTT 数据
平台起来后,先进入租户管理员账号(tenant),找到左侧菜单中的“实体 -> 设备”,点击右上角加号创建新设备。设备名称随意填,比如“温度传感器-01”,设备配置文件选“default”。
创建完成后点击设备名称进入详情页,切换到“管理凭据”标签页,默认是 Access Token,直接复制这个 Token 字符串。这个 Token 就是设备连接平台的钥匙,可以把它理解为设备的用户名和 API key 二合一。
接下来用命令行模拟一台设备上报数据。安装 MQTT 客户端工具(mosquitto_pub 或者 mqttx CLI 均可),执行:
mosquitto_pub -d -h 服务器IP -p 1883 -t "v1/devices/me/telemetry" -u "设备AccessToken" -m "{\"temperature\":36.5,\"humidity\":60}"解释一下这条命令的含义:-t指定 Topic,ThingsBoard 规定遥测数据上报到v1/devices/me/telemetry;-u后面不是用户名而是设备 Token;消息体是 JSON 格式,temperature 和 humidity 就是自定义的数据字段。
执行成功后,回到 ThingsBoard 设备详情页,切到“最新遥测数据”标签页,能看到刚上报的两个键值。到这里设备接入闭环已经打通。
4.4 配置数据可视化仪表盘与告警规则
设备能上报数据只是第一步,平台的核心价值在于数据处理和展示。创建一个仪表盘的流程是:左侧菜单“仪表盘库” -> 新建仪表盘 -> 打开仪表盘进入编辑模式 -> 添加“实体别名”关联刚才创建的设备 -> 从图表组件的“最新遥测数据”里选择 temperature 字段 -> 保存。
如果你想让平台自动产生告警,可以编写一条简单规则链。入口在“规则引擎”菜单,默认有一条“Root Rule Chain”,可以在一进链处添加“script”节点,脚本逻辑如下:
if (msg.temperature && Number(msg.temperature) > 80) { return {msg: {message: "温度过高:" + msg.temperature}, metadata: msg.metadata, msgType: msg.type}; } else { return {msg: msg, metadata: msg.metadata, msgType: msg.type}; }这个节点后面接“create alarm”节点,温度大于 80 就生成告警;如果没有超过阈值,则将消息继续流转到保存数据的节点。这段规则链的意义是:数据存储和异常判断是两条分支,正常数据照常入库,异常数据额外生成告警,互不阻塞。
实际操作时我习惯先不接存储节点,单独用“log”节点把规则链输入和输出都打出来,测试通了再往后面挂节点。规则链的调试入口在节点详情页右上角的“测试”按钮,可以模拟一条 JSON 数据看节点的输出结果,这个功能排查逻辑问题非常好用。
5. 常见问题与排查技巧实录
5.1 部署与运行期的典型故障速查
| 问题现象 | 可能原因 | 处理方式 |
|---|---|---|
| 设备上报数据,仪表盘无展示 | 设备 Token 填错;Topic 拼写错误 | 检查设备凭据,确认 Topic 是否为v1/devices/me/telemetry |
| 仪表盘显示“实体未找到” | 实体别名关联的设备选错或仪表盘无编辑权限 | 检查仪表盘实体别名,确认关联到正确的设备 |
| 规则链不生效,设备数据仍不存储 | 规则节点挂载顺序错误;脚本抛异常 | 打开规则链尾部“log”节点,查看消息是否进入该分支 |
| 设备连接后频繁掉线 | MQTT Client ID 重复 | 确保每台设备 Client ID 唯一 |
| 数据库持续高占用 | PostgreSQL 存储时序数据膨胀 | 部署时选择 Cassandra 方案,或配置定期清理策略 |
| 访问 8080 端口不通 | 防火墙未放行 | 开放 TCP 8080 端口 |
| 设备端能 PING 通服务器但 MQTT 连不上 | MQTT 端口未开放或仅支持 TLS | 确认 1883 端口公开可访问;TLS 环境使用 8883 并配置证书 |
5.2 数据“上报成功却不显示”的排查方法
这是群里被问得最多的一个问题,明明设备端日志显示发布成功了,平台端却不见数据。我的排查路线比较固定,基本三步走:
第一步,看设备是否在线。ThingsBoard 设备列表里每个设备都有“在线/离线”状态,如果设备显示离线,说明 MQTT 连接没建立成功,先别查规则链,回头查网络和凭据。
第二步,看规则的输入输出。进规则引擎,找 Root Rule Chain,在入口处临时挂一个“log”节点。正常线缆中日志节点会输出消息内容和 metadata,节点报错的话会显示具体异常信息。很多时候问题出在 JSON 格式不合法,比如设备上报的是{'temperature':36.5}单引号 JSON,规则引擎解析直接失败。
第三步,直接查数据库。PostgreSQL 成绩单可以看ts_kv表有没有数据,有数据说明存储链路没问题,问题在仪表盘配置;没数据说明规则链没把消息转发到存储节点。这个办法跳过了界面层,能精确区分是数据链路问题还是展示层问题。
5.3 关于资源占用与性能的坑
ThingsBoard 默认跑在 Docker 里,看起来挺省事,但资源占用并不低。实际观察中,一个刚启动的系统就要占 2GB 左右内存,Java 应用是吃内存大户。如果你的服务器内存只有 2G,部署完基本就满了,设备一多就会触发 OOM。我的建议是至少准备 4G 内存,生产环境 8G 起步。
另一个容易忽略的是 Docker 日志增长问题。ThingsBoard 里规则引擎和传输服务都会输出大量日志,默认情况下 Docker 日志文件不设上限,跑几个月能吃掉几十 GB 磁盘。建议在docker-compose.yml里加上 log 配置:
logging: driver: "json-file" options: max-size: "100m" max-file: "3"这行配置能让单个日志文件超过 100MB 自动切割,最多保留 3 个文件,避免磁盘被日志塞满。
5.4 手写设备接入代码时的常见坑
很多嵌入式工程师直接用 MQTT 库手写接入代码,不依赖平台 SDK,这完全可行,但如果使用 ThingsBoard 这类平台,有一些隐藏约定需要提前知道。
设备上报遥测数据时,Topic 是v1/devices/me/telemetry,这一条比较好查;但设备要接收平台下发的 RPC 指令,订阅和发布 Topic 分别是v1/devices/me/rpc/request/+和v1/devices/me/rpc/response/+,这个很多人都容易搞反。请求和响应是相反的,设备订阅 request 前缀,收到消息后处理后把结果发布到 response 前缀,这样平台才能把 RPC 调用的结果返回给前端。
还有一点,平台下发的属性更新走的是v1/devices/me/attributes,这个 Topic 既是设备上报属性的入口,也是设备订阅属性更新的入口。如果你发布了属性,但设备端没有订阅这个 Topic,是收不到平台端修改属性的推送的。理解这几个 Topic 的语义,才能避免“能上报数据,却不能实时控制设备”的尴尬。
6. 部署后的运维与扩展心得
6.1 高可用与备份方案怎么落地
私有化部署最容易被忽略的就是数据备份。很多人部署完调试通了就以为万事大吉,直到数据库文件损坏才追悔莫及。ThingsBoard 的数据分为 PostgreSQL 中的实体和 Cassandra 中的时序数据,备份需要分别处理。
最轻量的备份方案是 cron 定时任务 +pg_dump和nodetool snapshot。PostgreSQL 每天凌晨自动导出文件,保留最近 7 天;Cassandra 快照更简单,直接在数据目录打快照即可。恢复流程就是导回 SQL 再拷贝快照文件,步骤不复杂,但真的很重要,千万别省。
如果是核心生产环境,建议直接在配置层面做高可用:至少两台服务器,一台 web 服务一台数据库节点,数据库做主从复制,避免单点故障。再往上是 Kubernetest 容器编排、自动扩容,这就看团队运维能力了,小项目不必一步到位。
6.2 对接 4G 模组与边缘计算设备
很多实际项目里,设备并不是直接用 WiFi 连到平台,而是通过 4G 模组上网,比如有人用合宙 Air724UG、有人用移远 EC200S,这些模组内部其实已经封装了 TCP/IP 协议栈,你只需要在模组固件里配置 MQTT 连接参数,就能把数据发到平台。
4G 模组接入最容易踩的坑是网络环境问题。部分场所的 4G 专网卡走的是内网 APN,设备无法直接访问公网服务器 IP。这种场景下有两种解决思路:一种是在服务器上部署 MQTT 接入网关作为中转,让模组连内网网关,网关再通过隧道转发到公网平台;另一种是直接在专网内部署平台服务,数据不出内网,这正好呼应了私有化部署的核心优势。
边缘计算节点与平台的对接,重点在于数据上传策略。我的建议是边缘侧本地先做过滤和缓存,周期性批量上报,不要每个传感器读数都实时上报。一台边缘网关管 50 个温湿度传感器,每分钟一条数据,一天就是 72000 条点,对平台的存储和带宽都有压力。更合理的方案是边缘节点只上报聚合结果(均值、最大值、突变告警),原始数据仍留在本地,按需查询。
6.3 与 Dify 等 AI 项目结合的可能性
最近热词里出现“dify私有化部署”,让我想到一个比较新的趋势:物联网平台产生的大量时序数据,天然适合接 AI 模型做预测性维护、能耗优化、异常检测这类应用。开源物联网平台负责数据采集和设备管理,AI 应用负责数据分析和决策,两者可以形成很好的互补。
做法上,可以通过 ThingsBoard 的规则引擎把数据转发到 Kafka,再由 Dify 工作流消费 Kafka 数据做分析和预测,预测结果通过 API 回写到平台,形成“采集-分析-反馈”闭环。这套架构的优势是每个环节都是开源组件,整个链路都能私有化部署,非常适合做智慧工厂、智慧园区的定制项目。
这个方向还比较新鲜,但我觉得它会成为物联网部署的一个重要形态。平台本身只是数据管道,真正产生业务价值的是叠加在数据之上的智能逻辑,而现在开源生态给了我们足够的拼装自由度去尝试。
最后再分享一点实战心得
从我接触的十多个物联网项目来看,选平台不要光看功能清单,更要看团队的长期维护能力和业务重点。如果核心需求是“数据要能方便地展示和探索”,ThingsBoard 的仪表盘能力很顺手;如果核心需求是“业务系统要和我们内部系统深度集成”,JetLinks 的前后端分离架构会轻松很多;如果只是需要一个稳定的接入管道,EMQX 加 Node-RED 能省掉一半学习成本。
还有一件事值得多说一句:不管选哪个平台,正式开始部署之前,一定先拿一批真实设备数据做长时间压测,至少跑满 72 小时,观察内存占用、数据库增长速率、磁盘使用趋势这三个指标。我见过太多项目部署完很顺利,设备量一上来就开始频繁重启,而且重启后数据回补又出问题。提前暴露问题永远比事后救火划算。