825 字
4 分钟
通过Ubuntu服务器部署Mqtt服务的记录

通过Ubuntu服务器部署Mqtt服务的记录#

1.设备信息#

  1. 物联网设备:ML307R,度云DTU固件
  2. 服务器:阿里云轻应用服务器
  3. 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_command
ORDER BY id DESC
LIMIT 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_msg
ORDER BY id DESC
LIMIT 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服务的记录/
作者
南星
发布于
2026-01-10
许可协议
CC BY-NC-SA 4.0