MQTT.js (mosquitto broker) - 我多次收到相同的消息
MQTT.js (mosqutio broker) - I get the same message several times
我有两个应用程序。我多次收到相同的消息。
例如:
- app1 -> user_1 写消息:'I need help' 主题:演示
- app2 -> 显示聊天列表
- app2 -> user_2 从列表中打开聊天并订阅 topic:demo 现在可以与 user_1
交谈
app2 user_2
- 我需要帮助
- 我需要帮助
- 我需要帮助
- 我需要帮助
- 我需要帮助
似乎创建了几次连接。
似乎订阅和发布到不同的主题也不起作用。应用程序 1:
let client = mqtt.connect('http://127.0.0.1:9001', {
clientId: "front-client",
username: "admin",
password: "admin",
});
client.on('connect', (topic) => {
client.subscribe(this.topic, (err) => {
if (!err) {}
});
});
this.mqttClient = client;
//handle incoming messages
client.on('message', (topic, message, packet) => {
this.showMessageFromMqtt(message);
});
}
sendMsgByMqtt(message: string) {
this.mqttClient.publish(this.topic + '/MSG', message, {retain: true});
}
App2:
configureMqttChannel() {
let client = mqtt.connect('http://127.0.0.1:9001', {
clientId: "front-client-angular",
username: "admin",
password: "admin"
});
// console.log("connected flag: " + client.connected);
client.on('connect', (topic) => {
// console.log("connected " + client.connected);
client.subscribe(this.topic + '/MSG', (err) => {
if (!err) {
// console.log('message sent by mqtt')
// client.publish(this.topic, '', {retain: true})
}
});
});
this.mqttClient = client;
//handle incoming messages
client.on('message', (topic, message, packet) => {
// console.log("message is " + message);
// console.log("topic is " + topic);
this.showMessageFromMqtt(message);
});
}
sendMsgByMqtt(message: string) {
this.mqttClient.publish(this.topic, message, {retain: true});
}
在浏览器控制台中:
连接正确
连接正确
连接正确
连接正确
连接正确
连接正确
连接正确
......
如果您要发布和订阅相同的主题,那么您的消息必须包含一个标识符,以便您可以过滤掉您已发布的消息,当它们总是返回给您时。
这方面的一个例子是(伪代码):
const MY_IDENTIFIER = generateSomeIdentifierUniqueToThisClient();
publish({
identifier:MY_IDENTIFIER,
data: // the actual content of your message
});
handleIncoming = data => {
// this was a message you sent
if(data.identifier === MY_IDENTIFIER) return;
// handle it
}
另一种解决方案是发布 demo/someUniqueClientIdentifier 并订阅演示/+
当您收到一条消息时,您可以使用主题名称来查看它来自哪个客户端并以这种方式将其过滤掉 - 与上述完全相同的变体。
我有两个应用程序。我多次收到相同的消息。
例如:
- app1 -> user_1 写消息:'I need help' 主题:演示
- app2 -> 显示聊天列表
- app2 -> user_2 从列表中打开聊天并订阅 topic:demo 现在可以与 user_1 交谈
app2 user_2
- 我需要帮助
- 我需要帮助
- 我需要帮助
- 我需要帮助
- 我需要帮助
似乎创建了几次连接。 似乎订阅和发布到不同的主题也不起作用。应用程序 1:
let client = mqtt.connect('http://127.0.0.1:9001', {
clientId: "front-client",
username: "admin",
password: "admin",
});
client.on('connect', (topic) => {
client.subscribe(this.topic, (err) => {
if (!err) {}
});
});
this.mqttClient = client;
//handle incoming messages
client.on('message', (topic, message, packet) => {
this.showMessageFromMqtt(message);
});
}
sendMsgByMqtt(message: string) {
this.mqttClient.publish(this.topic + '/MSG', message, {retain: true});
}
App2:
configureMqttChannel() {
let client = mqtt.connect('http://127.0.0.1:9001', {
clientId: "front-client-angular",
username: "admin",
password: "admin"
});
// console.log("connected flag: " + client.connected);
client.on('connect', (topic) => {
// console.log("connected " + client.connected);
client.subscribe(this.topic + '/MSG', (err) => {
if (!err) {
// console.log('message sent by mqtt')
// client.publish(this.topic, '', {retain: true})
}
});
});
this.mqttClient = client;
//handle incoming messages
client.on('message', (topic, message, packet) => {
// console.log("message is " + message);
// console.log("topic is " + topic);
this.showMessageFromMqtt(message);
});
}
sendMsgByMqtt(message: string) {
this.mqttClient.publish(this.topic, message, {retain: true});
}
在浏览器控制台中: 连接正确 连接正确 连接正确 连接正确 连接正确 连接正确 连接正确 ......
如果您要发布和订阅相同的主题,那么您的消息必须包含一个标识符,以便您可以过滤掉您已发布的消息,当它们总是返回给您时。
这方面的一个例子是(伪代码):
const MY_IDENTIFIER = generateSomeIdentifierUniqueToThisClient();
publish({
identifier:MY_IDENTIFIER,
data: // the actual content of your message
});
handleIncoming = data => {
// this was a message you sent
if(data.identifier === MY_IDENTIFIER) return;
// handle it
}
另一种解决方案是发布 demo/someUniqueClientIdentifier 并订阅演示/+
当您收到一条消息时,您可以使用主题名称来查看它来自哪个客户端并以这种方式将其过滤掉 - 与上述完全相同的变体。