MQTT Java客户端Eclipse paho实现数据的发送和接收

类:

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.         options.setConnectionTimeout(10);  
  56.         // 设置会话心跳时间  
  57.         options.setKeepAliveInterval(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.         System.out.println("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.         server.message.setQos(1);  
  93.         server.message.setRetained(true);  
  94.         server.message.setPayload("hello,topic11".getBytes());  
  95.         server.publish(server.topic11 , server.message);  
  96.         System.out.println(server.message.isRetained() + "------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.             options.setConnectionTimeout(10);  
  41.             // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制  
  42.             options.setKeepAliveInterval(20);  
  43.             // 设置回调  
  44.             client.setCallback(new PushCallback());  
  45.             MqttTopic topic = client.getTopic(TOPIC);  
  46.             //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息  
  47.             options.setWill(topic, "close".getBytes(), 2true);  
  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.         System.out.println("连接断开,可以做重连");  
  34.     }  
  35.   
  36.     public void deliveryComplete(IMqttDeliveryToken token) {  
  37.         System.out.println("deliveryComplete---------" + token.isComplete());  
  38.     }  
  39.   
  40.     public void messageArrived(String topic, MqttMessage message) throws Exception {  
  41.         // subscribe后得到的消息会执行到这里面  
  42.         System.out.println("接收消息主题 : " + topic);  
  43.         System.out.println("接收消息Qos : " + message.getQos());  
  44.         System.out.println("接收消息内容 : " + 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包下载:https://download.csdn.net/download/weixin_39474452/10129150

demo下载:https://download.csdn.net/download/weixin_39474452/10288357

友情连接:

http://www.lvlinhuanbao.net/

http://www.kfshenwei.com/

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值