
整理了一份Grafana项目实战案例教程:集成IoT设备数据流。 为有相关需求的技术人员提供一个思路和一个技术指导。希望能给大家带来帮助。
为物联网开发者提供端到端的数据监控解决方案
典型IoT架构需求:
复制
[IoT设备] --MQTT--> [EMQX Broker] --Telegraf--> [InfluxDB]
│
└---> [Grafana实时可视化] 组件 | 用途 | 推荐版本 |
|---|---|---|
EMQX | MQTT消息代理(支持百万级连接) | 5.0+ |
Telegraf | 数据采集与转发 | 1.27+ |
InfluxDB | 时序数据库存储 | 2.6+ |
Grafana | 数据可视化与分析 | 9.4+ |
# 使用Docker快速部署
docker run -d --name emqx \
-p 1883:1883 -p 8083:8083 -p 8883:8883 \
-p 8084:8084 -p 18083:18083 \
emqx/emqx:5.1.4 验证MQTT连接:
mosquitto_pub -h localhost -t "sensor/temp" -m "25.5" docker run -d --name influxdb \
-p 8086:8086 \
-v influxdb:/var/lib/influxdb2 \
influxdb:2.6.1 初始化配置:
http://localhost:8086
iot_data
/etc/telegraf/telegraf.conf
[[inputs.mqtt_consumer]]
servers = ["tcp://localhost:1883"]
topics = ["sensor/#"]
data_format = "json"
[[outputs.influxdb_v2]]
urls = ["http://localhost:8086"]
token = "YOUR_API_TOKEN"
organization = "iot_org"
bucket = "iot_data" 启动服务:
systemctl restart telegraf Python模拟脚本:
import paho.mqtt.client as mqtt
import json
import random
client = mqtt.Client()
client.connect("localhost", 1883)
while True:
data = {
"device_id": "device_001",
"temp": round(random.uniform(20.0, 35.0), 1),
"humidity": random.randint(40, 80),
"location": {"lat": 31.23, "lng": 121.47}
}
client.publish("sensor/data", json.dumps(data))
time.sleep(5) Configuration → Data Sources
http://localhost:8086
iot_org
YOUR_API_TOKEN
iot_data
Panel 1:温度实时曲线
from(bucket: "iot_data")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "sensor_data")
|> filter(fn: (r) => r._field == "temp")
|> aggregateWindow(every: 1m, fn: mean) Panel 2:设备地理分布
grafana-worldmap-panel 插件
from(bucket: "iot_data")
|> range(start: -5m)
|> filter(fn: (r) => r._measurement == "sensor_data")
|> last()
|> map(fn: (r) => ({
lat: r.location_lat,
lng: r.location_lng,
value: r.temp
})) Panel 3:设备状态列表
from(bucket: "iot_data")
|> range(start: -5m)
|> filter(fn: (r) => r._measurement == "sensor_data")
|> last()
|> keep(columns: ["device_id", "temp", "humidity"]) 步骤:
from(bucket: "iot_data")
|> range(start: -5m)
|> filter(fn: (r) => r._field == "temp")
|> mean()
|> map(fn: (r) => ({
_value: r._value > 30 ? 1 : 0
})) from(bucket: "iot_data")
|> range(start: -10m)
|> filter(fn: (r) => r._measurement == "sensor_data")
|> group(columns: ["device_id"])
|> last()
|> map(fn: (r) => ({
device_id: r.device_id,
online: if time(v: r._time) > now() - duration(v: 5m) then 1 else 0
})) 数据存储优化:
CREATE RETENTION POLICY "iot_30days" ON "iot_data" DURATION 30d REPLICATION 1 查询加速:
CREATE CONTINUOUS QUERY "cq_1h_mean" ON "iot_data"
BEGIN
SELECT mean(*) INTO "iot_data"."autogen".:MEASUREMENT
FROM "iot_data"."autogen"./.*/ GROUP BY time(1h)
END Grafana缓存:
[grafana.ini]
default_cache = "redis://localhost:6379" 通过 Grafana ML 插件实现异常检测:
from(bucket: "iot_data")
|> anomaly_detection.metric()
|> algorithm(type: "robust_pca") 问题现象 | 排查方法 |
|---|---|
数据未显示 | 检查Telegraf日志 → 验证MQTT主题匹配 → 确认InfluxDB写入权限 |
地图显示偏移 | 确认经纬度字段为float类型 → 检查坐标系(WGS-84) |
告警未触发 | 验证Alert Rule查询语法 → 检查通知渠道配置 → 查看Alertmanager日志 |
完整项目代码仓库: https://github.com/example/grafana-iot-demo (包含Docker Compose文件、模拟数据生成器、Grafana仪表盘JSON)
通过本方案,可构建支持万级设备接入的物联网监控平台,数据延迟控制在秒级,存储成本降低40%。建议生产环境使用Kubernetes部署以实现高可用。
本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。