MQTT确认
如果我使用的是QOS类型1,则意味着代理将继续向订户发送消息,直到收到确认为止。如何设置或返回ack?请大家解释一下 这是我的源代码:MQTT确认,mqtt,Mqtt,如果我使用的是QOS类型1,则意味着代理将继续向订户发送消息,直到收到确认为止。如何设置或返回ack?请大家解释一下 这是我的源代码: import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.net.URISyntaxException; import java
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
import java.util.Vector;
import org.fusesource.hawtbuf.Buffer;
import org.fusesource.hawtbuf.UTF8Buffer;
import org.fusesource.mqtt.client.Callback;
import org.fusesource.mqtt.client.CallbackConnection;
import org.fusesource.mqtt.client.Listener;
import org.fusesource.mqtt.client.MQTT;
import org.fusesource.mqtt.client.QoS;
import org.fusesource.mqtt.client.Topic;
import com.adventnet.management.log.Log;
import com.adventnet.nms.util.NmsLogMgr;
public class DefaultMqttListener implements IMqttListener,Runnable{
long count = 0;
long start = System.currentTimeMillis();
private HashMap serverDetailsHash;
public DefaultMqttListener(HashMap serverProp)
{
this.serverDetailsHash = serverProp;
}
CallbackConnection myconnection;
@Override
public void init() {
MQTT mqtt = new MQTT();
String user = env("APOLLO_USER", (String)serverDetailsHash.get("userName")); //No I18N
String password = env("APOLLO_PASSWORD", (String)serverDetailsHash.get("password")); //No I18N
String host = env("APOLLO_HOST", (String)serverDetailsHash.get("hostName")); //No I18N
int port = Integer.parseInt(env("APOLLO_PORT", (String)serverDetailsHash.get("port")));
try {
mqtt.setHost(host, port);
mqtt.setUserName(user);
mqtt.setPassword(password);
final CallbackConnection connection = mqtt.callbackConnection();
myconnection = connection;
connection.listener(new org.fusesource.mqtt.client.Listener() {
public void onConnected() {
}
public void onDisconnected() {
}
public void onFailure(Throwable value) {
value.printStackTrace();
System.exit(-2);
}
public void onPublish(UTF8Buffer topic, Buffer msg, Runnable ack) {
long time = System.currentTimeMillis();
callback( topic, msg, ack,connection,time);
}
});
connection.connect(new Callback<Void>() {
@Override
public void onSuccess(Void value) {
NmsLogMgr.M2MERR.log("MQTT Listener connected in ::::", Log.SUMMARY);
ArrayList getTopics = (ArrayList)serverDetailsHash.get("Topics");
for(int i=0;i<getTopics.size();i++)
{
HashMap getTopic = (HashMap)getTopics.get(i);
String topicName = (String) getTopic.get("topicName");
String qosType = (String) getTopic.get("qosType");
Topic[] topic = {new Topic(topicName, getQosType(qosType))};
connection.subscribe(topic, new Callback<byte[]>() {
public void onSuccess(byte[] qoses) {
}
public void onFailure(Throwable value) {
value.printStackTrace();
System.exit(-2);
}
});
}
//Topic[] topics = {new Topic("adminTest", QoS.AT_LEAST_ONCE),new Topic("adminTest1", QoS.AT_LEAST_ONCE)};
}
@Override
public void onFailure(Throwable value) {
value.printStackTrace();
System.exit(-2);
}
});
// Wait forever..
synchronized (Listener.class) {
while(true){
Listener.class.wait();}
}
} catch (URISyntaxException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static String env(String key, String defaultValue) {
String rc = System.getenv(key);
if( rc== null ){
return defaultValue;}
return rc;
}
@Override
public void callback(UTF8Buffer topic, Buffer msg, Runnable ack, CallbackConnection connection, long time) {
// TODO Auto-generated method stub
try {
String Message = msg.utf8().toString();
MQTTMessage mqttMsg = new MQTTMessage();
mqttMsg.setMQTTMessage(Message);
mqttMsg.setTime(time);
mqttMsg.setTopic(topic);
mqttMsg.sethostName((String) serverDetailsHash.get("hostName"));
MQTTCacheManager.mgr.addToCache(mqttMsg);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void close() {
// TODO Auto-generated method stub
NmsLogMgr.M2MERR.log("myconnection closed", Log.SUMMARY);
myconnection.disconnect(new Callback<Void>() {
@Override
public void onSuccess(Void value) {
System.exit(0);
}
@Override
public void onFailure(Throwable value) {
value.printStackTrace();
System.exit(-2);
}
});
}
@Override
public void run() {
this.init();
// TODO Auto-generated method stub
}
public QoS getQosType(String name)
{
Properties qosContainer = new Properties();
qosContainer.put("0", QoS.AT_MOST_ONCE);
qosContainer.put("1", QoS.AT_LEAST_ONCE);
qosContainer.put("2", QoS.EXACTLY_ONCE);
QoS qosName = (QoS) qosContainer.get(name);
return qosName;
}
}
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.net.URISyntaxException;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.Properties;
导入java.util.Vector;
导入org.fusesource.hawtbuf.Buffer;
导入org.fusesource.hawtbuf.UTF8Buffer;
导入org.fusesource.mqtt.client.Callback;
导入org.fusesource.mqtt.client.CallbackConnection;
导入org.fusesource.mqtt.client.Listener;
导入org.fusesource.mqtt.client.mqtt;
导入org.fusesource.mqtt.client.QoS;
导入org.fusesource.mqtt.client.Topic;
导入com.inventnet.management.log.log;
导入com.aventnet.nms.util.NmsLogMgr;
公共类DefaultMqttListener实现IMQTTLListener,Runnable{
长计数=0;
长启动=System.currentTimeMillis();
私有HashMap服务器detailshash;
公共DefaultMqttListener(HashMap serverProp)
{
this.serverDetailsHash=serverProp;
}
回拨连接;
@凌驾
公共void init(){
MQTT MQTT=新的MQTT();
String user=env(“APOLLO_user”,(String)serverDetailsHash.get(“userName”);//无I18N
String password=env(“APOLLO_password”),(String)serverDetailsHash.get(“password”);//无I18N
String host=env(“APOLLO_host”,(String)serverDetailsHash.get(“hostName”);//无I18N
int-port=Integer.parseInt(env(“APOLLO_-port”),(String)serverDetailsHash.get(“port”);
试一试{
mqtt.setHost(主机、端口);
mqtt.setUserName(用户);
mqtt.setPassword(密码);
final CallbackConnection connection=mqtt.CallbackConnection();
myconnection=连接;
connection.listener(新org.fusesource.mqtt.client.listener(){
未连接的公共空间(){
}
公共空间已断开连接(){
}
失败时公共无效(可丢弃值){
value.printStackTrace();
系统出口(-2);
}
public void onPublish(UTF8Buffer主题、Buffer msg、Runnable ack){
长时间=System.currentTimeMillis();
回调(主题、消息、确认、连接、时间);
}
});
connection.connect(新回调(){
@凌驾
成功时公开作废(作废值){
nmslogmgrg.M2MERR.log(“连接到的MQTT侦听器:”,log.SUMMARY);
ArrayList getTopics=(ArrayList)ServerDetailsAsh.get(“主题”);
对于(inti=0;i您根本不在代码中发送确认,它应该由您正在使用的MQTT库处理
QOS ack的数据包位于发布者和代理之间,然后分别位于代理和任何订阅者之间。我没有使用Java库,但您需要订阅指定QOS级别1(至少有一次传递)或QOS级别2(恰好有一次传递)的主题。在这些情况下,底层库将ACK数据包发送给代理。但是如果我使用QOS1(至少\u一次)或QOS2(恰好\u一次),我会每10秒收到相同的消息。这会一直重复,直到我断开代理客户端连接。即使在重新连接后,也会每10秒从代理接收一次消息。好的,那么听起来您使用的代理或库已损坏,或者不支持QOS 0以外的任何内容。我的一个同事lleagues建议使用此方法。public void onPublish(UTF8Buffer主题,Buffer msg,Runnable ack){long time=System.currentTimeMillis();callback(主题,msg,ack,connection,time);ack.run();这是对的???我正在使用apollo broker和hive mq broker。apollo broker的一切都很好。当我试图仅使用HiveMq broker时发生了问题。paho JS clienonMessageDelivered
在消息成功传递到broker而不是实际的客户端正确时被调用?以便知道消息已传递我是否必须手动将确认消息从接收方用户应用发送到发送方用户应用?