MQTT 工控上云实战:EMQX 本地部署、设备数据上报、云端下发控制指令
MQTT 工控上云实战EMQX 本地部署、设备数据上报、云端下发控制指令工控设备上云就像给工厂里的哑巴设备装了张嘴——它终于能说话了而且说的是MQTT。一、MQTT协议物联网的普通话MQTTMessage Queuing Telemetry Transport是IBM在1999年发明的一种轻量级消息协议专门为带宽有限、网络不稳定的环境设计。说白了它就是物联网设备之间交流的普通话。为什么工控上云首选MQTT轻量级协议头部最小仅2字节比HTTP那动辄几百字节的头部瘦身了几个量级发布/订阅模式设备不需要知道对方是谁只管往Topic里扔数据或取数据多级QoS从发完就不管到必须确认收到灵活适配不同场景长连接不像HTTP每次都要握手MQTT保持TCP长连接实时性更好1.1 MQTT核心概念概念说明工控类比Broker消息中间服务器所有消息的中转站工厂调度中心Topic消息主题类似频道地址产线编号/设备编号QoS 0At most once发一次不管结果广播喊一声听见算听见QoS 1At least once至少送达一次发快递可能重复收到QoS 2Exactly once恰好送达一次挂号信签收确认Retain保留消息新订阅者立即收到最后一条黑板上的最后通知Will遗嘱消息设备异常断线时自动发布设备挂了留遗言Topic的层级设计很重要。工控场景建议采用这样的层级结构工厂/产线/设备/数据类型 例如: factoryA/line1/sensor01/temperature factoryA/line1/device02/controlQoS选择建议传感器数据上报用QoS 0丢了无所谓下一秒又来一条控制指令下发用QoS 1或2开关继电器的指令不能丢。二、EMQX Broker本地部署EMQX是目前最流行的开源MQTT Broker单节点可支撑百万级连接。工控场景用它绰绰有余。2.1 Docker部署推荐一条命令搞定dockerrun-d\--nameemqx\-p1883:1883\-p8083:8083\-p18083:18083\emqx/emqx:5.0端口说明端口协议用途1883MQTT TCP设备连接端口8083MQTT WebSocketWeb端连接18083HTTP管理面板Dashboard2.2 二进制部署如果工控板跑不了Docker就用二进制方式# 下载解压wgethttps://www.emqx.com/downloads/broker/5.0/emqx-5.0-centos7-amd64.tar.gztar-zxvfemqx-5.0-centos7-amd64.tar.gz# 启动./emqx/bin/emqx start# 查看状态./emqx/bin/emqx_ctl status2.3 Web管理面板浏览器打开http://IP:18083默认账号admin / public。Dashboard能看到当前连接数、主题数、消息流量客户端列表谁连着、订阅了什么主题树可视化认证与ACL配置入口2.4 认证配置裸奔的Broker谁都能连工控环境必须加认证。EMQX内置多种认证方式# 在Dashboard → Authentication 中配置# 方式1内置用户名密码数据库# 添加用户: device01 / password123# 方式2MySQL/PostgreSQL外部数据库认证# 方式3JWT令牌认证推荐工控场景用内置数据库认证简单够用。每个设备分配独立账号ACL限制它只能订阅和发布自己的Topic。三、Paho MQTT C库使用Eclipse Paho是MQTT官方推荐的客户端库C语言版本适合嵌入式/工控设备。3.1 安装gitclone https://github.com/eclipse/paho.mqtt.c.gitcdpaho.mqtt.cmakesudomakeinstall3.2 核心API一览#includeMQTTClient.h// 创建客户端MQTTClient_create(client,tcp://broker:1883,client_id,MQTTCLIENT_PERSISTENCE_NONE,NULL);// 设置回调消息到达、连接丢失MQTTClient_setCallbacks(client,NULL,connlost,msgarrvd,delivered);// 连接MQTTClient_connect(client,opts);// 发布MQTTClient_publishMessage(client,topic,msg,token);// 订阅MQTTClient_subscribe(client,topic,QOS);四、实战1设备端定时上报传感器数据这是工控上云最典型的场景——设备每秒把温度、湿度、压力等数据往云端Topic扔。#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includetime.h#includeMQTTClient.h#defineBROKER_ADDRtcp://192.168.1.100:1883#defineCLIENT_IDfactoryA_line1_sensor01#defineTOPIC_UPLOADfactoryA/line1/sensor01/data#defineQOS_UPLOAD0/* 传感器数据丢了无所谓 */volatileMQTTClient_deliveryCompleted delivered0;voidconnlost(void*context,char*cause){printf(连接丢失: %s\n,cause);/* 自动重连逻辑可在此实现 */}intmsgarrvd(void*context,char*topicName,inttopicLen,MQTTClient_message*msg){printf(收到消息: %s\n,(char*)msg-payload);MQTTClient_freeMessage(msg);MQTTClient_free(topicName);return1;}voiddelivered(void*context,MQTTClient_deliveryToken dt){delivered1;}/* 模拟传感器采集 */floatread_temperature(void){return25.0f(rand()%100)/10.0f;}floatread_humidity(void){return50.0f(rand()%100)/10.0f;}intmain(void){MQTTClient client;MQTTClient_connectOptions optsMQTTClient_connectOptions_initializer;MQTTClient_create(client,BROKER_ADDR,CLIENT_ID,MQTTCLIENT_PERSISTENCE_NONE,NULL);opts.keepAliveInterval20;opts.cleansession1;opts.usernamedevice01;opts.passwordpassword123;MQTTClient_setCallbacks(client,NULL,connlost,msgarrvd,delivered);if(MQTTClient_connect(client,opts)!MQTTCLIENT_SUCCESS){printf(连接Broker失败!\n);return-1;}/* 定时上报循环 */while(1){charpayload[256];time_tnowtime(NULL);/* JSON格式封装数据必须包含时间戳 */snprintf(payload,sizeof(payload),{\ts\:%ld,\temp\:%.1f,\humi\:%.1f,\dev\:\sensor01\},(long)now,read_temperature(),read_humidity());MQTTClient_message msgMQTTClient_message_initializer;msg.payloadpayload;msg.payloadlenstrlen(payload);msg.qosQOS_UPLOAD;msg.retained0;MQTTClient_publishMessage(client,TOPIC_UPLOAD,msg,NULL);printf(上报: %s\n,payload);sleep(5);/* 每5秒上报一次 */}MQTTClient_disconnect(client,10000);MQTTClient_destroy(client);return0;}关键设计要点JSON编码统一格式ts字段带时间戳方便云端对时排序Topic层级包含设备标识云端可按Topic过滤特定设备。五、实战2云端下发控制指令设备不仅要说话还要能听话——云端下发开关继电器、修改采集参数的指令。设备端订阅控制Topic收到指令后执行动作#defineTOPIC_CONTROLfactoryA/line1/sensor01/control#defineQOS_CONTROL1/* 控制指令不能丢 *//* 在连接成功后订阅 */MQTTClient_subscribe(client,TOPIC_CONTROL,QOS_CONTROL);/* msgarrvd回调中解析控制指令 */intmsgarrvd(void*context,char*topicName,inttopicLen,MQTTClient_message*msg){char*payload(char*)msg-payload;/* 简单JSON解析生产环境建议用cJSON库 */if(strstr(payload,\cmd\:\relay_on\)){printf(执行: 开启继电器\n);/* 调用GPIO操作函数 */}elseif(strstr(payload,\cmd\:\relay_off\)){printf(执行: 关闭继电器\n);}elseif(strstr(payload,\cmd\:\set_interval\)){printf(修改采集间隔\n);}MQTTClient_freeMessage(msg);MQTTClient_free(topicName);return1;}云端下发示例Python脚本importpaho.mqtt.clientasmqttimportjson clientmqtt.Client(cloud_controller)client.username_pw_set(admin,admin123)client.connect(192.168.1.100,1883)# 开启继电器cmd{cmd:relay_on,relay_id:1,ts:int(time.time())}client.publish(factoryA/line1/sensor01/control,json.dumps(cmd),qos1)# 修改采集间隔cmd{cmd:set_interval,interval_sec:10}client.publish(factoryA/line1/sensor01/control,json.dumps(cmd),qos1)六、MQTT安全配置工控上云安全是底线。裸跑MQTT等于把工厂大门敞开。6.1 TLS加密传输# 生成证书测试用自签名openssl genrsa-outca.key2048openssl req-new-x509-days365-keyca.key-outca.crt# EMQX配置TLS监听# Dashboard →Listeners → 添加 8883 端口 SSL Listener# 绑定 ca.crt 和 server证书C客户端连接TLS端口#defineBROKER_SSLssl://broker:8883MQTTClient_create(client,BROKER_SSL,CLIENT_ID,...);opts.sslsslopts;sslopts.trustStore/etc/ssl/certs/ca.crt;6.2 用户名密码认证前面已介绍每个设备独立账号配合ACL限制Topic权限# ACL规则示例 user device01 topic write factoryA/line1/sensor01/data topic read factoryA/line1/sensor01/control # 其他Topic一律禁止七、数据格式建议工控数据上云格式统一是团队协作的基础{ts:1700000000,/* Unix时间戳秒级 */dev:sensor01,/* 设备ID */temp:25.3,/* 温度 */humi:52.1,/* 湿度 */press:1013.25,/* 压力 */status:normal/* 设备状态 */}原则时间戳必带云端不做时间推测字段名统一短命名省带宽数值类型一致别一会儿string一会儿number。MQTT把工控设备从孤岛拉进了互联网从数据上报到指令下发形成闭环。协议简洁、部署轻快、安全可控——这三个词放在工控场景就是靠谱。

