【问题标题】:Do I need tcp:// in the MQTT broker address?MQTT 代理地址中是否需要 tcp://?
【发布时间】:2016-09-06 06:42:42
【问题描述】:

我已经在网络和证券交易所搜索了有关我在连接到 MQTT 时遇到的这种奇怪行为的解释。但是我找不到任何类似的案例,我想了解问题出在哪里。

所以,我在我的树莓派上设置了一个 Mosquitto MQTT 代理来监听端口 1883。我还在我的路由器上设置了端口转发,所以我可以从我的家庭网络外部访问树莓派(虽然我可以重现以下行为也适用于broker.hivemq.com 等公共服务器)。当我执行以下 Node.js 脚本时,我可以连接到代理并订阅和发布消息,它运行良好:

const mqtt = require('mqtt') 
const client = mqtt.connect('tcp://my.address.net:1883')
client.on('connect', () => {    
  console.log('Connected!')
  client.subscribe("chat")
})

var readline = require('readline');
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
});

rl.on('line', function(line){
    client.publish('chat',line)
})

client.on('message', (topic, message) => {  
    console.log('>> '+message)
})

但是,当我省略 tcp:// 协议并拥有

const client = mqtt.connect('my.address.net:1883')

作为主机地址,我没有连接,但也没有错误消息。该程序只是挂起,直到我终止它。我不明白。 MQTT 不是默认使用 TCP 吗?

这与我的客户或经纪人有关吗?它可能与我的系统(OSX)有关吗?

也许这与它无关,但是当我在 Python 中使用 Paho MQTT 包时,我得到了类似的行为,而这实际上是更重要的情况对我来说,因为在这里我根本无法运行它。这是我的代码:

import paho.mqtt.client as paho

def on_connect(client, userdata, flags, rc):
    print("connected")
    client.disconnect()

def on_disconnect(client, userdata, rc):
    print("disconnected")

client = paho.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect("my.address.net", 1883)

使用这个没有协议的版本,我没有得到任何回应。程序运行一秒钟然后终止。如果我使用协议

client.connect("tcp://my.address.net", 1883)

我得到了错误

socket.gaierror: [Errno 8] nodename nor servname provided, or not known

我不知道我错过了什么。

有人可以解释在地址中声明tcp:// 协议与将其省略的区别吗?

【问题讨论】:

    标签: python node.js tcp connect mqtt


    【解决方案1】:

    这是两个问题。

    对于 python 部分,python 客户端期望主机和端口分别作为其连接参数。它不是一个 URI。因此没有 TCP//。

    python 程序完全按照您的要求执行 - 连接,然后退出。如果您希望它执行任何其他操作,则必须在 connect 调用下添加更多代码。该代码是什么取决于您想要做什么,但loop_forever() 是一个好的开始。

    另一个客户端需要一个 URI。我相信它使用 TCP/SSL 来区分普通连接和加密连接。

    【讨论】:

    • 感谢您对 URI 的解释。就像你说的,python 代码确实有效!一旦我添加了 loop_forever(),它还会显示“已连接”和“已断开”消息,这首先让我感到困惑。
    【解决方案2】:

    这两个库需要不同的东西。

    NodeJS 库要求URI,其中包括

    1. 架构(“tcp://”)
    2. 主机名/IP 地址(“本地主机”)
    3. 端口号 (":1883")

    主机和端口可以很容易地从中解析出来。

    Python 库明确要求 2 个独立的东西

    1. 主机名
    2. 港口

    这些被视为单独的变量。

    这取决于不同的作者选择不同的方法来收集信息。

    【讨论】:

    • 谢谢你的回答,现在我知道 URI 是什么了 :)
    猜你喜欢
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多