MQTT协议之使用Future模式订阅及发布(使用fusesource mqtt-client实现)

来源:互联网 发布:剑三清冷萝莉捏脸数据 编辑:程序博客网 时间:2024/05/16 19:42

fusesource版本:mqtt-client-1.10.jar

下载地址:https://github.com/fusesource/mqtt-client

fusesource提供三种方式实现发布消息的方式:

1.采用阻塞式的连接的(BlockingConnection)

2.采用回调式的连接 (CallbackConnection)

3.采用Future样式的连接(FutureConnection)

其中,回调API是最复杂的也是性能最好的,

另外两种均是对回调API的封装。 我们下面就简单介绍一下回调API的使用方法。

1.客户端实现:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.ctfo.mqtt.client.demo.fusesource;  
  2.   
  3. import java.net.URISyntaxException;  
  4.   
  5. import org.fusesource.mqtt.client.Future;  
  6. import org.fusesource.mqtt.client.FutureConnection;  
  7. import org.fusesource.mqtt.client.MQTT;  
  8. import org.fusesource.mqtt.client.Message;  
  9. import org.fusesource.mqtt.client.QoS;  
  10. import org.fusesource.mqtt.client.Topic;  
  11.   
  12. /** 
  13.  * 采用Future模式 订阅主题   
  14.  */  
  15. public class MQTTFutureClient {  
  16.   
  17.     private final static String CONNECTION_STRING = "tcp://192.168.13.240:1883";  
  18.     private final static boolean CLEAN_START = true;  
  19.     private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s  
  20.     private final static String CLIENT_ID = "client";  
  21.     public static Topic[] topics = {   
  22.         new Topic("mqtt/aaa", QoS.EXACTLY_ONCE),   
  23.         new Topic("mqtt/bbb", QoS.AT_LEAST_ONCE),  
  24.         new Topic("mqtt/ccc", QoS.AT_MOST_ONCE) };  
  25.       
  26.     public final static long RECONNECTION_ATTEMPT_MAX = 6;  
  27.     public final static long RECONNECTION_DELAY = 2000;  
  28.   
  29.     public final static int SEND_BUFFER_SIZE = 2 * 1024 * 1024;// 发送最大缓冲为2M  
  30.   
  31.     public static void main(String[] args) {  
  32.         // 创建MQTT对象  
  33.         MQTT mqtt = new MQTT();  
  34.         try {  
  35.             // 设置mqtt broker的ip和端口  
  36.             mqtt.setHost(CONNECTION_STRING);  
  37.             // 连接前清空会话信息  
  38.             mqtt.setCleanSession(CLEAN_START);  
  39.             // 设置重新连接的次数  
  40.             mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);  
  41.             // 设置重连的间隔时间  
  42.             mqtt.setReconnectDelay(RECONNECTION_DELAY);  
  43.             // 设置心跳时间  
  44.             mqtt.setKeepAlive(KEEP_ALIVE);  
  45.             // 设置缓冲的大小  
  46.             mqtt.setSendBufferSize(SEND_BUFFER_SIZE);  
  47.             //设置客户端id  
  48.             mqtt.setClientId(CLIENT_ID);  
  49.   
  50.             // 获取mqtt的连接对象BlockingConnection  
  51.             final FutureConnection connection = mqtt.futureConnection();  
  52.             connection.connect();  
  53.             connection.subscribe(topics);  
  54.             while (true) {  
  55.                 Future<Message> futrueMessage = connection.receive();  
  56.                 Message message = futrueMessage.await();    
  57.                 System.out.println("MQTTFutureClient.Receive Message " + "Topic Title :" + message.getTopic() + " context :"  
  58.                         + String.valueOf(message.getPayloadBuffer()));  
  59.             }  
  60.         } catch (URISyntaxException e) {  
  61.             // TODO Auto-generated catch block  
  62.             e.printStackTrace();  
  63.         } catch (Exception e) {  
  64.             // TODO Auto-generated catch block  
  65.             e.printStackTrace();  
  66.         } finally {  
  67.         }  
  68.     }  
  69. }  
