Python MQTT代理地址中是否需要tcp://?

Python MQTT代理地址中是否需要tcp://?,python,node.js,tcp,connect,mqtt,Python,Node.js,Tcp,Connect,Mqtt,我已经在网络和证券交易所搜索了一个关于我在连接MQTT时所经历的这种奇怪行为的解释。但我找不到任何类似的案例,我想了解问题的来源 因此,我在我的Raspberry Pi上设置了一个Mosquitto MQTT代理来监听端口1883。我还在路由器上设置了端口转发,这样我就可以从家庭网络外部访问Pi(尽管我也可以使用公共服务器(如broker.hivemq.com)重现下面的行为)。当我执行以下Node.js脚本时,我可以连接到代理并订阅和发布消息,它工作得非常好: const mqtt = req

我已经在网络和证券交易所搜索了一个关于我在连接MQTT时所经历的这种奇怪行为的解释。但我找不到任何类似的案例,我想了解问题的来源

因此,我在我的Raspberry Pi上设置了一个Mosquitto MQTT代理来监听端口1883。我还在路由器上设置了端口转发,这样我就可以从家庭网络外部访问Pi(尽管我也可以使用公共服务器(如
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部分,python客户端希望主机和端口分别作为其连接参数。它不是URI。因此没有TCP/

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


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

这两个库需要不同的东西

NodeJS库要求提供一个

  • 模式(“tcp://”)
  • 主机名/IP地址(“本地主机”)
  • 端口号(“:1883”)
  • 主机和端口可以很容易地从中解析

    其中,Python库明确要求两个独立的东西

  • 主机名
  • 港口
  • 这些被视为单独的变量


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

    感谢您对URI的解释。正如您所说,python代码实际上是有效的!一旦我添加了loop_forever(),它还显示了“connected”和“disconnected”消息,这就是让我一开始就感到困惑的原因。谢谢你的回答,现在我知道URI是怎么回事了:)