我在MQTT代理地址中需要tcp://吗?

时间:2016-05-11 04:01:48

标签: python node.js tcp connect mqtt

我搜索了web和stockexchange,以解释我在连接到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')

作为主机地址我没有获得连接,但也没有错误消息。该程序暂停,直到我终止它。我不明白。默认情况下,不是使用TCP的MQTT吗?

这与我的客户或我的经纪人有关吗?它可能与我的系统(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://协议与将其删除的区别吗?

2 个答案:

答案 0 :(得分:1)

这是两个问题。

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

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

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

答案 1 :(得分:0)

这2个图书馆需要不同的东西。

NodeJS库要求URI包括

  1. 架构(" tcp://")
  2. 主机名/ IP地址("本地主机")
  3. 一个端口号(":1883")
  4. 可以从中轻松解析主机和端口。

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

    1. 主机名
    2. 端口
    3. 这些被视为单独的变量。

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