相关新闻

智慧社区 | 以全域智能物联,构筑平安宜居新型社区

智慧社区 | 以全域智能物联,构筑平安宜居新型社区

随着基层治理现代化进程持续推进,传统社区管理模式存在安防点位分散、人车管理粗放、隐患发现滞后、治理手段单一等痛点,难以满足居民对安全、便捷、舒适居住环境的需求。智安社区一体化解决方案,整合 10 大类、20 余种品牌 AI 智能硬件统一接…

2026/10/19 2:00:00 阅读更多 →
LangSmith:LLM 应用调试与评估平台

LangSmith:LLM 应用调试与评估平台

1. 为什么需要 LangSmith? 随着 LLM 应用逐渐从 Demo 阶段进入生产环境,开发者会遇到越来越多的问题: 例如: 为什么模型回答错误?是 Prompt 设计的问题吗?是知识库检索到了错误内容?是模型本…

2026/10/17 10:50:50 阅读更多 →
耐溶剂胶辊的使用寿命受哪些基础因素影响?

耐溶剂胶辊的使用寿命受哪些基础因素影响?

‍在印刷、涂布、化工膜材加工等大量接触有机溶剂的生产场景中,耐溶剂胶辊是保障产线稳定运行的核心配件。相较于普通橡胶胶辊,耐溶剂胶辊依靠改性高分子配方与特殊成型工艺抵御溶剂侵蚀,但在实际生产里,同款耐溶剂胶辊在不同工况…

