MQTT-Client提供一個ASL 2.0證書下的MQTT接口。在網絡連接失敗時,它能夠自動地重新連接服務器並嘗試恢復會話。應用程序能夠使用阻塞API、基於Future的API和回 調API,共三種接口形式。
1、阻塞api實現:
2、基於future Api實現
3、基於回調API 實現:
可參考 http://www.jianshu.com/p/31921e18ec46 callBack實現
http://blog.csdn.net/u011679955/article/details/71156450 參數詳解
例子 基於 阻塞API的消息發佈實現
package com.etrip.mqtt;
import java.net.URISyntaxException;
import org.fusesource.mqtt.client.BlockingConnection;
import org.fusesource.mqtt.client.MQTT;
import org.fusesource.mqtt.client.QoS;
import org.fusesource.mqtt.client.Topic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*
*
* MQTT moquette 的Server 段用於發佈主題,併發布主題信息
*
* 採用阻塞式 發佈主題
*
* @author longgangbai
*/
public class MQTTServer {
private static final Logger LOG = LoggerFactory.getLogger(MQTTServer.class);
private final static String CONNECTION_STRING = "tcp://192.168.208.46:1883";
private final static boolean CLEAN_START = true;
private final static short KEEP_ALIVE = 30;// 低耗網絡,但是又需要及時獲取數據,心跳30s
public static Topic[] topics = {
new Topic("china/beijing", QoS.EXACTLY_ONCE),
new Topic("china/tianjin", QoS.AT_LEAST_ONCE),
new Topic("china/henan", QoS.AT_MOST_ONCE)};
public final static long RECONNECTION_ATTEMPT_MAX=6;
public final static long RECONNECTION_DELAY=2000;
public final static int SEND_BUFFER_SIZE=2*1024*1024;//發送最大緩衝爲2M
public static void main(String[] args) {
MQTT mqtt = new MQTT();
try {
//設置服務端的ip
mqtt.setHost(CONNECTION_STRING);
//連接前清空會話信息
mqtt.setCleanSession(CLEAN_START);
//設置重新連接的次數
mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);
//設置重連的間隔時間
mqtt.setReconnectDelay(RECONNECTION_DELAY);
//設置心跳時間
mqtt.setKeepAlive(KEEP_ALIVE);
//設置緩衝的大小
mqtt.setSendBufferSize(SEND_BUFFER_SIZE);
//創建連接
BlockingConnection connection = mqtt.blockingConnection();
//開始連接
connection.connect();
try {
int count=0;
while(true){
count++;
//訂閱的主題
String topic="china/beijing";
//主題的內容
String message="hello "+count+"chinese people !";
connection.publish(topic, message.getBytes(), QoS.AT_LEAST_ONCE, false);
LOG.info("MQTTServer Message Topic="+topic+" Content :"+message);
Thread.sleep(2000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
基於阻塞api的主題訂閱實現
關於mqtt的broker的啓動和mqtt的服務端發佈主題信息之後,我們客戶端需要訂閱相關的信息並接收相關的主題信息。
package com.etrip.mqtt;
import java.net.URISyntaxException;
import org.fusesource.mqtt.client.BlockingConnection;
import org.fusesource.mqtt.client.MQTT;
import org.fusesource.mqtt.client.Message;
import org.fusesource.mqtt.client.QoS;
import org.fusesource.mqtt.client.Topic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* MQTT moquette 的Client 段用於訂閱主題,並接收主題信息
*
* 採用阻塞式 訂閱主題
*
* @author longgangbai
*/
public class MQTTClient {
private static final Logger LOG = LoggerFactory.getLogger(MQTTClient.class);
private final static String CONNECTION_STRING = "tcp://192.168.208.46:1883";
private final static boolean CLEAN_START = true;
private final static short KEEP_ALIVE = 30;// 低耗網絡,但是又需要及時獲取數據,心跳30s
private final static String CLIENT_ID = "publishService";
public static Topic[] topics = {
new Topic("china/beijing", QoS.EXACTLY_ONCE),
new Topic("china/tianjin", QoS.AT_LEAST_ONCE),
new Topic("china/henan", QoS.AT_MOST_ONCE)};
public final static long RECONNECTION_ATTEMPT_MAX=6;
public final static long RECONNECTION_DELAY=2000;
public final static int SEND_BUFFER_SIZE=2*1024*1024;//發送最大緩衝爲2M
public static void main(String[] args) {
//創建MQTT對象
MQTT mqtt = new MQTT();
BlockingConnection connection=null;
try {
//設置mqtt broker的ip和端口
mqtt.setHost(CONNECTION_STRING);
//連接前清空會話信息
mqtt.setCleanSession(CLEAN_START);
//設置重新連接的次數
mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);
//設置重連的間隔時間
mqtt.setReconnectDelay(RECONNECTION_DELAY);
//設置心跳時間
mqtt.setKeepAlive(KEEP_ALIVE);
//設置緩衝的大小
mqtt.setSendBufferSize(SEND_BUFFER_SIZE);
//獲取mqtt的連接對象BlockingConnection
connection = mqtt.blockingConnection();
//MQTT連接的創建
connection.connect();
//創建相關的MQTT 的主題列表
Topic[] topics = {new Topic("china/beijing", QoS.AT_LEAST_ONCE)};
//訂閱相關的主題信息
byte[] qoses = connection.subscribe(topics);
//
while(true){
//接收訂閱的消息內容
Message message = connection.receive();
//獲取訂閱的消息內容
byte[] payload = message.getPayload();
// process the message then:
LOG.info("MQTTClient Message Topic="+message.getTopic()+" Content :"+new String(payload));
//簽收消息的回執
message.ack();
Thread.sleep(2000);
}
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
connection.disconnect();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}