MQTT的学习研究(三)moquette-mqtt 的使用之mqtt服务发布主题信息
?????? 接着上一篇的moquette-mqtt 的使用之broker启动之后,我们需要启动moquette-mqtt 的服务端发布消息。
在moquette-mqtt 的mqtt-client中三种方式实现发布消息的方式:
??? 1.采用阻塞式的连接的(BlockingConnection)
??? 2.采用回调式的连接 (CallbackConnection)
??? 3.采用Future样式的连接(FutureConnection)
本文采用阻塞式作为实验对象。
?
??? ??? MQ 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。
这些特点使它适用于受限环境。例如,但不仅限于此:
???????????? 网络代价昂贵,带宽低、不可靠。
????????? ?在嵌入设备中运行,处理器和内存资源有限。
该协议的特点有:
????????? ?使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
?????????? 对负载内容屏蔽的消息传输。
????????? ?使用 TCP/IP 提供网络连接。
有三种消息发布服务质量:
???????? “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
???????? “至少一次”,确保消息到达,但消息重复可能会发生。
????????? “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。?
?????? ?小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
??????? 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
?
package com.etrip.mqtt;import java.net.URISyntaxException;import org.fusesource.mqtt.client.BlockingConnection;import org.fusesource.mqtt.client.MQTT;import org.fusesource.mqtt.client.QoS;import org.fusesource.mqtt.client.Topic;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * * * * MQTT moquette 的Server 段用于发布主题,并发布主题信息 * * 采用阻塞式 发布主题 * * @author longgangbai */public class MQTTServer { private static final Logger LOG = LoggerFactory.getLogger(MQTTServer.class);private final static String CONNECTION_STRING = "tcp://192.168.208.46:1883";private final static boolean CLEAN_START = true;private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30spublic static Topic[] topics = { new Topic("china/beijing", QoS.EXACTLY_ONCE), new Topic("china/tianjin", QoS.AT_LEAST_ONCE), new Topic("china/henan", QoS.AT_MOST_ONCE)};public final static long RECONNECTION_ATTEMPT_MAX=6;public final static long RECONNECTION_DELAY=2000;public final static int SEND_BUFFER_SIZE=2*1024*1024;//发送最大缓冲为2Mpublic static void main(String[] args) { MQTT mqtt = new MQTT(); try {//设置服务端的ipmqtt.setHost(CONNECTION_STRING);//连接前清空会话信息mqtt.setCleanSession(CLEAN_START);//设置重新连接的次数mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);//设置重连的间隔时间mqtt.setReconnectDelay(RECONNECTION_DELAY);//设置心跳时间mqtt.setKeepAlive(KEEP_ALIVE);//设置缓冲的大小mqtt.setSendBufferSize(SEND_BUFFER_SIZE);//创建连接 BlockingConnection connection = mqtt.blockingConnection(); //开始连接 connection.connect(); try { int count=0; while(true){ count++; //订阅的主题 String topic="china/beijing"; //主题的内容 String message="hello "+count+"chinese people !"; connection.publish(topic, message.getBytes(), QoS.AT_LEAST_ONCE, false); LOG.info("MQTTServer Message Topic="+topic+" Content :"+message); Thread.sleep(2000); }} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (URISyntaxException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}?
?
?
下面一篇是关于moquette-mqtt客户端接收信息的文章:
?
MQTT的学习研究(四)moquette-mqtt 的使用之mqtt客户端订阅并接收主题信息?
永久链接: http://topmanopensource.iteye.com/blog/1699408 ??