pom.xml
<dependencies>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
TestDemo
/**
* 测试客户端发布消息和订阅接收消息
*
* 测试之前,应该已经可以完成以下步骤:
* (1)tar -zxvf activemq.xxx.tar.gz -C /usr/local
* (2)cd /usr/local/activemq
* sudo ./activemq start
* (3)浏览器中打开,tcp:127.0.0.1:8161。端口号的修改位置在 /usr/local/activemq/jetty.xml
*/
public class TestDemo {
MyMqttClient mqttClient = new MyMqttClient();
/**
* 测试客户端发布消息
*/
@org.junit.Test
public void testMqttPublish() throws InterruptedException {
int count = 1;
boolean close = false;
final long timeInterval = 2000;
while (!close) {
count++;
Thread.sleep(timeInterval);
mqttClient.publishMessage("world1234", "hello", 1);
System.out.println("qqq");
if (count >= 30) {
close = true;
}
}
}
/**
* 测试客户端接收订阅的消息:world
*
* @throws InterruptedException
*/
@org.junit.Test
public void testMqttReceiveMessage() throws InterruptedException {
final long timeInterval = 5000;
MyMqttReceiver.init(MyConstant.MQTT_CLIENTID);
MyMqttReceiver.receive("world");
while (true) {
Thread.sleep(timeInterval);
}
}
}
MyConstant
public class MyConstant {
/**
* 默认长度不超过65535,客户端id
*/
public static final String MQTT_CLIENTID = "world1234";
/**
* 服务器地址
*/
public static final String HOST = "tcp://127.0.0.1:1883";
}
MyMqttClient
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
/**
* Mqtt客户端,由初始化连接,关闭连接,重连操作
*/
public class MyMqttClient {
public static MqttClient mqttClient = null;
private static MemoryPersistence memoryPersistence = null;
private static MqttConnectOptions mqttConnectOptions = null;
static {
init(MyConstant.MQTT_CLIENTID);
}
public static void init(String clientId) {
if (mqttClient != null && mqttClient.isConnected()) {
MyMqttClient.closeConnect();
}
//初始化连接设置对象
mqttConnectOptions = new MqttConnectOptions();
//初始化MqttClient
//true可以安全地使用内存持久性作为客户端断开连接时清除的所有状态
mqttConnectOptions.setCleanSession(true);
//设置连接超时
mqttConnectOptions.setConnectionTimeout(30);
//设置持久化方式
memoryPersistence = new MemoryPersistence();
if (null != clientId) {
try {
mqttClient = new MqttClient(MyConstant.HOST, clientId, memoryPersistence);
} catch (MqttException e) {
e.printStackTrace();
}
}
System.out.println(mqttClient.isConnected());
//设置连接和回调
if (null != mqttClient) {
if (!mqttClient.isConnected()) {
//创建回调函数对象
MqttReceiverCallback mqttReceriveCallback = new MqttReceiverCallback();
//客户端添加回调函数
mqttClient.setCallback(mqttReceriveCallback);
//创建连接
try {
System.out.println("创建连接");
mqttClient.connect(mqttConnectOptions);
} catch (MqttException e) {
e.printStackTrace();
}
}
} else {
System.out.println("mqttClient为空");
}
System.out.println(mqttClient.isConnected());
}
// 关闭连接
public static void closeConnect() {
//关闭存储方式
if (null != memoryPersistence) {
try {
memoryPersistence.close();
} catch (MqttPersistenceException e) {
e.printStackTrace();
}
} else {
System.out.println("memoryPersistence is null");
}
//关闭连接
try {
if (null != mqttClient) {
if (mqttClient.isConnected()) {
mqttClient.disconnect();
mqttClient.close();
} else {
System.out.println("mqttClient is not connect");
}
} else {
System.out.println("mqttClient is null");
}
} catch (MqttException e) {
e.printStackTrace();
}
}
// 发布消息
public void publishMessage(String pubTopic, String message, int qos) {
if (null != mqttClient && mqttClient.isConnected()) {
System.out.println("发布消息 " + mqttClient.isConnected());
System.out.println("id:" + mqttClient.getClientId());
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setQos(qos);
mqttMessage.setPayload(message.getBytes());
MqttTopic topic = mqttClient.getTopic(pubTopic);
if (null != topic) {
try {
MqttDeliveryToken publish = topic.publish(mqttMessage);
if (!publish.isComplete()) {
System.out.println("消息发布成功");
}
} catch (MqttException e) {
e.printStackTrace();
}
}
} else {
reConnect();
}
}
// 重新连接
public void reConnect() {
if (null != mqttClient) {
if (!mqttClient.isConnected()) {
if (null != mqttConnectOptions) {
try {
mqttClient.connect(mqttConnectOptions);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
System.out.println("mqttConnectOptions is null");
}
} else {
System.out.println("mqttClient is null or connect");
}
} else {
init(MyConstant.MQTT_CLIENTID);
}
}
// 订阅主题
public void subTopic(String topic) {
if (null != mqttClient && mqttClient.isConnected()) {
try {
mqttClient.subscribe(topic, 1);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
System.out.println("mqttClient is error");
}
}
// 清空主题
public void cleanTopic(String topic) {
if (null != mqttClient && !mqttClient.isConnected()) {
try {
mqttClient.unsubscribe(topic);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
System.out.println("mqttClient is error");
}
}
}
MyMqttReceiver
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class MyMqttReceiver {
private static int QoS = 1;
private static MemoryPersistence memoryPersistence = null;
private static MqttClient mqttClient = null;
public static void init(String clientId) {
if (mqttClient != null && mqttClient.isConnected()) {
closeConnect();
}
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
memoryPersistence = new MemoryPersistence();
if (null != clientId) {
try {
mqttClient = new MqttClient(MyConstant.HOST, clientId, memoryPersistence);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
print("memoryPersistence clientId Host 有空值");
}
mqttConnectOptions.setCleanSession(true);
mqttConnectOptions.setConnectionTimeout(30);
mqttConnectOptions.setKeepAliveInterval(45);
if (null != mqttClient && !mqttClient.isConnected()) {
mqttClient.setCallback(new MqttReceiverCallback());
try {
mqttClient.connect();
} catch (MqttException e) {
e.printStackTrace();
}
} else {
print("mqttClient is error");
}
}
public static void receive(String topic) {
int[] Qos = {QoS};
String[] topics = {topic};
if (null != mqttClient && mqttClient.isConnected()) {
try {
mqttClient.subscribe(topics, Qos);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
init(MyConstant.MQTT_CLIENTID);
receive(topic);
}
}
// 关闭连接
public static void closeConnect() {
//关闭存储方式
if (null != memoryPersistence) {
try {
memoryPersistence.close();
} catch (MqttPersistenceException e) {
e.printStackTrace();
}
} else {
print("memoryPersistence is null");
}
//关闭连接
if (null != mqttClient) {
if (mqttClient.isConnected()) {
try {
mqttClient.disconnect();
mqttClient.close();
} catch (MqttException e) {
e.printStackTrace();
}
} else {
print("mqttClient is not connect");
}
} else {
print("mqttClient is null");
}
}
private static void print(String info){
System.out.println(info);
}
}
MqttReceiverCallback
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
public class MqttReceiverCallback implements MqttCallback{
@Override
public void connectionLost(Throwable cause) {
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("Client 接收消息主题 : " + topic);
System.out.println("Client 接收消息Qos : " + message.getQos());
System.out.println("Client 接收消息内容 : " + new String(message.getPayload()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
}