简体   繁体   English

无法使用 Node.js mqtt 库连接到 Eclipse Mosquitto 代理

[英]Cannot connect to Eclipse Mosquitto broker using Node.js mqtt library

I am running Eclipse Mosquitto on a local docker container on 172.17.0.2:1883我在 172.17.0.2:1883 的本地 docker 容器上运行 Eclipse Mosquitto

I am able to publish/subscribe using MQTT.fx client but now trying to connect to the broker from node and haven't been able to.我能够使用 MQTT.fx 客户端发布/订阅,但现在尝试从节点连接到代理但无法连接。

The topic is "sensors"主题是“传感器”

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                            NAMES
e747c86b6ec1        eclipse-mosquitto   "/docker-entrypoint.…"   5 hours ago         Up 5 hours          0.0.0.0:1883->1883/tcp, 0.0.0.0:9001->9001/tcp   adoring_varahamihira

When I inspect the IP address当我检查 IP 地址时

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' e747c86b6ec1
172.17.0.2

I am trying to use the following node server to connect to my MQTT broker but the 'connect' event never seems to happen.我正在尝试使用以下节点服务器连接到我的 MQTT 代理,但“连接”事件似乎从未发生过。

// Note: I have an express server running but didn't include 
const mqtt = require("mqtt")

var MQTT_TOPIC = "sensors";
var MQTT_ADDR = "mqtt://172.17.0.2";
var MQTT_PORT = 1883;

var client = mqtt.connect(MQTT_ADDR, {
  port: MQTT_PORT,
  clientId: 'bgtestnodejs232323',
  protocolId: 'MQIsdp',
  protocolVersion: 3,
  connectTimeout: 1000,
  debug: true
});

client.on('connect', function () {
  console.log("connected!")
});

client.on('error', function (err) {
  console.log(err)``
  client.end()
})

When I run:当我运行时:

console.log(util.inspect(client))

The output is:输出是:

MqttClient {
  options:
   { protocol: 'mqtt',
     slashes: true,
     auth: null,
     host: '172.17.0.2',
     port: 1883,
     hostname: '172.17.0.2',
     hash: null,
     search: null,
     query: [Object: null prototype] {},
     pathname: null,
     path: null,
     href: 'mqtt://172.17.0.2',
     clientId: 'bgtestnodejs232323',
     protocolId: 'MQIsdp',
     protocolVersion: 3,
     connectTimeout: 1000,
     debug: true,
     defaultProtocol: 'mqtt',
     keepalive: 60,
     reschedulePings: true,
     reconnectPeriod: 1000,
     clean: true,
     resubscribe: true,
     customHandleAcks: [Function] },
  streamBuilder: [Function: wrapper],
  outgoingStore: Store { options: { clean: true }, _inflights: Map {} },
  incomingStore: Store { options: { clean: true }, _inflights: Map {} },
  queueQoSZero: true,
  _resubscribeTopics: {},
  messageIdToTopic: {},
  pingTimer: null,
  connected: false,
  disconnecting: false,
  queue: [],
  connackTimer:
   Timeout {
     _called: false,
     _idleTimeout: 1000,
     _idlePrev: [TimersList],
     _idleNext: [TimersList],
     _idleStart: 478,
     _onTimeout: [Function],
     _timerArgs: undefined,
     _repeat: null,
     _destroyed: false,
     [Symbol(unrefed)]: false,
     [Symbol(asyncId)]: 9,
     [Symbol(triggerId)]: 1 },
  reconnectTimer: null,
  _storeProcessing: false,
  _packetIdsDuringStoreProcessing: {},
  nextId: 26898,
  outgoing: {},
  _firstConnection: true,
  _events:
   [Object: null prototype] {
     close: [ [Function], [Function], [Function] ],
     connect: [Function] },
  _eventsCount: 2,
  _maxListeners: undefined,
  stream:
   Socket {
     connecting: true,
     _hadError: false,
     _handle:
      TCP {
        reading: false,
        onread: [Function: onStreamRead],
        onconnection: null,
        [Symbol(owner)]: [Circular] },
     _parent: null,
     _host: null,
     _readableState:
      ReadableState {
        objectMode: false,
        highWaterMark: 16384,
        buffer: BufferList { head: null, tail: null, length: 0 },
        length: 0,
        pipes: [Writable],
        pipesCount: 1,
        flowing: true,
        ended: false,
        endEmitted: false,
        reading: false,
        sync: true,
        needReadable: false,
        emittedReadable: false,
        readableListening: false,
        resumeScheduled: true,
        paused: false,
        emitClose: false,
        destroyed: false,
        defaultEncoding: 'utf8',
        awaitDrain: 0,
        readingMore: false,
        decoder: null,
        encoding: null },
     readable: false,
     _events:
      [Object: null prototype] {
        end: [Array],
        data: [Function: ondata],
        error: [Function: nop],
        close: [Function] },
     _eventsCount: 4,
     _maxListeners: 1000,
     _writableState:
      WritableState {
        objectMode: false,
        highWaterMark: 16384,
        finalCalled: false,
        needDrain: false,
        ending: false,
        ended: false,
        finished: false,
        destroyed: false,
        decodeStrings: false,
        defaultEncoding: 'utf8',
        length: 34,
        writing: false,
        corked: 1,
        sync: true,
        bufferProcessing: false,
        onwrite: [Function: bound onwrite],
        writecb: null,
        writelen: 0,
        bufferedRequest: [Object],
        lastBufferedRequest: [Object],
        pendingcb: 9,
        prefinished: false,
        errorEmitted: false,
        emitClose: false,
        bufferedRequestCount: 9,
        corkedRequestsFree: [Object] },
     writable: true,
     allowHalfOpen: false,
     _sockname: null,
     _pendingData: null,
     _pendingEncoding: '',
     server: null,
     _server: null,
     [Symbol(asyncId)]: 5,
     [Symbol(lastWriteQueueSize)]: 0,
     [Symbol(timeout)]: null,
     [Symbol(kBytesRead)]: 0,
     [Symbol(kBytesWritten)]: 0 } }