2.服务端实现:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.ctfo.mqtt.client.demo.fusesource;  
  2.   
  3. import java.net.URISyntaxException;  
  4.   
  5. import org.fusesource.hawtbuf.Buffer;  
  6. import org.fusesource.hawtbuf.UTF8Buffer;  
  7. import org.fusesource.hawtdispatch.Dispatch;  
  8. import org.fusesource.mqtt.client.Callback;  
  9. import org.fusesource.mqtt.client.CallbackConnection;  
  10. import org.fusesource.mqtt.client.FutureConnection;  
  11. import org.fusesource.mqtt.client.Listener;  
  12. import org.fusesource.mqtt.client.MQTT;  
  13. import org.fusesource.mqtt.client.QoS;  
  14. import org.fusesource.mqtt.client.Topic;  
  15. import org.fusesource.mqtt.client.Tracer;  
  16. import org.fusesource.mqtt.codec.MQTTFrame;  
  17.   
  18. /** 
  19.  * 采用Future模式 发布主题   
  20.  * 
  21.  */  
  22. public class MQTTFutureServer {  
  23.       
  24.      private final static String CONNECTION_STRING = "tcp://192.168.13.240:1883";    
  25.      private final static boolean CLEAN_START = true;    
  26.      private final static String CLIENT_ID = "server";  
  27.      private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s    
  28.        
  29.      public  static Topic[] topics = {    
  30.                      new Topic("mqtt/aaa", QoS.EXACTLY_ONCE),    
  31.                      new Topic("mqtt/bbb", QoS.AT_LEAST_ONCE),    
  32.                      new Topic("mqtt/ccc", QoS.AT_MOST_ONCE)};    
  33.        
  34.      public final  static long RECONNECTION_ATTEMPT_MAX=6;    
  35.      public final  static long RECONNECTION_DELAY=2000;    
  36.          
  37.      public final static int SEND_BUFFER_SIZE=2*1024*1024;//发送最大缓冲为2M    
  38.        
  39.        
  40.      public static void main(String[] args)   {    
  41.          MQTT mqtt = new MQTT();    
  42.          try {    
  43.              //==MQTT设置说明  
  44.              //设置服务端的ip    
  45.              mqtt.setHost(CONNECTION_STRING);    
  46.              //连接前清空会话信息 ,若设为false,MQTT服务器将持久化客户端会话的主体订阅和ACK位置,默认为true  
  47.              mqtt.setCleanSession(CLEAN_START);    
  48.              //设置心跳时间 ,定义客户端传来消息的最大时间间隔秒数,服务器可以据此判断与客户端的连接是否已经断开,从而避免TCP/IP超时的长时间等待  
  49.              mqtt.setKeepAlive(KEEP_ALIVE);    
  50.              //设置客户端id,用于设置客户端会话的ID。在setCleanSession(false);被调用时,MQTT服务器利用该ID获得相应的会话。  
  51.              //此ID应少于23个字符,默认根据本机地址、端口和时间自动生成  
  52.              mqtt.setClientId(CLIENT_ID);  
  53.              //服务器认证用户名  
  54.              //mqtt.setUserName("admin");  
  55.              //服务器认证密码  
  56.              //mqtt.setPassword("admin");  
  57.                
  58.              /* 
  59.              //设置“遗嘱”消息的内容,默认是长度为零的消息 
  60.              mqtt.setWillMessage("willMessage"); 
  61.              //设置“遗嘱”消息的QoS,默认为QoS.ATMOSTONCE 
  62.              mqtt.setWillQos(QoS.AT_LEAST_ONCE); 
  63.              //若想要在发布“遗嘱”消息时拥有retain选项,则为true 
  64.              mqtt.setWillRetain(true); 
  65.              //设置“遗嘱”消息的话题,若客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息 
  66.              mqtt.setWillTopic("willTopic"); 
  67.              */  
  68.                
  69.              //==失败重连接设置说明  
  70.               //设置重新连接的次数 ,客户端已经连接到服务器,但因某种原因连接断开时的最大重试次数,超出该次数客户端将返回错误。-1意为无重试上限,默认为-1  
  71.              mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);    
  72.              //设置重连的间隔时间  ,首次重连接间隔毫秒数,默认为10ms  
  73.              mqtt.setReconnectDelay(RECONNECTION_DELAY);    
  74.              //客户端首次连接到服务器时,连接的最大重试次数,超出该次数客户端将返回错误。-1意为无重试上限,默认为-1  
  75.              //mqtt.setConnectAttemptsMax(10L);  
  76.              //重连接间隔毫秒数,默认为30000ms  
  77.              //mqtt.setReconnectDelayMax(30000L);  
  78.              //设置重连接指数回归。设置为1则停用指数回归,默认为2  
  79.              //mqtt.setReconnectBackOffMultiplier(2);  
  80.                
  81.              //== Socket设置说明  
  82.              //设置socket接收缓冲区大小,默认为65536(64k)  
  83.              //mqtt.setReceiveBufferSize(65536);  
  84.              //设置socket发送缓冲区大小,默认为65536(64k)  
  85.              mqtt.setSendBufferSize(SEND_BUFFER_SIZE);    
  86.              ////设置发送数据包头的流量类型或服务类型字段,默认为8,意为吞吐量最大化传输  
  87.              mqtt.setTrafficClass(8);  
  88.                
  89.              //==带宽限制设置说明  
  90.              mqtt.setMaxReadRate(0);//设置连接的最大接收速率,单位为bytes/s。默认为0,即无限制  
  91.              mqtt.setMaxWriteRate(0);//设置连接的最大发送速率,单位为bytes/s。默认为0,即无限制  
  92.                
  93.              //==选择消息分发队列  
  94.              //若没有调用方法setDispatchQueue,客户端将为连接新建一个队列。如果想实现多个连接使用公用的队列,显式地指定队列是一个非常方便的实现方法  
  95.             //mqtt.setDispatchQueue(Dispatch.createQueue("mqtt/aaa"));  
  96.                
  97.             //==设置跟踪器  
  98.             /* mqtt.setTracer(new Tracer(){ 
  99.                  @Override 
  100.                  public void onReceive(MQTTFrame frame) { 
  101.                      System.out.println("recv: "+frame); 
  102.                  } 
  103.                  @Override 
  104.                  public void onSend(MQTTFrame frame) { 
  105.                      System.out.println("send: "+frame); 
  106.                  } 
  107.                  @Override 
  108.                  public void debug(String message, Object... args) { 
  109.                      System.out.println(String.format("debug: "+message, args)); 
  110.                  } 
  111.              });*/  
  112.                
  113.              //使用Future创建连接     
  114.              final FutureConnection connection= mqtt.futureConnection();    
  115.              connection.connect();    
  116.              int count=1;    
  117.              while(true){    
  118.                  count++;    
  119.                  // 用于发布消息,目前手机段不需要向服务端发送消息    
  120.                  //主题的内容    
  121.                  String message="Hello "+count+" MQTT...";    
  122.                  String topic = "mqtt/bbb";    
  123.                  connection.publish(topic, message.getBytes(), QoS.AT_LEAST_ONCE,    
  124.                          false);    
  125.                  System.out.println("MQTTFutureServer.publish Message "+"Topic Title :"+topic+" context :"+message);    
  126.                      
  127.              }    
  128.             //使用回调式API  
  129.              /* final CallbackConnection callbackConnection=mqtt.callbackConnection(); 
  130.             //连接监听 
  131.             callbackConnection.listener(new Listener() { 
  132.              //接收订阅话题发布的消息 
  133.             @Override 
  134.             public void onPublish(UTF8Buffer topic, Buffer body, Runnable ack) { 
  135.                 System.out.println("=============receive msg================"+new String(body.toByteArray())); 
  136.                 ack.run(); 
  137.             } 
  138.              //连接失败 
  139.              @Override 
  140.              public void onFailure(Throwable value) { 
  141.               System.out.println("===========connect failure==========="); 
  142.               callbackConnection.disconnect(null); 
  143.              } 
  144.                 //连接断开 
  145.              @Override 
  146.              public void onDisconnected() { 
  147.               System.out.println("====mqtt disconnected====="); 
  148.              } 
  149.              //连接成功 
  150.              @Override 
  151.              public void onConnected() { 
  152.               System.out.println("====mqtt connected====="); 
  153.              } 
  154.             }); 
  155.              //连接 
  156.              callbackConnection.connect(new Callback<Void>() { 
  157.                //连接失败 
  158.                  public void onFailure(Throwable value) { 
  159.                      System.out.println("============连接失败:"+value.getLocalizedMessage()+"============"); 
  160.                  } 
  161.                  // 连接成功 
  162.                  public void onSuccess(Void v) { 
  163.                      //订阅主题 
  164.                      Topic[] topics = {new Topic("mqtt/bbb", QoS.AT_LEAST_ONCE)}; 
  165.                      callbackConnection.subscribe(topics, new Callback<byte[]>() { 
  166.                          //订阅主题成功 
  167.                       public void onSuccess(byte[] qoses) { 
  168.                              System.out.println("========订阅成功======="); 
  169.                          } 
  170.                       //订阅主题失败 
  171.                          public void onFailure(Throwable value) { 
  172.                           System.out.println("========订阅失败======="); 
  173.                           callbackConnection.disconnect(null); 
  174.                          } 
  175.                      }); 
  176.                       //发布消息 
  177.                      callbackConnection.publish("mqtt/bbb", ("Hello ").getBytes(), QoS.AT_LEAST_ONCE, true, new Callback<Void>() { 
  178.                          public void onSuccess(Void v) { 
  179.                            System.out.println("===========消息发布成功============"); 
  180.                          } 
  181.                          public void onFailure(Throwable value) { 
  182.                           System.out.println("========消息发布失败======="); 
  183.                           callbackConnection.disconnect(null); 
  184.                          } 
  185.                      }); 
  186.              
  187.                  } 
  188.              }); 
  189.              */  
  190.                
  191.          } catch (URISyntaxException e) {    
  192.              e.printStackTrace();    
  193.          } catch (Exception e) {    
  194.              e.printStackTrace();    
  195.          }    
  196.      }    
  197.   
  198. }  
0 0
原创粉丝点击