Mosquitto Java 客户端实现

Java 实现 Mosquitto 的客户端主要使用 Eclipse Paho Java Client 提供的 SDK 来实现的。有兴趣的可以直接去 Eclipse Paha 官网下载对应的sdk 和使用说明。

  一、 准备工作

    本本讲解项目是Maven项目、如果还有对 Maven 不了解或者不熟悉的同学可以网上去学习下、本文不在这讲解 Maven 的使用。

    添加依赖    

<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.0.2</version>
</dependency>

二、本文实现 Mosquitto 消息发送主要分为三个类

  1> ClientMQTT 客户端类

  2> PushCallback 消息回调类

  3> ServerMQTT 服务端类

  四、 下面将直接上对应的 code

  1> 客户端  
  

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

  2> 消息回调


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

  3> 服务端


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

好了、到这 Java 实现 Mosquiito 客户端基本已经完成、本实列只是一个 demo 如果正式使用还得根据自己的业务做很多开发。谢谢

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值