825 字
4 分钟
通过Ubuntu服务器部署Mqtt服务的记录
通过Ubuntu服务器部署Mqtt服务的记录
1.设备信息
- 物联网设备:ML307R,度云DTU固件
- 服务器:阿里云轻应用服务器
- linux版本:Ubuntu 24.02
2.物联网设备部署
1.部署方式
使用物联网设备提供的网站进行设置修改
2.参数记录
网络通道参数
通道类型使用MQTT,域名使用服务器公网ip,端口号选择1883
订阅自定义为:test/topic/down,发布消息自定义为:test/topic/up
QOS等级为1,publish参数retain为0
基本参数
心跳包开启,自定义字符串为hello,心跳间隔为600000ms
3.服务器端部署(代码问AI)
1.EMQX
防火墙
设置阿里云服务器防火墙白名单,放行端口请求
图形化界面
访问 公网ip:18083 进入图形化界面配置
调试
通过WebSocket 客户端,调试订阅和发送
2.数据库部署
数据库使用MySQL,读取逻辑为截取所有向服务器发送的MQTT数据,进行存储
数据处理脚本名:mqtt_to_mysql.py
自动运行脚本名:mqtt-saver.service
虚拟环境开启指令:source ~/mqtt_venv/bin/activate
数据查看:
##查看指令mysql -u emqx_user -p123456 -D emqx_data -e "SELECT '--- 当前总记录数 ---' AS '';SELECT count(*) AS total_rows FROM mqtt_msg;SELECT '--- 最近20条数据 (精简模式) ---' AS '';SELECT id, device_id, tds, cod, ph, temp, hum, created_at FROM mqtt_msg ORDER BY id DESC LIMIT 20;"
##监控器指令# 每 1 秒刷新一次watch -n 1 'mysql -u emqx_user -p123456 -D emqx_data -e "SELECT count(*) AS Total FROM mqtt_msg; SELECT id, device_id, tds, cod, ph, temp, hum, created_at FROM mqtt_msg ORDER BY id DESC LIMIT 40;"'
##重启指令# 1. 重新加载系统服务配置sudo systemctl daemon-reload# 2. 重启你的脚本服务sudo systemctl restart mqtt-saver.service# 3. 再次查看日志sudo journalctl -u mqtt-saver -f
指令库查询watch -t -n 1 'mysql -u emqx_user -p123456 -D emqx_data --table -e "SELECT COUNT(*) AS 指令总数, SUM(status = \"pending\") AS 待处理, SUM(status = \"executed\") AS 已执行, SUM(status = \"failed\") AS 失败数FROM mqtt_command;
SELECT id, command_type AS 类型, device_id AS 设备ID, -- 提取 JSON 中的 command 字段值 raw_command->>\"$.command\" AS 指令内容, CASE WHEN status = \"pending\" THEN \"待处理\" WHEN status = \"executed\" THEN \"已执行\" WHEN status = \"failed\" THEN \"失败\" ELSE status END AS 状态, DATE_FORMAT(created_at, \"%H:%i:%s\") AS 接收时间, IFNULL(DATE_FORMAT(executed_at, \"%H:%i:%s\"), \"-\") AS 执行时间FROM mqtt_commandORDER BY id DESCLIMIT 10;"'
数据库查询watch -t -n 1 'mysql -u emqx_user -p123456 -D emqx_data --table -e "SELECT COUNT(*) AS 采集总数, COUNT(DISTINCT device_id) AS 设备数量FROM mqtt_msg;
SELECT id, device_id AS 设备ID, ROUND(tds, 1) AS TDS, ROUND(cod, 1) AS COD, ROUND(ph, 1) AS pH值, ROUND(temp, 1) AS 温度, ROUND(hum, 1) AS 湿度, DATE_FORMAT(created_at, \"%m-%d %H:%i:%s\") AS 采集时间FROM mqtt_msgORDER BY id DESCLIMIT 30;"'数据库结构:
CREATE TABLE IF NOT EXISTS mqtt_msg ( id INT AUTO_INCREMENT PRIMARY KEY, device_id VARCHAR(50), -- 对应 JSON 中的 id tds FLOAT, cod FLOAT, toc FLOAT, uv254 FLOAT, ph FLOAT, temp FLOAT, hum FLOAT, zhexian1 FLOAT, zhexian2 FLOAT, raw_data TEXT, -- 保留一份原始数据备份 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);指令库结构
CREATE TABLE IF NOT EXISTS mqtt_command (id INT AUTO_INCREMENT PRIMARY KEY,command_type VARCHAR(50) COMMENT '指令类型,如:restart, config, update, stop等',device_id VARCHAR(50) COMMENT '目标设备ID(可为空)',sender VARCHAR(50) COMMENT '指令发送者',raw_command TEXT COMMENT '原始指令内容',status VARCHAR(20) DEFAULT 'pending' COMMENT '指令状态:pending, executed, failed',result TEXT COMMENT '执行结果(可选)',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,executed_at TIMESTAMP NULL COMMENT '指令执行时间',INDEX idx_device_id (device_id),INDEX idx_status (status),INDEX idx_created_at (created_at)); 通过Ubuntu服务器部署Mqtt服务的记录
https://fuwari.vercel.app/posts/通过ubuntu服务器部署mqtt服务的记录/