ActiveMQ + MQTT (2) the client sending and receiving messages

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) {

    }

}

 

Published 40 original articles · won praise 57 · Views 250,000 +

Guess you like

Origin blog.csdn.net/With__Sunshine/article/details/105337935