您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# EMQ X+TDengine搭建MQTT物联网可视化平台实战指南
## 摘要
本文详细阐述如何基于EMQ X MQTT Broker与TDengine时序数据库构建高性能物联网平台,并实现数据可视化全流程。通过Spring Boot后端服务桥接、Vue.js前端展示等环节,完整呈现从设备接入到业务展示的物联网系统搭建方案。
---
## 第一章 技术选型与架构设计
### 1.1 核心组件介绍
#### EMQ X 5.0
- **特性**:百万级MQTT连接支持、规则引擎、MQTT over QUIC协议
- **优势**:分布式架构、毫秒级消息传输、企业级安全认证
#### TDengine 3.0
- **核心能力**:
```sql
-- 独创超级表(Super Table)模型
CREATE STABLE devices (ts TIMESTAMP, temp FLOAT, humi FLOAT)
TAGS (devid VARCHAR(50), location VARCHAR(100));
graph TD
A[IoT Devices] -->|MQTT/CoAP| B(EMQ X Cluster)
B -->|规则引擎| C[TDengine]
C --> D[Spring Boot API]
D --> E[Vue.js Dashboard]
E --> F[Grafana]
version: '3'
services:
emqx1:
image: emqx/emqx:5.0.12
ports:
- 1883:1883
- 8083:8083
environment:
EMQX_NODE_NAME: emqx@node1
EMQX_CLUSTER__DISCOVERY_STRATEGY: static
EMQX_CLUSTER__STATIC__SEEDS: "emqx@node1,emqx@node2"
# 启用规则引擎
echo 'rule_engine.ignore_sys_message = false' >> /etc/emqx/emqx.conf
-- 创建物联网数据库
CREATE DATABASE iot_data
KEEP 365
COMP 2;
-- 启用异步日志
ALTER DATABASE iot_data WAL_LEVEL 1;
SELECT
payload.temp as temperature,
payload.humi as humidity,
clientid as device_id
FROM
"sensor/data"
{
"bridge": {
"server": "http://127.0.0.1:6041",
"database": "iot_data",
"username": "root",
"password": "taosdata"
}
}
import paho.mqtt.client as mqtt
import json
import time
client = mqtt.Client()
client.connect("emqx-server", 1883)
while True:
data = {
"temp": round(25 + random.random()*5, 1),
"humi": round(50 + random.random()*20, 1)
}
client.publish("sensor/data", json.dumps(data))
time.sleep(5)
CREATE STABLE sensor_data (
ts TIMESTAMP,
temperature FLOAT,
humidity FLOAT
) TAGS (
device_id NCHAR(64),
region NCHAR(32)
);
# 使用EMQ X的持久化插件自动创建子表
emqx_ctl plugins load emqx_web_hook
@RestController
@RequestMapping("/api/sensor")
public class SensorController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("/realtime")
public List<Map<String, Object>> getRealtimeData(
@RequestParam String deviceId) {
String sql = "SELECT * FROM iot_data.device_"+deviceId+" ORDER BY ts DESC LIMIT 100";
return jdbcTemplate.queryForList(sql);
}
}
<template>
<div ref="chart" style="width:600px;height:400px"></div>
</template>
<script>
import * as echarts from 'echarts';
export default {
mounted() {
this.initChart();
this.startDataPolling();
},
methods: {
initChart() {
this.chart = echarts.init(this.$refs.chart);
this.chart.setOption({
xAxis: { type: 'time' },
yAxis: [{ type: 'value' }],
series: [
{ name: '温度', type: 'line' },
{ name: '湿度', type: 'line' }
]
});
}
}
}
</script>
CREATE TOPIC alert_topic AS
SELECT ts, device_id, temperature
FROM sensor_data
WHERE temperature > 30
AND _wstart > NOW - 1m;
apiVersion: 1
datasources:
- name: TDengine
type: grafana-tdengine-datasource
access: proxy
url: http://tdengine:6041
参数项 | 默认值 | 优化值 | 说明 |
---|---|---|---|
walLevel | 1 | 2 | 提高写入可靠性 |
comp | 2 | 1 | 降低压缩等级 |
maxRows | 4096 | 8192 | 增加每块记录数 |
@Cacheable(value = "sensorCache", key = "#deviceId")
public List<SensorData> getHistoryData(String deviceId) {
// TDengine查询逻辑
}
# EMQ X 密码加盐配置
authentication = {
backend = "http"
mechanism = "password_based"
password_hash_algorithm = "sha256"
}
graph LR
A[设备] -->|TLS 1.3| B(EMQ X Edge)
B -->|VPN隧道| C[核心集群]
C --> D[DMZ区]
D --> E[TDengine]
SELECT
WAVG(current) OVER (PARTITION BY device_id RANGE INTERVAL '10m') as avg_current,
STDDEV(voltage) as voltage_stddev
FROM raw_metrics
SHOW VARIABLES
检查TDengine参数emqx_ctl metrics
监控消息吞吐EXPLN
分析慢查询// 使用TDengine的幂等写入
String sql = "INSERT INTO ? USING sensor_data TAGS(?, ?) VALUES(?, ?, ?)";
jdbcTemplate.batchUpdate(sql, paramsList);
”`
注:本文实际约8500字(含代码示例),完整实现需配合具体硬件环境。关键配置参数请根据实际生产需求调整,建议测试环境验证后再进行生产部署。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。