简介:这份资源为基于 ThingsBoard 的开源物联网平台完整工程,面向物联网开发者、平台架构师与运维人员,解决海量设备接入、数据收集、处理与可视化展示等核心问题。平台原生支持 MQTT、CoAP、HTTP 等主流协议,内置设备管理、规则引擎、多租户权限、仪表盘 Widget 等功能,适用于智能工厂、智慧农场、车队追踪等典型物联网场景。资源包共 3074 个文件,以 Java 后端代码与 TypeScript/Angular 前端代码为主,同时包含 HTML/SCSS 页面样式、SQL 数据库脚本、Dockerfile、Shell/Bat 部署运维脚本、YAML/Env 配置文件等,整体约 5.75MB,工程目录结构完整,便于按模块检索与二次开发。压缩包内还附带了安装、升级、初始化数据库等部署运维脚本,可缩短本地环境搭建时间,已有 913 人学习下载。借助这份资料,读者可快速熟悉 ThingsBoard 的模块划分与启动流程,掌握从环境初始化、数据库搭建到服务部署的完整路径,为私有化部署与功能扩展提供直接参考。 做物联网项目这些年,我最大的体会是:硬件选型往往不是最难的,真正让人头疼的是设备接进来之后那一大摊子事——设备怎么管、数据往哪存、告警怎么推、图表怎么出。市面上商业物联网平台不少,但要么收费贵,要么绑定厂商生态,想自己掌控全链路,开源物联网平台几乎是最务实的一条路。
这篇文章我基于自己搭过的一套“设备管理 + 数据收集 + 数据处理 + 可视化”开源方案,把核心设计思路、选型理由、实操过程和踩坑记录都盘一遍。适合正在做物联网毕设、中小规模物联网项目预研、或者想从零搭一套私有物联网平台的朋友参考。
1. 项目核心思路:把数据链路跑通比什么都重要
1.1 为什么选了开源平台这条路线
先说说我为什么坚持用开源物联网平台,而不是直接买商业方案。最直接的原因是商业平台按设备数和消息量计费,设备一多,费用涨得让人肉疼。另一个原因是数据主权问题,设备数据全部过别人的云,对于很多场景来说是不可接受的。
开源平台的另一个隐性优势是二次开发空间大。你拿到的是一整套可以改的代码,不是黑盒。比如平台默认的设备接入协议不满足需求,你可以自己扩展;默认的告警规则不够灵活,你可以直接改规则引擎。商业平台通常只给你配置界面,做不到这个粒度。
当然,开源不等于免费。你需要自己承担部署、运维、安全加固的工作,这就要求团队里至少有一个人对Linux、数据库、网络协议比较熟。如果你是完全零基础,建议先用Docker一键部署跑通,再逐步深入。
1.2 数据从设备到屏幕的全链路设计
整个项目的核心可以用一条链路概括:设备 -> 接入网关 -> 消息队列 -> 规则处理 -> 时序存储 -> 可视化展示。我搭的这套方案具体每一层是这样的:
- 设备层:ESP8266/ESP32、DTU、工业网关等,通过 MQTT 协议上报数据
- 接入层:EMQX 作为 MQTT Broker,负责海量设备连接和消息路由
- 处理层:ThingsBoard 规则引擎,负责数据清洗、格式转换、阈值判断
- 存储层:Cassandra + PostgreSQL 组合,时序数据进 Cassandra,业务元数据进 PostgreSQL
- 可视化层:ThingsBoard 自带仪表盘 + 自定义大屏
为什么选择 MQTT 作为主力接入协议?它专为低带宽、高延迟、不稳定网络设计,报文头极小,支持 QoS 等级,还能保持长连接。对于大多数传感器数据上报场景,MQTT 比 HTTP 轮询省电、省流量,实时性也更好。
这个链路设计最大的好处是每一层都可以独立替换。比如你不想用 EMQX,可以换成 Mosquitto;不想用 ThingsBoard,可以只保留 EMQX + Grafana + 时序数据库自己拼。灵活度非常高,这也是开源方案的核心价值所在。
2. 核心组件选型:ThingsBoard 和 EMQX 为什么能扛大梁
2.1 整体技术栈怎么搭更稳
这套方案的选型逻辑是:接入层用 EMQX,平台层用 ThingsBoard,两者各司其职。我先对比一下当前主流的开源物联网平台,你就明白为什么这么选了。
| 平台 | 协议支持 | 规则引擎 | 可视化 | 二次开发难度 | 适用场景 |
|---|---|---|---|---|---|
| ThingsBoard | MQTT, CoAP, HTTP | 强(规则链可视化编排) | 强(仪表盘+自定义大屏) | 中 | 通用物联网平台、设备管理、数据可视化 |
| Node-RED | MQTT, HTTP 等 | 中(流式编程) | 中(Dashboard 节点) | 低 | 快速原型、系统集成、边缘处理 |
| JetLinks | MQTT, HTTP | 中 | 中 | 中高 | 国内项目、企业级物联网平台 |
| Kaa | MQTT, CoAP | 弱 | 中 | 高 | 研究学习、定制化平台 |
| Mainflux | MQTT, CoAP, HTTP | 弱 | 无(需自己搭) | 高 | 极简核心、微服务架构 |
实际项目中我最后选了 ThingsBoard,核心三个理由:规则引擎是可视化编排的,业务人员也能看懂数据流向;自带完整的设备管理生命周期,从注册、激活到禁用都有现成功能;仪表盘能直接绑定设备遥测数据,做可视化大屏不用额外开发。Node-RED 更适合做边缘侧的快速集成,比如把 Modbus 转 MQTT、把 HTTP 数据转成 MQTT,这种场景它比 ThingsBoard 更顺手。
2.2 部署时的一些关键决策
部署方式上,Docker Compose 是最省心的选择。我用的部署结构是三个核心服务:PostgreSQL 存实体和元数据、Cassandra 存时序遥测、ThingsBoard 主服务。如果你只是测试,
可以把 Cassandra 换成 PostgreSQL 单库模式,ThingsBoard 支持混合模式,但生产环境建议还是按标准模式来。
版本选择也很关键。ThingsBoard 的社区版(CE)是免费的,专业版(PE)收费。大部分场景社区版就够用:无限制设备接入、无限制仪表盘、基本规则引擎、告警功能都有。PE 版多了 OTA 升级、白标、高级权限控制这些企业功能,前期不需要。我建议先用 CE 跑通业务,确定确实需要企业功能再升级,避免一开始就背上 license 成本。
部署完后有个容易被忽略的点:修改默认端口和密码。ThingsBoard 默认的 8080 端口和系统管理员账号密码是公开的,不修改等于把大门敞开。另外建议在 EMQX 和 ThingsBoard 前面加一层 Nginx 做 TLS 终止,物联网设备明文传输数据是非常危险的事情。
3. 设备管理与数据收集:从设备注册到数据上云
3.1 设备接入鉴权与生命周期管理
设备管理这块,ThingsBoard 的设备概念分三层:租户 -> 客户 -> 设备。租户是最大的隔离单位,不同租户之间的数据完全隔离。每个设备有一个 Access Token,作为设备的唯一凭证,上报数据时必须带上这个 Token,平台校验通过才接收。
实际运营中,设备管理要特别注意三个细节:
- 设备配置分组:把同类型设备放在同一个设备配置组里,统一管理消息上报频率、数据解析方式、告警规则。如果每台设备单独配置,后期维护就是灾难。
- 设备状态监控:利用 ThingsBoard 的“设备连接状态”功能,配合规则引擎做离线告警。我在规则链里加了一个判断:超过 5 分钟没有收到设备消息就触发离线事件,推送给运维人员。
- 设备生命周期:设备报废或替换时,不要直接删记录,建议把状态改为“禁用”。删除会连坐历史数据,禁用则保留审计痕迹,排查历史问题还能找到当时是什么设备上报的数据。
3.2 数据上云的那些坑
设备端接入时最常踩的坑是 MQTT Topic 和 Payload 格式对不上。ThingsBoard 要求设备往特定 Topic 上报 JSON 格式的遥测数据,格式是{"temperature": 26.5, "humidity": 60},外层不能再包一层。很多设备固件发的是数组格式或者带时间戳的嵌套格式,平台解析不到字段,表现在仪表盘上就是没数据但设备明明在线。
协议转换的问题也不容忽视。如果设备端只支持 TCP 透传,不支持 MQTT,有两种常见解决办法:一是在网关上装一个协议转换程序,解析 TCP 数据后重新封装成 MQTT 报文;二是给 ThingsBoard 写自定义协议扩展。大部分团队用第一种方案就够,直接把转换逻辑放在 EMQX 的规则引擎里处理,比在设备端改固件省事得多。
数据可靠性方面,MQTT 的 QoS 级别要选对。QoS 0 是尽力而为,可能丢消息;QoS 1 保证至少一次,但可能重复;QoS 2 保证恰好一次,但性能开销大。大多数传感器上报场景,QoS 1 就够了。温湿度数据偶尔重复一条,对最终结果无伤大雅。关键控制指令建议用 QoS 2,比如远程控制阀门开关,重复执行或丢失都可能造成事故。
4. 数据处理与存储:从原始报文到可用指标
4.1 规则引擎处理脏数据和阈值计算
数据从设备进入平台,如果没有处理逻辑就直接存储,后续应用层会非常难受。传感器数据普遍存在三类问题:乱序到达、重复上报、异常突变。全部靠应用端处理不现实,所以我把处理逻辑前置到 ThingsBoard 规则引擎里。
规则链的设计是:先从消息中提取设备名称和遥测字段,做格式校验。字段缺失的直接丢弃并发送 debug 日志。再判断数据是否在合理范围内,比如温度传感器上报了 80 度,明显超出正常范围,标记为“异常”直接走告警分支,不进入正常存储路径。
阈值判定和告警我是在规则链里用“筛选器”节点实现的。每类设备配一个特定主题的告警规则,比如冷链运输场景,温度超过 8 度就触发告警并推送通知。规则链的脚本节点可以用 JavaScript 写复杂逻辑,比如滑动窗口内的均值突变检测,这在纯配置式的平台里做不到。
有一个细节特别值得注意:不要把原始数据直接存库,建议在规则链里做一次字段重命名和单位归一化。设备 A 上报温度单位是摄氏度,设备 B 可能上报的是华氏度,如果不在入口层统一单位,后面做跨设备对比分析时一不留神就是事故。这种问题排查起来极难,因为数据看起来都正常,就是数值对不上。
4.2 时序数据库选型与存储策略
存储这块我踩过一个坑,所以单独拿出来说。早期为了省事,所有数据都往 PostgreSQL 里塞,结果设备量到几百台、每台 5 秒上报一次时,写入性能急剧下降。后来迁移到 Cassandra,写入性能才稳定下来。
为什么用 Cassandra 而不是 InfluxDB?ThingsBoard 官方主推的时序存储方案就是 Cassandra,兼容性和优化做得最好。InfluxDB 在单机写入性能上更突出,但 ThingsBoard 官方支持度不如 Cassandra。这里选择的核心逻辑是:优先选平台官方深度集成的存储,而不是单独比数据库本身的性能。
数据保留策略也要提前规划。时序数据默认永久保留,但设备多了之后存储成本非常高。我在规则链里加了数据过期标记,原始上报数据保留 30 天,聚合后的分钟级数据保留 1 年。这样查询大屏数据时,用的是聚合数据表,速度快,原始数据只用于问题追溯。
数据清理方案上,Cassandra 的 TTL 机制比定期任务删除更靠谱。写入时直接指定 TTL,数据自动过期,不需要半夜跑定时任务手动清理,也不怕删除任务失败把磁盘塞爆。
5. 可视化与告警:让数据产生决策价值
5.1 仪表盘从 0 到 1 的配置过程
ThingsBoard 的仪表盘功能,是这套平台里见效最快、最有成就感的部分。配置的核心步骤是:先创建“实体别名”,把设备列表映射成一个别名,然后在仪表盘部件中引用这个别名,选择要展示的遥测字段,拖动布局,保存发布。
刚上手时建议先用自带部件库里的“Timeseries Chart”和“Card”部件,前者展示趋势,后者展示最新值。很多朋友一上来就想做炫酷大屏,忽略了基础图表的可用性。基础图表先跑通,确认数据链路没问题,再考虑视觉效果。
做可视化大屏时,我强烈建议遵循“三层信息架构”原则:顶层展示核心 KPI 和异常状态,让决策者在十秒内看到最关键的信息;中间层展示趋势变化,例如温湿度曲线;底层是明细数据,供排查问题使用。大屏不是数据堆砌,而是决策辅助工具。如果一屏放了数十个图表,没有重点,看的人反而什么都记不住。
大屏性能优化也是一个重点。实时刷新频率不要设成 1 秒,物联网数据变化没那么快,5 秒到 10 秒刷新一次足够。默认的实时刷新每个部件都要发起请求,设备量一大浏览器就卡死。我的做法是把大屏上的图表分成实时区和准实时区,核心指标走 5 秒刷新,趋势图走 30 秒刷新。
5.2 告警联动和告警风暴处理
可视化不只是图表,还包括告警。这套方案里,告警的触发逻辑由规则引擎负责,告警的展示由仪表盘的“告警表”部件负责。告警数据实时推送到前端,运维人员能第一时间看到异常。
告警这里有个经典问题:告警风暴。设备批量掉线时,管理员手机瞬间收到几百条通知,真正重要的告警被淹没。处理方式是在规则链里做告警聚合,比如同一租户下同类型的告警,5 分钟内只发一条通知,并带上数量汇总。具体做法是用规则引擎的“累积”节点,按设备类型+告警类型分组,统计窗口内告警次数,达到阈值再推给管理员。
另一个实用技巧是告警升级机制。普通告警发出后,如果 15 分钟内没有被确认,自动升级为紧急告警,通过企业微信或钉钉机器人再次推送。这个机制在无人值守的场景特别有用。设备半夜开始异常,值班人员没看到普通通知,升级告警可以确保信息不会漏掉。
6. 常见问题与排查技巧实录
6.1 设备频繁掉线问题排查
运行这套平台最容易碰到的问题是设备频繁掉线。现象是设备在线状态反复跳动,设备端日志里能看到 MQTT 连接不断断开重连。
排查思路按层次来:先看网络层,抓包确认设备到 Broker 的链路有没有丢包。如果是在 WiFi 环境,2.4G 频段干扰非常常见;再看 Broker 层,EMQX 默认的连接数限制是多少,如果达到上限,新连接会被拒绝,旧连接如果没有正常断开,就会出现奇怪的掉线;最后看设备端的心跳与 Broker 的心跳协商是否一致。
一个很容易被忽略的坑是:EMQX 默认的keepalive是 60 秒,如果你设备端设了 300 秒,但中间有 NAT 网关的映射超时是 120 秒,连接会被 NAT 静默断开,但设备端并不知道。这个问题排查极难,因为看起来一切正常,就是设备每隔几分钟掉一次线。最后的解决办法是给设备端设心跳为 30 秒,并开启 MQTT 的遗嘱消息,设备异常下线时能立刻感知。
6.2 数据处理延迟和积压问题
数据量上升到一定程度,可能会发现大屏数据延时越来越大,甚至出现数据空白。这通常不是平台本身的问题,而是某个环节积压了。
排查先看消息队列的堆积情况。EMQX 的消息队列长度如果持续增长,说明消费速度跟不上生产速度。最常见的原因是规则引擎里的脚本节点写得太重——比如在脚本里做复杂的字符串拆分或调外部 API,每条消息都这样做,吞吐自然上不去。
一个性能优化的常用手段是“批量处理”。不要把单条消息交给 Kafka 或规则引擎一条条处理,而是把同一设备、同一秒内的多条数据合并成一条数组消息,再进入规则链做整体处理。这个优化我实测把有效吞吐提升了近三倍。
6.3 平台安全的几条硬建议
最后说说安全。很多朋友搭好平台后只顾着接设备和做图表,安全防护基本没有。物联网平台的安全事故,轻则数据泄露,重则设备被远程操控,这一点务必要重视。
第一,修改所有默认密码。ThingsBoard 的系统管理员、EMQX 的 dashboard 管理员、数据库密码全部改掉,密码要有一定复杂度。第二,开启 TLS 加密通信,设备和平台之间的数据传输必须加密。
第三,规则链里限制设备上报频率,防止设备被攻陷后疯狂刷数据,把存储耗尽。第四,定期备份 PostgreSQL 和 Cassandra 的数据,至少做全量 + 增量备份,我之前遇到过 Cassandra 节点磁盘满导致数据文件损坏的情况,没有备份就只能从头再来。
顺便提一下 Kafka 和 Redis 在这套架构中的位置。如果你数据量极大,建议在 EMQX 和 ThingsBoard 之间加一层 Kafka 做消息缓冲,削峰填谷。Redis 则用来做规则引擎的分布式缓存、设备会话状态存储,可以通过 Redis 可视化工具查看缓存命中率和 key 分布。当然,如果设备量只有几百台,这两个组件都是可选的,不要为了技术栈完整而引入不必要的复杂度。
最后分享一点个人体会
这套开源物联网平台方案,我从搭建到稳定运行用了好几周时间,最难的不是技术本身,而是理解每条数据从设备到屏幕到底经过了哪些环节、每个环节可能出什么幺蛾子。建议你从最小闭环开始,先接一台设备,把数据跑通,再加设备,再加告警,再做可视化。千万不要一上来就想把架构搭得无比庞大,分布式组件一多,问题排查难度指数级上升。
另外建议养成记录的习惯。设备接入时的 Token、规则链的版本变化、数据库的调整,都记录下来。物联网项目调试经常是几天之后回顾才发现问题,没有记录就无从下手。
如果后续想扩展,可以从边缘计算入手,把部分规则逻辑下沉到网关侧,减少云端压力;或者接入时序异常检测模型,让平台不只是展示数据,还能预测设备故障。只要底层链路搭得稳,上面怎么长都可以。
本文还有配套的精品资源,点击获取