Java 实现 Mosquitto 的客户端主要使用 Eclipse Paho Java Client 提供的 SDK 来实现的。有兴趣的可以直接去 Eclipse Paha 官网下载对应的sdk 和使用说明。
一、 准备工作
本本讲解项目是Maven项目、如果还有对 Maven 不了解或者不熟悉的同学可以网上去学习下、本文不在这讲解 Maven 的使用。
添加依赖
<dependency>
<groupId>org.eclipse.pahogroupId>
<artifactId>org.eclipse.paho.client.mqttv3artifactId>
<version>1.0.2version>
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 如果正式使用还得根据自己的业务做很多开发。谢谢