类:

ServerMQTT

ClientMQTT

PushCallback  

注: 例子中需要修改的地方:

        1、localhost:  修改为上节安装服务的ip地址;

         2、1883:修改为上节安装服务的端口,在配置文件中可修改,默认是(1883);

 

 

ServerMQTT类:

 

[java] view plain copy
1. /**
2.  * Created by Administrator on 18-2-10.
3.  */
4.   
5. import org.eclipse.paho.client.mqttv3.MqttClient;  
6. import org.eclipse.paho.client.mqttv3.MqttConnectOptions;  
7. import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;  
8. import org.eclipse.paho.client.mqttv3.MqttException;  
9. import org.eclipse.paho.client.mqttv3.MqttMessage;  
10. import org.eclipse.paho.client.mqttv3.MqttPersistenceException;  
11. import org.eclipse.paho.client.mqttv3.MqttTopic;  
12. import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;  
13. /**
14.  *
15.  * Title:Server
16.  * Description: 服务器向多个客户端推送主题,即不同客户端可向服务器订阅相同主题
17.  * @author admin
18.  * 2017年2月10日下午17:41:10
19.  */
20. public class ServerMQTT {  
21.   
22. //tcp://MQTT安装的服务器地址:MQTT定义的端口号
23.     public static final String HOST = "tcp://localhost:1883";  
24. //定义一个主题
25.     public static final String TOPIC = "topic11";  
26. //定义MQTT的ID,可以在MQTT服务配置中指定
27.     private static final String clientid = "server11";  
28.   
29.     private MqttClient client;  
30.     private MqttTopic topic11;  
31.     private String userName = "mosquitto";  
32.     private String passWord = "";  
33.   
34.     private MqttMessage message;  
35.   
36. /**
37.      * 构造函数
38.      * @throws MqttException
39.      */
40.     public ServerMQTT() throws MqttException {  
41. // MemoryPersistence设置clientid的保存形式,默认为以内存保存
42.         client = new MqttClient(HOST, clientid, new MemoryPersistence());  
43.         connect();  
44.     }  
45.   
46. /**
47.      *  用来连接服务器
48.      */
49.     private void connect() {  
50.         MqttConnectOptions options = new MqttConnectOptions();  
51.         options.setCleanSession(false);  
52.         options.setUserName(userName);  
53.         options.setPassword(passWord.toCharArray());  
54. // 设置超时时间
55. 10);  
56. // 设置会话心跳时间
57. 20);  
58.         try {  
59.             client.setCallback(new PushCallback());  
60.             client.connect(options);  
61.   
62.             topic11 = client.getTopic(TOPIC);  
63.         } catch (Exception e) {  
64.             e.printStackTrace();  
65.         }  
66.     }  
67.   
68. /**
69.      *
70.      * @param topic
71.      * @param message
72.      * @throws MqttPersistenceException
73.      * @throws MqttException
74.      */
75.     public void publish(MqttTopic topic , MqttMessage message) throws MqttPersistenceException,  
76.             MqttException {  
77.         MqttDeliveryToken token = topic.publish(message);  
78.         token.waitForCompletion();  
79. "message is published completely! "
80.                 + token.isComplete());  
81.     }  
82.   
83. /**
84.      *  启动入口
85.      * @param args
86.      * @throws MqttException
87.      */
88.     public static void main(String[] args) throws MqttException {  
89.         ServerMQTT server = new ServerMQTT();  
90.   
91.         server.message = new MqttMessage();  
92. 1);  
93.         server.message.setRetained(true);  
94. "hello,topic11".getBytes());  
95.         server.publish(server.topic11 , server.message);  
96. "------ratained状态");  
97.     }  
98. }

 

 

 

 

ClientMQTT类:

 

[java] view plain copy