I have been trying the suggestions in this answer: Why is MQTT not connecting with NodeJS?我一直在尝试这个答案中的建议: Why is MQTT not connected with NodeJS?

Thanks for your help!谢谢你的帮助!

The IP address range 172.17.0.0/16 that is handed out to Docker containers by the Docker engine are part of the RFC1918 set intended for private use. Docker 引擎分发给 Docker 容器的 IP 地址范围 172.17.0.0/16 是RFC1918集的一部分,供私人使用。

In the case of Docker, they are used on the internal "bridge" network and only accessible from other docker containers or the machine hosting the Docker engine.对于 Docker,它们用于内部“桥接”网络,并且只能从其他 Docker 容器或托管 Docker 引擎的机器访问。

The 0.0.0.0:1883->1883/tcp, 0.0.0.0:9001->9001/tcp output for the info of your mosquitto container shows that these ports have been exposed and are mapped to the host machines IP address. mosquitto 容器信息的0.0.0.0:1883->1883/tcp, 0.0.0.0:9001->9001/tcp输出表明这些端口已暴露并映射到主机 IP 地址。 You should be able to connect if you change 172.17.0.2 for the IP address of the machine hosting the Docker engine.如果您将 172.17.0.2 更改为托管 Docker 引擎的机器的 IP 地址,您应该能够连接。

  • Port 9001 is the websocket listener端口 9001 是 websocket 监听器
  • Port 1883 is the native MQTT listener端口 1883 是本机 MQTT 侦听器

You are using the mqtt:// schema for your broker URL which indicates the native MQTT protocol, yet you are forcing the use of port 9001.您正在为您的代理 URL 使用mqtt://架构,该架构指示本机 MQTT 协议,但您正在强制使用端口 9001。

If you want to use WebSockets then you should change the schema to ws://如果您想使用 WebSockets,那么您应该将架构更改为ws://

If you want to use native MQTT then you need to change the port to 1883如果你想使用原生 MQTT 那么你需要将端口更改为 1883

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM