我在Windows上运行mosquito,并将其配置为在端口1883上作为mqtt工作,在端口9001上作为websockets工作。我以为我可以从mqtt客户端发布消息,并在websockets客户端上接收消息,但似乎并非如此。
我可以成功地将消息从一个mqtt客户端传递到另一个mqtt客户端,也可以从一个websockets客户端传递到另一个websockets客户端。总而言之,这两个协议之间似乎有一条不可逾越的边界。
这是Mosquitto的限制吗?我忘记在conf文件中设置一些东西了吗?
注意:我用-v选项调用Mosquitto,所以它的日志很冗长。我注意到它实际上记录了websockets客户端的连接和消息,而不是mqtt客户端,尽管在mqtt客户端,关于连接和发布的一切看起来都很好(我使用MQTTNet客户端发布,在mqtt或websockets模式下,PAHO javascript客户端在websockets模式下,用于订阅/接收)。
禁用或启用防火墙没有任何区别。
下面是conf文件中的相关部分:
listener 1883
protocol mqtt
listener 9001
protocol websockets
password_file mypasswordfile.pwd
这是我启动它时报告的内容:
prompt> ./mosquitto -c myconfig.conf -v
2022-10-15 20:25:53: mosquitto version 2.0.15 starting
2022-10-15 20:25:53: Config loaded from myconfig.conf.
2022-10-15 20:25:53: Opening ipv6 listen socket on port 1883.
2022-10-15 20:25:53: Opening ipv4 listen socket on port 1883.
2022-10-15 20:25:53: Opening websockets listen socket on port 9001.
2022-10-15 20:25:53: mosquitto version 2.0.15 running
这是来自发布者的相关代码片段(但我也尝试过mosquito_pub实用程序):
var mqttFactory = new MqttFactory();
var mqttClient = mqttFactory.CreateMqttClient();
var mqttClientOptions = new MqttClientOptionsBuilder().
// WithTcpServer("localhost"). // This does NOT work
WithWebSocketServer("ws://localhost:9001/mqtt"). // This works
WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311).
WithClientId("publisher-client-id").
WithCredentials("myusername", "mypassword").
Build();
mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None).Wait();
var builder = new MqttApplicationMessageBuilder();
var applicationMessage = builder
.WithTopic("mytopic")
.WithPayload("mypayload")
.Build();
mqttClient.PublishAsync(applicationMessage, CancellationToken.None).Wait();
下面是来自订阅者的代码片段:
mqttConnect() {
this._mqtt = new Paho.MQTT.Client('localhost', 9001, '/mqtt', 'subscriber-client-id');
this._mqtt.onConnectionLost = this.onMqttConnectionLost.bind(this);
this._mqtt.onMessageArrived = this.onMqttMessageReceived.bind(this);
const options = {
mqttVersion: 4,
userName: 'myusername',
password: 'mypassword',
onSuccess: this.onMqttConnected.bind(this),
onFailure: this.onMqttFailedConnecting.bind(this)
};
this._mqtt.connect(options);
...
}
onMqttConnected() {
console.log('Connected to MQTT broker');
...
this._mqtt.subscribe('mytopic');
}
onMqttMessageReceived(message) {
console.log('Received MQTT message; topic = ' + message.destinationName + ', payload = ' + message.payloadString);
...
}
1条答案
按热度按时间nlejzf6q1#
正如在注解中讨论的那样,有2个示例正在运行(一个是Windows服务,一个是命令提示符)。
关闭后台服务解决了该问题。
(It不清楚为什么两个示例都能绑定到端口1883)