測試環境爲centOS 7
#安裝libwebsockets
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libwebsockets-1.7.5-1.el7.x86_64.rpm
rpm -ivh libwebsockets-1.7.5-1.el7.x86_64.rpm
#安裝mosquitto
wget https://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo
mv home\:oojah\:mqtt.repo /etc/yum.repos.d/mosquitto.repo
yum install mosquitto mosquitto-clients
cd /etc/mosquitto/
cp mosquitto.conf.example conf.d/mosquitto.conf
vim conf.d/mosquitto.conf
# 修改內容爲: allow_anonymous false
#password_file /etc/mosquitto/pwfile
cp pwfile.example pwfile
#創建admin用戶
mosquitto_passwd -c /etc/mosquitto/pwfile admin
#使用【mosquitto -c /etc/mosquitto/mosquitto.conf -d 】可以後臺運行,第一次啓用不要加-d,這樣如果運行出錯可以立即看到反饋
mosquitto -c /etc/mosquitto/mosquitto.conf
#測試
mosquitto_pub -t test -u admin -P password -m "ok"
mosquitto_sub -t test -u admin -P password
# 如果sub收到ok說明測試成功
Publisher
package server;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class Publisher {
/**
* 代理服務器ip地址
*/
// public static final String MQTT_BROKER_HOST = "tcp://192.168.1.236:61613"; //apollo
public static final String MQTT_BROKER_HOST = "tcp://192.168.1.236:1883";
/**
* 訂閱標識
*/
public static final String MQTT_TOPIC = "testTopic";
/**
* 客戶端唯一標識
*/
public static final String MQTT_CLIENT_ID = "publisher01";
private static String userName = "admin";
private static String password = "password";
private static MqttTopic topic;
private static MqttClient client;
public static void main(String... args) {
// 推送消息
try {
client = new MqttClient(MQTT_BROKER_HOST, MQTT_CLIENT_ID, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
options.setUserName(userName);
options.setPassword(password.toCharArray());
options.setConnectionTimeout(10);
options.setKeepAliveInterval(20);
topic = client.getTopic(MQTT_TOPIC);
client.connect(options);
client.setCallback(new MqttCallback() {
@Override public void connectionLost(Throwable throwable) {
System.out.println("連接斷開,正在重連......");
try {
client.connect(options);
}catch (Exception exception){
System.out.println(exception.getMessage());
}
}
@Override public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
}
@Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
int i=0;
while (true) {
MqttMessage message = new MqttMessage();
//0 最多一次傳送 (只負責傳送,發送過後就不管數據的傳送情況)
//1 至少一次傳送 (確認數據交付)
//2 正好一次傳送 (保證數據交付成功)
message.setQos(2);
message.setRetained(true);
message.setPayload((""+i++).getBytes());
MqttDeliveryToken token = topic.publish(message);
token.waitForCompletion();
System.out.println(i);
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Subscriber
package client;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class Subscriber {
/**
* 代理服務器ip地址
*/
// public static final String MQTT_BROKER_HOST = "tcp://192.168.1.236:61613";
public static final String MQTT_BROKER_HOST = "tcp://192.168.1.236:1883";
/**
* 客戶端唯一標識
*/
public static final String MQTT_CLIENT_ID = "subscriber01";
/**
* 訂閱標識
*/
public static final String MQTT_TOPIC = "testTopic";
/**
*
*/
public static final String USERNAME = "admin";
/**
* 密碼
*/
public static final String PASSWORD = "password";
private volatile static MqttClient mqttClient;
private static MqttConnectOptions options;
public static void main(String... args) {
try {
// host爲主機名,clientid即連接MQTT的客戶端ID,一般以客戶端唯一標識符表示,
// MemoryPersistence設置clientid的保存形式,默認爲以內存保存
mqttClient = new MqttClient(MQTT_BROKER_HOST, MQTT_CLIENT_ID, new MemoryPersistence());
// 配置參數信息
options = new MqttConnectOptions();
// 設置是否清空session,這裏如果設置爲false表示服務器會保留客戶端的連接記錄,
// 這裏設置爲true表示每次連接到服務器都以新的身份連接
options.setCleanSession(false);
// 設置用戶名
options.setUserName(USERNAME);
// 設置密碼
options.setPassword(PASSWORD.toCharArray());
// 設置超時時間 單位爲秒
options.setConnectionTimeout(10);
// 設置會話心跳時間 單位爲秒 服務器會每隔1.5*20秒的時間向客戶端發送個消息判斷客戶端是否在線,但這個方法並沒有重連的機制
options.setKeepAliveInterval(20);
// 連接
mqttClient.connect(options);
// 訂閱
mqttClient.subscribe(MQTT_TOPIC);
// 設置回調
mqttClient.setCallback(new MqttCallback() {
@Override public void connectionLost(Throwable throwable) {
// 連接丟失後,一般在這裏面進行重連
System.out.println("連接斷開,正在重連......");
try {
mqttClient.connect(options);
}catch (Exception exception){
exception.printStackTrace();
}
}
@Override public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
System.out.println("toppic:"+s+"\t message:\t"+ mqttMessage.toString());
}
@Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}