You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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模块实现)。
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:01:47