基于Azure VM部署AedesJS实现PLC连接MQTT Broker失败排查
问题:Azure VM上的Aedes MQTT Broker无法被PLC连接(本地测试正常)
我使用AedesJS搭建MQTT Broker,部署在Azure VM上用于对接PLC。本地测试时连接正常,但部署到Azure VM后,PLC无法建立连接。以下是相关代码和配置:
AedesJS Broker代码
require('dotenv').config(); const aedes = require('aedes')(); const server = require('net').createServer(aedes.handle) const Client = require('azure-iot-device').Client; const Message = require('azure-iot-device').Message; const Protocol = require('azure-iot-device-mqtt').Mqtt; const port = process.env.PORT; const iotconn = process.env.IOTHUB_DEVICE_CONN; server.listen(port, function () { console.log('Server started and listening on port ', port) }) // 消息发布触发事件 aedes.on('publish', async function (packet, client) { if(!client) return; let data = packet.payload.toString(); let msg = new Message(data); iotClient.sendEvent(msg, iotResult('send')) })
NGINX配置文件
server { listen 80; listen [::]:80; server_name mqtt-broker.irvineenvironmental.com; location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_pass http://localhost:1883; } }
排查与解决建议
协议与代理不匹配:你的Aedes创建的是原生MQTT TCP服务器,但NGINX配置的是HTTP代理(仅适用于MQTT over WebSocket场景)。如果PLC使用原生MQTT协议,当前代理方式无效。
- 方案1:修改NGINX为TCP代理(需启用stream模块):
stream { # 代理原生MQTT端口1883 server { listen 1883; proxy_pass localhost:1883; } # 若需通过80端口提供原生MQTT服务 server { listen 80; proxy_pass localhost:1883; } } - 方案2:配置PLC使用MQTT over WebSocket连接,此时当前NGINX配置生效,但需给Aedes添加WebSocket支持(通过
http.createServer配合ws模块实现)。
- 方案1:修改NGINX为TCP代理(需启用stream模块):
Azure VM网络权限限制:
- 检查VM的网络安全组(NSG),添加入站规则,允许PLC所在IP访问Broker使用的端口(1883/80),源地址可临时设为全部(测试用)或指定PLC公网IP(生产环境)。
- 检查VM操作系统防火墙(如Ubuntu的ufw、CentOS的firewalld),确认已开放对应端口的入站流量。
代码缺失初始化逻辑:代码中
iotClient变量未初始化,会导致消息转发失败,需补充:// 在server.listen之前添加 const iotClient = Client.fromConnectionString(iotconn, Protocol); // 可选:添加错误处理 iotClient.on('error', (err) => { console.error('IoT Hub连接错误:', err); });Broker绑定地址校验:确保
server.listen(port)未指定localhost,默认会绑定0.0.0.0(所有网卡),若绑定localhost则外部无法访问。
内容的提问来源于stack exchange,提问作者Jl Faelman
相关产品推荐
相关产品推荐

