服务器: 

搭建本地mqtt服务器:基于Mosquitto搭建MQTT服务器_月亮鞋业的博客-CSDN博客

也可以使用公共服务器:
        官网地址:http://www.ranye-iot.net         MQTT服务器地址:test.ranye-iot.net
        TCP 端口:1883
        TCP/TLS 端口:8883

Java引用:

先引入依赖

<!--MQTT依赖-->
<dependency>
      <groupId>org.eclipse.paho</groupId>
      <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
      <version>1.2.0</version>
</dependency>

发布消息

调用这个sendMsg()方法就能向test.ranye-iot.net地址发送主题为testtopic的消息了;

public static void sendMsg() throws MqttException {
        String clientId = "JavaSample1"; //客户ID,自己起名,不可重复
        String content  = "主题内容xxxxxxxxxxx"; //发送的信息
        String topic   = "testtopic";    //主题
        int qos         = 2;    //服务质量等级
        String broker  = "tcp://test.ranye-iot.net:1883";  //服务器地址

        MqttClient client = new MqttClient(broker, clientId, new MemoryPersistence());//创建客户累
        MqttConnectOptions connect = new MqttConnectOptions();//创建连接类
        connect.setConnectionTimeout(60);//超时时间
        connect.setKeepAliveInterval(10);//心跳时间
        connect.setCleanSession(true);//清除会话
        client.connect(connect);//客户类通过连接类连接
        MqttMessage message = new MqttMessage(content.getBytes());//发布消息类
        message.setQos(qos);//发布消息类设置服务质量等级
        client.publish(topic, message);//发布消息
//        client.disconnect();//客户类关闭连接
//        System.exit(0);//退出
    }

接收消息

1、先写回调函数类,实现MqttCallback接口;

        重写三个方法,第一个connectionLost是链接丢失时触发,第二个messageArrived是接收到消息触发,第三个deliveryComplete是消息发布完成触发;

public class MyCallBack implements MqttCallback {
    //连接丢失时触发(不包括主动disconnect)
    @Override
    public void connectionLost(Throwable throwable) {
        System.out.println("连接失败,请重新连接");
    }
    //接收到内容触发
    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        System.out.println("接收到的主题为:" + s);
        System.out.println("内容为:" + new String(mqttMessage.getPayload(), StandardCharsets.UTF_8));
    }
    //发布完消息触发
    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        System.out.println("发布消息成功");
    }
}

2、建立连接开启监听,当调用发送消息方法时就能接收到了;

public static void getMsg() throws MqttException {
        String clientId = "JavaSample2"; //客户ID,不可重复
        String topic   = "testtopic";    //主题
        int qos         = 2;    //服务质量等级
        String broker  = "tcp://test.ranye-iot.net:1883";  //服务器地址

        MqttClient client = new MqttClient(broker, clientId, new MemoryPersistence());//创建客户累
        client.setCallback(new MyCallBack());
        MqttConnectOptions connect = new MqttConnectOptions();//创建连接类
        connect.setConnectionTimeout(60);//超时时间
        connect.setKeepAliveInterval(10);//心跳时间
        connect.setCleanSession(true);//清除会话
        client.connect(connect);//客户类通过连接类连接
        client.subscribe(topic, qos);// qos:服务质量等级
    }

测试

        先调用接收消息getMsg(),然后调用发布消息sendMsg();

public static void main(String[] args) {
        try {
            getMsg();
            sendMsg();
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

        可以看到控制台打印回调函数里的内容;

java mqtt重连机制 java mqtt broker_java

 

MQTT.fx测试  

       也可以用MQTT.fx软件来测试,如下:

java mqtt重连机制 java mqtt broker_java_02

 

java mqtt重连机制 java mqtt broker_java_03

         点击Publish后,在刚才的控制台就能看到了

java mqtt重连机制 java mqtt broker_java_04

         接收的时候

java mqtt重连机制 java mqtt broker_服务器_05