有没有办法在第一个订阅者收到 MQTT 消息后从其主题中删除该消息,以便其他订阅者无法读取它?
为了弄清楚这个奇怪的问题:
我必须处理四个 JBoss 实例(我必须承认我绝对不对该架构负责)。他们是彼此的镜子。因此,它们中的每一个都运行一项订阅特定主题的作业。来自该主题的消息保留在数据库中。我必须避免的是同一条消息被保留四次。所以我的想法是在这个主题上创建一个竞争条件。第一个读取该消息的作业将其删除,以便其他作业不会收到该消息。这可能吗?
我正在使用适用于 Android 的 Paho MQTT 库,我的应用程序正在交换实时编辑数据。我想在应用程序与代理断开连接时禁用编辑文本,并在重新建立连接时启用它。
第一部分很简单,MqttCallback
有一个connectionLost
方法,但不能重新连接。另外,在调试IMqttActionListener
连接方法时,我注意到重新连接时不会触发该事件。
所以我的问题是是否有任何方法可以检测重新连接?
我想将以 JSON 格式收到的 MQTT 消息(例如: {"event":"value","type":"r","value":0} )转换为 JSONObject,但我不知道如何做吧。
我已经尝试过这个:
public void messageArrived(String t, MqttMessage m) throws Exception {
String message = m.toString();
JSONObject jsonmsg = (JSONObject) JSONObject.stringToValue(message);
}
Run Code Online (Sandbox Code Playgroud)
但这并没有真正发挥作用。有办法做到吗?
我正在学习 MQTT,并看到一篇文章,其中指出 Facebook 使用 MQTT。但是,当 MQTT 基于主题时,我无法理解它是如何使用的。这是否意味着每次我创建新聊天时经纪人都会创建一个新主题?这不会导致话题过多吗?如果我理解正确的话,聊天的人将发布和订阅同一主题。
Qt 中的 mqtt 模块仅在商业许可下可用。不过,如果您的 PC 上有 Linux 发行版,您也可以在开源版本中执行此操作。
我想构建一个网页来发送和接收主题。我正在使用mosquitto和MQTT.js。
protocol websockets
listener 1884
Run Code Online (Sandbox Code Playgroud)
sudo mosquitto -c /etc/mosquitto/mosquitto.conf
并得到
1647529861: mosquitto version 2.0.14 starting
1647529861: Config loaded from /etc/mosquitto/mosquitto.conf.
1647529861: Opening websockets listen socket on port 1884.
1647529861: mosquitto version 2.0.14 running
Run Code Online (Sandbox Code Playgroud)
mqtt.html
(完整源代码):
<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
<script>
const client = mqtt.connect("ws://localhost:1884")
</script>
Run Code Online (Sandbox Code Playgroud)
问题:
00000000: 2002 0005
。当我检查蚊子的日志时:我得到了很多1647530429: Client mqttjs_b0e54ea4 closed its connection.
我正在运行:
LSB Version: n/a
Distributor ID: ManjaroLinux
Description: Manjaro Linux …
Run Code Online (Sandbox Code Playgroud) 我有一个在 Windows Server 2019 中运行的 Mosquitto 2.0.14 代理。我可以使用启用了 SSL 的 mqtts 协议通过端口 8883 连接到它。我还可以在没有 SSL 的情况下通过端口 1883 连接到它。
现在我想使用 Websockets 进行连接。所以我添加了一个监听器:
listener 9001
protocol websockets
allow_anonymous false
password_file C:\mosquitto\password.txt
http_dir C:\mosquitto\http_dir
set_tcp_nodelay true
Run Code Online (Sandbox Code Playgroud)
我也尝试过不使用http_dir
和set_tcp_nodelay
。我尝试过使用和不使用 SSL 证书。
我在 Windows 防火墙以及 AWS EC2 实例安全组中打开了端口 9001。
但是当我尝试使用以下命令连接到代理时ws://broker.mysite.com:9001
,ws://broker.mysite.com:9001/mqtt
什么也没有发生。没有错误,没有连接。即使我可以看到使用 WireShark 传入的请求,Mosquitto 也不显示任何日志。我真的被困在这里了。请帮帮我。
编辑:
我尝试使用 MQTTX、MQTT Explorer 和 MQTTBox Chrome 应用程序进行连接。
有没有人有一个合乎逻辑的解释为什么尽管我clear session flage = false
没有收到我订阅的更新的已发布消息,而我没有连接到经纪人?
随着aoretioned标志设置为false我运行了我的应用程序,并且我继续向某个主题发布一些值(从PC到代理而不是从Android设备到代理).然后我从电脑上拔掉了Android设备的usb,并继续发布了一些值.当我再次将USB插入电脑时,我希望看到我最近发布到该主题的值,但我没有收到任何值.
我要发布的主题正是我订阅的主题QoS = 1
.
我正在尝试在树莓派paho的MQTT Broker上发布消息。我已经使用Visual Studio 2015(在Windows 10上)构建了一个“应用程序”,并且正在使用波纹模拟器对其进行测试,但是我总是会收到此错误
AMQJS0011E未连接无效状态。
我还尝试导出文件,并在Linux系统上使用firefox将其打开为常规网页,但出现了同样的错误,因此我认为与Windows无关。
通过按钮触发的函数是playCanzone()
function playCanzone() {
console.log("play premuto");
mqttHost = '192.168.9.184';
topic = 'testTopic';
client = new Paho.MQTT.Client(mqttHost, 8080, "myclientid_" + parseInt(Math.random() * 100, 10));
onConnect();//publish('mEssaggio', 'testtopic/bar', 2);
}
// set callback handlers
client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;
// connect the client
client.connect({ onSuccess: onConnect });
// called when the client connects
function onConnect() {
// Once a connection has been made, make a subscription and send a message.
console.log("onConnect");
client.subscribe(topic);
message = new …
Run Code Online (Sandbox Code Playgroud) 在MQTT中,客户端可以订阅主题名称或主题通配符.可以使用相同的通配符将消息发布到主题或某些主题.但是如何将消息发布到彼此独立的某个主题?我需要修改MQTT协议吗?
例如:我的服务器处理来自10个客户端的连接(这些客户端彼此不相关)与ids:client1,client2,...,client 10和client1想要向任意数量的客户端发送消息(例如客户端3,客户端7,客户端8)