emqttd java代码测试【转】

来源:互联网 发布:财务报表数据分析方法 编辑:程序博客网 时间:2024/06/05 08:26

来自:http://blog.csdn.net/zhu_tianwei/article/details/49178167

emqttd 集群在上一节我们已经配置完毕。emqttd默认占用1883端口用于MQTT连接,8083端口用于HTTP接口,通过HTTP接口从应用程序向MQTT客户端发布消息。下面我们通过Java实现消息的发布和订阅。

1.pom

使用mqtt-client java客户端,添加依赖jar

[html] view plain copy
 print?
  1. <dependency>  
  2.             <groupId>org.fusesource.mqtt-client</groupId>  
  3.             <artifactId>mqtt-client</artifactId>  
  4.             <version>1.12</version>  
  5.         </dependency>  
2.代码实现

订阅者订阅node2节点端口

[java] view plain copy
 print?
  1. package mqtt;  
  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.  * 客户端订阅消息 
  14.  */  
  15. public class Client {  
  16.       
  17.     private final static String CONNECTION_STRING = "tcp://192.168.1.91: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), //  2 只有一次  
  23.         new Topic("mqtt/bbb", QoS.AT_LEAST_ONCE),  // 1 至少一次  
  24.         new Topic("mqtt/ccc", QoS.AT_MOST_ONCE) };  // 0 至多一次  
  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 = 64 ;// 发送最大缓冲为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  ,采用Future模式 订阅主题  
  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.             e.printStackTrace();    
  62.         } catch (Exception e) {    
  63.             e.printStackTrace();    
  64.         } finally {    
  65.         }    
  66.     }  
  67.   
  68. }  
发布者通过node1发布消息

[java] view plain copy
 print?
  1. package mqtt;  
  2.   
  3. import java.net.URISyntaxException;  
  4.   
  5. import org.fusesource.mqtt.client.FutureConnection;  
  6. import org.fusesource.mqtt.client.MQTT;  
  7. import org.fusesource.mqtt.client.QoS;  
  8. import org.fusesource.mqtt.client.Topic;  
  9.   
  10. /** 
  11.  * 服务端发布消息 
  12.  */  
  13. public class Server {  
  14.   
  15.     private final static String CONNECTION_STRING = "tcp://192.168.1.90:1883";  
  16.     private final static boolean CLEAN_START = true;  
  17.     private final static String CLIENT_ID = "server";  
  18.     private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s  
  19.   
  20.     public static Topic[] topics = {   
  21.     new Topic("mqtt/aaa", QoS.EXACTLY_ONCE), // 2  只有一次  
  22.         new Topic("mqtt/bbb", QoS.AT_LEAST_ONCE),  // 1 至少一次  
  23.         new Topic("mqtt/ccc", QoS.AT_MOST_ONCE) };  // 0 至多一次  
  24.   
  25.     public final static long RECONNECTION_ATTEMPT_MAX = 6;  
  26.     public final static long RECONNECTION_DELAY = 2000;  
  27.   
  28.     public final static int SEND_BUFFER_SIZE = 64;// 发送最大缓冲  
  29.   
  30.     public static void main(String[] args) {  
  31.          MQTT mqtt = new MQTT();      
  32.          try {      
  33.              //==MQTT设置说明    
  34.              //设置服务端的ip      
  35.              mqtt.setHost(CONNECTION_STRING);      
  36.              //连接前清空会话信息 ,若设为false,MQTT服务器将持久化客户端会话的主体订阅和ACK位置,默认为true    
  37.              mqtt.setCleanSession(CLEAN_START);      
  38.              //设置心跳时间 ,定义客户端传来消息的最大时间间隔秒数,服务器可以据此判断与客户端的连接是否已经断开,从而避免TCP/IP超时的长时间等待    
  39.              mqtt.setKeepAlive(KEEP_ALIVE);      
  40.              //设置客户端id,用于设置客户端会话的ID。在setCleanSession(false);被调用时,MQTT服务器利用该ID获得相应的会话。    
  41.              //此ID应少于23个字符,默认根据本机地址、端口和时间自动生成    
  42.              mqtt.setClientId(CLIENT_ID);    
  43.                  
  44.              //==失败重连接设置说明    
  45.               //设置重新连接的次数 ,客户端已经连接到服务器,但因某种原因连接断开时的最大重试次数,超出该次数客户端将返回错误。-1意为无重试上限,默认为-1    
  46.              mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);      
  47.              //设置重连的间隔时间  ,首次重连接间隔毫秒数,默认为10ms    
  48.              mqtt.setReconnectDelay(RECONNECTION_DELAY);      
  49.              //设置socket发送缓冲区大小,默认为65536(64k)    
  50.              mqtt.setSendBufferSize(SEND_BUFFER_SIZE);      
  51.              ////设置发送数据包头的流量类型或服务类型字段,默认为8,意为吞吐量最大化传输    
  52.              mqtt.setTrafficClass(8);    
  53.                  
  54.              //==带宽限制设置说明    
  55.              mqtt.setMaxReadRate(0);//设置连接的最大接收速率,单位为bytes/s。默认为0,即无限制    
  56.              mqtt.setMaxWriteRate(0);//设置连接的最大发送速率,单位为bytes/s。默认为0,即无限制    
  57.                  
  58.              //使用Future创建连接       
  59.              final FutureConnection connection= mqtt.futureConnection();      
  60.              connection.connect();      
  61.              int count=1;      
  62.              while(true){      
  63.                  count++;      
  64.                  // 用于发布消息,目前手机段不需要向服务端发送消息      
  65.                  //主题的内容      
  66.                  String message="Hello "+count+" MQTT...";      
  67.                  String topic = "mqtt/bbb";      
  68.                  connection.publish(topic, message.getBytes(), QoS.AT_LEAST_ONCE,      
  69.                          false);      
  70.                  System.out.println("MQTTFutureServer.publish Message "+"Topic Title :"+topic+" context :"+message);      
  71.              }      
  72.          } catch (URISyntaxException e) {      
  73.              e.printStackTrace();      
  74.          } catch (Exception e) {      
  75.              e.printStackTrace();      
  76.          }finally{  
  77.          }  
  78.     }  
  79.   
  80. }  
运行代码测试正常接收、发布消息。
也可以通过http请求的方式发布消息,如下:

curl -v --basic -u user:passwd -d "qos=2&retain=0&topic=mqtt/aaa&message=hello" -k http://192.168.1.90:8083/mqtt/publish

NameDescriptionclientClientIdqosQoS(0, 1, 2)retainRetain(0, 1)topicTopicmessageMessage没有添加认证,用户密码可以随便填写。

RETAIN(保持)
仅针对PUBLISH消息。不同值,不同含义:
1:表示发送的消息需要一直持久保存(不受服务器重启影响),不但要发送给当前的订阅者,并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
备注:新来乍到的订阅者,只会取出最新的一个RETAIN flag = 1的消息推送。
0:仅仅为当前订阅者推送此消息。
假如服务器收到一个空消息体(zero-length payload)、RETAIN = 1、已存在Topic name的PUBLISH消息,服务器可以删除掉对应的已被持久化的PUBLISH消息。

参考:https://github.com/emqtt/emqttd/wiki/HTTP%20Publish


0 0