我需要在 MQTT 代理地址中使用 tcp:// 吗?
Do I need tcp:// in the MQTT broker address?
我在网络和证券交易所中都进行了搜索,以了解我在连接到 MQTT 时遇到的这种奇怪行为的解释。但是我找不到任何类似的案例,我想了解问题的出处。
所以,我在我的 Raspberry Pi 上设置了一个 Mosquitto MQTT 代理来监听端口 1883。我还在我的路由器上设置了端口转发,所以我可以从我的家庭网络外部访问 Pi (虽然我也可以使用像 broker.hivemq.com
这样的 public 服务器重现下面的行为)。当我执行以下 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 包时,我得到了类似的行为41=],这对我来说实际上是更重要的情况,因为在这里我根本没有得到 运行。这是我的代码:
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)
使用这个没有协议的版本,我没有得到任何回应。程序 运行s 一秒钟然后终止。如果我使用协议
client.connect("tcp://my.address.net", 1883)
我收到错误
socket.gaierror: [Errno 8] nodename nor servname provided, or not known
我不知道我错过了什么。
有人可以解释一下在地址中声明 tcp://
协议与省略它的区别吗?
这是两个问题。
对于 python 部分,python 客户端希望主机和端口分别作为其连接参数。它不是 URI。因此没有 TCP//。
python 程序完全按照您的要求进行 - 连接,然后退出。如果您希望它执行任何其他操作,则必须在连接调用下方添加更多代码。该代码是什么取决于您想做什么,但是 loop_forever()
是一个好的开始。
另一个客户端需要一个 URI。我相信它使用 TCP/SSL 来区分普通连接和加密连接。
这两个图书馆需要不同的东西。
NodeJS 库要求 URI 其中包括
- 架构 ("tcp://")
- 一个hostname/IP地址("local host")
- 端口号(":1883")
从这里可以很容易地解析主机和端口。
Python 库明确要求 2 个独立的东西
- 主机名
- 端口
这些被视为单独的变量。
这取决于不同的作者选择不同的方法来收集信息。
我在网络和证券交易所中都进行了搜索,以了解我在连接到 MQTT 时遇到的这种奇怪行为的解释。但是我找不到任何类似的案例,我想了解问题的出处。
所以,我在我的 Raspberry Pi 上设置了一个 Mosquitto MQTT 代理来监听端口 1883。我还在我的路由器上设置了端口转发,所以我可以从我的家庭网络外部访问 Pi (虽然我也可以使用像 broker.hivemq.com
这样的 public 服务器重现下面的行为)。当我执行以下 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 包时,我得到了类似的行为41=],这对我来说实际上是更重要的情况,因为在这里我根本没有得到 运行。这是我的代码:
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)
使用这个没有协议的版本,我没有得到任何回应。程序 运行s 一秒钟然后终止。如果我使用协议
client.connect("tcp://my.address.net", 1883)
我收到错误
socket.gaierror: [Errno 8] nodename nor servname provided, or not known
我不知道我错过了什么。
有人可以解释一下在地址中声明 tcp://
协议与省略它的区别吗?
这是两个问题。
对于 python 部分,python 客户端希望主机和端口分别作为其连接参数。它不是 URI。因此没有 TCP//。
python 程序完全按照您的要求进行 - 连接,然后退出。如果您希望它执行任何其他操作,则必须在连接调用下方添加更多代码。该代码是什么取决于您想做什么,但是 loop_forever()
是一个好的开始。
另一个客户端需要一个 URI。我相信它使用 TCP/SSL 来区分普通连接和加密连接。
这两个图书馆需要不同的东西。
NodeJS 库要求 URI 其中包括
- 架构 ("tcp://")
- 一个hostname/IP地址("local host")
- 端口号(":1883")
从这里可以很容易地解析主机和端口。
Python 库明确要求 2 个独立的东西
- 主机名
- 端口
这些被视为单独的变量。
这取决于不同的作者选择不同的方法来收集信息。