2026/10/16 20:19:51 阅读更多 →

最新新闻

ESP32应用商店:固件模块化分发与动态加载实战

ESP32应用商店:固件模块化分发与动态加载实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 1:59:27 阅读更多 →
AI服务器供电架构巨变:从300W到5.5kW,从12V到50V的工程实践

AI服务器供电架构巨变:从300W到5.5kW,从12V到50V的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 1:59:27 阅读更多 →
移动端LLM自动化测试:通用Agent框架下沉的五层架构与踩坑复盘

移动端LLM自动化测试:通用Agent框架下沉的五层架构与踩坑复盘

这个系列前面聊了好几期的LLM自动化测试,Web端、PC端都踩过不少坑,到了移动端这一篇,我想换个角度来聊——不是再写一篇“怎么调Prompt让Agent点按钮”,而是聊一件更扎心的事:当通用Agent框架真的下沉到测试场景时&…

2026/10/19 1:59:27 阅读更多 →
桌面端本地离线AI推理实战:llama.cpp与GGUF模型选型部署指南

桌面端本地离线AI推理实战:llama.cpp与GGUF模型选型部署指南

1. 桌面端本地推理的选型背景与核心思路把大模型塞进桌面端这件事,最早让我动心的是一个很朴素的需求:断网环境下也要能用。我做的一些项目经常需要在客户内网、展会现场、甚至飞机上处理文本,云端API一断就抓瞎。于是从去年开始,…

2026/10/19 1:59:27 阅读更多 →
基于语义空间的可召回KV Cache压缩:突破长文本推理显存瓶颈

基于语义空间的可召回KV Cache压缩:突破长文本推理显存瓶颈

1. 项目概述1.1 核心需求解析这篇论文瞄准的是大模型推理中一个非常现实的痛点:当上下文长度不断拉长,KV Cache占用的显存几乎呈线性膨胀,最后把推理卡死在显存上。我用一个很直白的例子来说明——你部署一个7B参数的模型,参数量本…

2026/10/19 1:59:27 阅读更多 →
FuzzFeed: An Automatic Approach to Weakest Precondition Generation using LLMs and Fuzzing

FuzzFeed: An Automatic Approach to Weakest Precondition Generation using LLMs and Fuzzing

文章主要内容和创新点 主要内容 本文提出了一种名为FuzzFeed的自动生成最弱前置条件(Weakest Precondition, WP)的方法,该方法结合大语言模型(LLMs)和模糊测试(fuzzing)技术,通过模糊测试引导(Fuzzing Guidance, FG)机制优化LLM生成的候选WP,最终提高WP的正确性和…

2026/10/19 1:58:27 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →