本指南旨在构建一套基于Linux服务器的农产品环境(温度、湿度)实时监控系统。系统采用MQTT协议进行数据传输,InfluxDB进行时序数据存储,Grafana进行可视化展示。所有操作基于Ubuntu 22.04 LTS版本验证。
首先执行系统更新并安装必要的基础工具,确保后续软件安装不报错。
```bash sudo apt update && sudo apt upgrade -y sudo apt install -y wget curl gnupg2 software-properties-common ```我们需要Python来编写数据模拟采集脚本和入库脚本。安装Python3及pip管理工具。
```bash sudo apt install -y python3 python3-pip pip3 install paho-mqtt influxdb-client requests ```使用Eclipse Mosquitto作为消息代理,负责接收传感器上报的数据。
编辑配置文件以允许本地匿名连接(生产环境建议开启鉴权),并设置持久化。
修改配置文件 /etc/mosquitto/mosquitto.conf,输入以下完整内容:
```bash sudo nano /etc/mosquitto/mosquitto.conf ```在文件中粘贴以下内容:
```text listener 1883 allow_anonymous true persistence true persistence_location /var/lib/mosquitto/ ```确保状态显示为 active (running)。
InfluxDB非常适合存储农产品环境监控这类带时间戳的连续数据。
执行初始化命令,设置Bucket(存储桶)、Organization(组织)和Token。请务必记录下生成的Token。
```bash influx setup \ --username admin \ --password StrongPassword123! \ --org FarmMonitor \ --bucket cold_chain_data \ --retention 30d \ --force ``>执行后会返回一个Token字符串,将其保存到环境变量中,方便后续操作:
```bash export INFLUX_TOKEN="你刚才复制的Token字符串" ```我们将模拟农产品冷链仓库中的温湿度传感器数据,并通过MQTT发送,再由另一个脚本消费并写入数据库。
创建文件 sensor_simulator.py:
```bash nano ~/sensor_simulator.py ```输入以下完整代码:
```python import random import time import json import paho.mqtt.client as mqtt MQTT配置 BROKER_ADDRESS = "localhost" PORT = 1883 TOPIC = "farm/warehouse/zone1" client = mqtt.Client("Sensor_Simulator_01") def on_connect(client, userdata, flags, rc): print(f"Connected to MQTT Broker with result code {rc}") client.on_connect = on_connect client.connect(BROKER_ADDRESS, PORT, 60) client.loop_start() try: while True: 模拟温度:-2℃ 到 5℃ (冷链环境) temp = round(random.uniform(-2.0, 5.0), 2) 模拟湿度:80% 到 95% humidity = round(random.uniform(80.0, 95.0), 2) payload = { "temperature": temp, "humidity": humidity, "location": "Zone-A-Shelf-1" } client.publish(TOPIC, json.dumps(payload)) print(f"Sent data: {payload}") time.sleep(5) 每5秒发送一次 except KeyboardInterrupt: client.loop_stop() ```创建文件 data_writer.py。注意替换 YOUR_TOKEN 为你之前获取的Token。
```bash nano ~/data_writer.py ```输入以下完整代码:
```python import json import paho.mqtt.client as mqtt from influxdb_client import InfluxDBClient, Point from influxdb_client.client.write_api import SYNCHRONOUS InfluxDB 配置 ORG = "FarmMonitor" BUCKET = "cold_chain_data" TOKEN = "YOUR_TOKEN" 请替换为实际Token URL = "http://localhost:8086" MQTT配置 BROKER = "localhost" TOPIC = "farm/warehouse/zone1" client_db = InfluxDBClient(url=URL, token=TOKEN, org=ORG) write_api = client_db.write_api(write_options=SYNCHRONOUS) def on_message(client, userdata, msg): try: payload = json.loads(msg.payload.decode()) temp = payload['temperature'] hum = payload['humidity'] loc = payload['location'] point = Point("sensor_data") \ .tag("location", loc) \ .field("temperature", temp) \ .field("humidity", hum) write_api.write(bucket=BUCKET, record=point) print(f"Written to DB: {temp}C, {hum}%") except Exception as e: print(f"Error processing message: {e}") client_mqtt = mqtt.Client("DB_Writer_01") client_mqtt.on_message = on_message client_mqtt.connect(BROKER, 1883, 60) client_mqtt.subscribe(TOPIC) print("Listening for data...") client_mqtt.loop_forever() ```为了防止脚本退出,使用Systemd将这两个Python脚本注册为系统服务。
创建服务文件:
```bash sudo nano /etc/systemd/system/farm-sensor.service ```输入以下内容(假设Python路径为/usr/bin/python3,脚本在home目录):
```ini [Unit] Description=Farm Sensor Simulator After=network.target [Service] Type=simple User=root WorkingDirectory=/root ExecStart=/usr/bin/python3 /root/sensor_simulator.py Restart=always [Install] WantedBy=multi-user.target ```输入以下内容:
```ini [Unit] Description=Farm Data Writer to InfluxDB After=network.target influxdb.service mosquitto.service [Service] Type=simple User=root WorkingDirectory=/root ExecStart=/usr/bin/python3 /root/data_writer.py Restart=always [Install] WantedBy=multi-user.target ```检查日志确认运行正常:
```bash journalctl -u farm-writer -f ```
通过Grafana将存储的数据转化为直观的图表。
1. 浏览器访问 http://服务器IP:3000,默认账号admin/admin(首次登录需修改密码)。
2. 点击 Configuration -> Data sources -> Add data source。
3. 选择 InfluxDB。
4. 配置以下参数:
5. 点击 Save & Test,显示Data source is working即成功。
1. 点击 Create -> Dashboard。
2. 点击 Add an empty panel。
3. 在Query编辑框中输入以下Flux查询语句:
```text from(bucket: "cold_chain_data") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "sensor_data") |> filter(fn: (r) => r._field == "temperature") ```4. 右侧设置Panel Title为“冷链温度监控”,Visualization选择“Time series”。
5. 点击右上角 Apply 保存面板。
6. 再次添加面板,将Flux查询中的 r._field == "humidity" 以监控湿度。
农产品对温度极其敏感,我们需要设置报警规则。例如,当温度超过4℃时触发警报。
在Grafana中,进入 Alerting -> Notification channels,添加Email或Webhook通知方式(此处略过具体SMTP配置,假设已配置Email)。
1. 回到刚才创建的温度面板,点击编辑。
2. 切换到 Alert 选项卡。
3. 点击 Create Alert。
4. 设置条件 WHEN avg() OF query(A, 5m, now) IS ABOVE 4。
5. 设置Notifications,选择刚才创建的通道。
6. 保存Dashboard。
至此,一套完整的农产品冷链监控运维系统已搭建完成,能够实现数据的自动采集、存储、可视化展示及超限报警。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图