1. /**
2.  *
3.  * Description:
4.  * @author admin
5.  * 2017年2月10日下午17:50:15
6.  */
7.   
8. import java.util.concurrent.ScheduledExecutorService;  
9. import org.eclipse.paho.client.mqttv3.MqttClient;  
10. import org.eclipse.paho.client.mqttv3.MqttConnectOptions;  
11. import org.eclipse.paho.client.mqttv3.MqttException;  
12. import org.eclipse.paho.client.mqttv3.MqttTopic;  
13. import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;  
14.   
15. public class ClientMQTT {  
16.   
17.     public static final String HOST = "tcp://localhost:1883";  
18.     public static final String TOPIC = "topic11";  
19.     private static final String clientid = "client11";  
20.     private MqttClient client;  
21.     private MqttConnectOptions options;  
22.     private String userName = "admin";  
23.     private String passWord = "password";  
24.   
25.     private ScheduledExecutorService scheduler;  
26.   
27.     private void start() {  
28.         try {  
29. // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
30.             client = new MqttClient(HOST, clientid, new MemoryPersistence());  
31. // MQTT的连接设置
32.             options = new MqttConnectOptions();  
33. // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
34.             options.setCleanSession(true);  
35. // 设置连接的用户名
36.             options.setUserName(userName);  
37. // 设置连接的密码
38.             options.setPassword(passWord.toCharArray());  
39. // 设置超时时间 单位为秒
40. 10);  
41. // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
42. 20);  
43. // 设置回调
44.             client.setCallback(new PushCallback());  
45.             MqttTopic topic = client.getTopic(TOPIC);  
46. //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
47. "close".getBytes(), 2, true);  
48.   
49.             client.connect(options);  
50. //订阅消息
51.             int[] Qos  = {1};  
52.             String[] topic1 = {TOPIC};  
53.             client.subscribe(topic1, Qos);  
54.   
55.         } catch (Exception e) {  
56.             e.printStackTrace();  
57.         }  
58.     }  
59.   
60.     public static void main(String[] args) throws MqttException {  
61.         ClientMQTT client = new ClientMQTT();  
62.         client.start();  
63.     }  
64. }

PushCallback类:

 

 

[java] view plain copy

1. /**
2.  *
3.  * Description:
4.  * @author admin
5.  * 2017年2月10日下午18:04:07
6.  */
7.   
8. import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;  
9. import org.eclipse.paho.client.mqttv3.MqttCallback;  
10. import org.eclipse.paho.client.mqttv3.MqttMessage;  
11.   
12. /**
13.  * 发布消息的回调类
14.  *
15.  * 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。
16.  * 每个客户机标识都需要一个回调实例。在此示例中,构造函数传递客户机标识以另存为实例数据。
17.  * 在回调中,将它用来标识已经启动了该回调的哪个实例。
18.  * 必须在回调类中实现三个方法:
19.  *
20.  *  public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。
21.  *
22.  *  public void connectionLost(Throwable cause)在断开连接时调用。
23.  *
24.  *  public void deliveryComplete(MqttDeliveryToken token))
25.  *  接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
26.  *  由 MqttClient.connect 激活此回调。
27.  *
28.  */
29. public class PushCallback implements MqttCallback {  
30.   
31.     public void connectionLost(Throwable cause) {  
32. // 连接丢失后,一般在这里面进行重连
33. "连接断开,可以做重连");  
34.     }  
35.   
36.     public void deliveryComplete(IMqttDeliveryToken token) {  
37. "deliveryComplete---------"
38.     }  
39.   
40.     public void messageArrived(String topic, MqttMessage message) throws Exception {  
41. // subscribe后得到的消息会执行到这里面
42. "接收消息主题 : "
43. "接收消息Qos : "
44. "接收消息内容 : " + new String(message.getPayload()));  
45.     }  
46. }

server类启动的结果:

 

 

[html] view plain copy

1. deliveryComplete---------true  
2. message is published completely! true  
3. true------ratained状态

client类启动的结果:

 

 

[html] view plain copy

    1. 接收消息主题 : topic11  
    2. 接收消息Qos : 1  
    3. 接收消息内容 : hello,topic11

     

    jar包下载:

    demo下载: