`
longgangbai
  • 浏览: 7330420 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MQTT的学习研究(十四) MQTT moquette 的 Callback API 消息发布订阅的实现

阅读更多

   在moquette-mqtt中提供了回调callback模式的发布和订阅但是在订阅之后没有发现有消息接收的方法,参看moquette-mqtt中Block,Future式的发布订阅基础是callback式订阅发布,但是本人在研究源代码测试,发现

callback方式接收没有成功。所以本文中只是callback式的发布和订阅没有消息接收的过程,尚未查到原因。

 

 

采用Callback式 发布主题

package com.etrip.mqtt.callback;

import java.net.URISyntaxException;

import org.fusesource.hawtbuf.Buffer;
import org.fusesource.hawtbuf.UTF8Buffer;
import org.fusesource.mqtt.client.Callback;
import org.fusesource.mqtt.client.CallbackConnection;
import org.fusesource.mqtt.client.Listener;
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 段用于并发布主题信息
 * 
 * 采用Callback式 发布主题 
 * 
 * @author longgangbai
 */
public class MQTTCallbackServer {
	  private static final Logger LOG = LoggerFactory.getLogger(MQTTCallbackServer.class);
		private final static String CONNECTION_STRING = "tcp://localhost:1883";
		private final static boolean CLEAN_START = true;
		private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s
		public  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;//发送最大缓冲为2M
		
		
	  public static void main(String[] args)   {
		//创建MQTT对象
	    MQTT mqtt = new MQTT();
	    try {
	    	//设置mqtt broker的ip和端口
			mqtt.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);
			
			

			
			//获取mqtt的连接对象BlockingConnection
			 final CallbackConnection connection = mqtt.callbackConnection();
			 
			
		    //添加连接的监听事件
		    connection.listener(new Listener() {
		      
		        public void onDisconnected() {
		        }
		        public void onConnected() {
		        }

		        public void onPublish(UTF8Buffer topic, Buffer payload, Runnable ack) {
		            // You can now process a received message from a topic.
		            // Once process execute the ack runnable.
		            ack.run();
		            System.out.println("topic"+topic.toString()+"="+new String(payload.getData()));
		        }
		        public void onFailure(Throwable value) {
		        }
		    });
		    //添加连接事件
		    connection.connect(new Callback<Void>() {
		    	/**
		    	 * 连接失败的操作
		    	 */
		        public void onFailure(Throwable value) {
		             // If we could not connect to the server.
		        	System.out.println("MQTTCallbackServer.CallbackConnection.connect.onFailure"+"连接失败......"+value.getMessage());
		        	value.printStackTrace();
		        }
		  
		        /**
		         * 连接成功的操作
		         * @param v
		         */
		        public void onSuccess(Void v) {
		        
                 int count=1;
                 while(true){
                	count++;
 		            // 用于发布消息,目前手机段不需要向服务端发送消息
                	//主题的内容
                	final String message="hello "+count+"chinese people !";
 		            final String topic = "china/beijing";
 		            System.out.println("MQTTCallbackServer  publish  topic="+topic+" message :"+message);
					connection.publish(topic, message.getBytes(), QoS.AT_LEAST_ONCE, false, new Callback<Void>() {
 		                public void onSuccess(Void v) {
 		                  // the pubish operation completed successfully.
 		                }
 		                public void onFailure(Throwable value) {
 		                	value.printStackTrace();
 		                }
 		            });
 		            try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
                 }
		            
//		            //连接断开
//		            connection.disconnect(new Callback<Void>() {
//		                public void onSuccess(Void v) {
//		                  // called once the connection is disconnected.
//		                	System.out.println("MQTTSubscribeClient.CallbackConnection.connect.disconnect.onSuccess", "called once the connection is disconnected.");
//		                }
//		                public void onFailure(Throwable value) {
//		                  // Disconnects never fail.
//		                	System.out.println("MQTTSubscribeClient.CallbackConnection.connect.disconnect.onFailure", "Disconnects never fail."+value.getMessage());
//		                	value.printStackTrace();
//		                }
//		            });
		            
		            
		        }
		    });
		    Thread.sleep(10000000000L);
		} catch (URISyntaxException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			
		}
	}
}

 

采用Callback式 订阅主题

 

package com.etrip.mqtt.callback;

import java.net.URISyntaxException;

import org.fusesource.hawtbuf.Buffer;
import org.fusesource.hawtbuf.UTF8Buffer;
import org.fusesource.mqtt.client.Callback;
import org.fusesource.mqtt.client.CallbackConnection;
import org.fusesource.mqtt.client.Listener;
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 的Client 段用于订阅主题,并接收主题信息
 * 
 * 采用Callback式 订阅主题 
 * 
 * @author longgangbai
 */
public class MQTTCallbackClient {
	  private static final Logger LOG = LoggerFactory.getLogger(MQTTCallbackClient.class);
		private final static String CONNECTION_STRING = "tcp://localhost:1883";
		private final static boolean CLEAN_START = true;
		private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s
		public  static Topic[] topics = {
			    		new Topic("china/beijing", QoS.AT_MOST_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;
		 final String topic = "china/beijing";
		public final static int SEND_BUFFER_SIZE=2*1024*1024;//发送最大缓冲为2M
		
		
		
	  public static void main(String[] args)   {
		//创建MQTT对象
	    MQTT mqtt = new MQTT();
    	//设置mqtt broker的ip和端口
		try {
			mqtt.setHost(CONNECTION_STRING);
		} catch (URISyntaxException e1) {
			e1.printStackTrace();
		}
		//连接前清空会话信息
		mqtt.setCleanSession(CLEAN_START);
		//设置重新连接的次数
		mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);
		//设置重连的间隔时间
		mqtt.setReconnectDelay(RECONNECTION_DELAY);
		//设置心跳时间
		mqtt.setKeepAlive(KEEP_ALIVE);
		//设置缓冲的大小
		mqtt.setSendBufferSize(SEND_BUFFER_SIZE);
	    //获取mqtt的连接对象CallbackConnection
		final CallbackConnection connection= mqtt.callbackConnection();
	    try {
	
		    //添加连接的监听事件
		    connection.listener(new Listener() {
		      
		        public void onDisconnected() {
		        }
		        public void onConnected() {
		        	System.out.println(" 连接成功!");
		        }

		        public void onPublish(UTF8Buffer topic, Buffer payload, Runnable onComplete) {
		        
		        }
		        public void onFailure(Throwable value) {
		        
		        }
		    });
		    //添加连接事件
		    connection.connect(new Callback<Void>() {
		    	/**
		    	 * 连接失败的操作
		    	 */
		        public void onFailure(Throwable value) {
		             // If we could not connect to the server.
		        	System.out.println("MQTTSubscribeClient.CallbackConnection.connect.onFailure  连接失败......"+value.getMessage());
		        	value.printStackTrace();
		        }
		   

		        /**
		         * 连接成功的操作
		         * @param v
		         */
		        public void onSuccess(Void v) {
		          	System.out.println("MQTTSubscribeClient.CallbackConnection.connect.onSuccess 订阅连接成功......");
			          
		            //订阅相关的主题
		            connection.subscribe(topics, new Callback<byte[]>() {
		                public void onSuccess(byte[] qoses) {
		                	System.out.println("MQTTSubscribeClient.CallbackConnection.connect.subscribe.onSuccess 订阅主题成功......");
		                }
		                public void onFailure(Throwable value) {
		                     // subscribe failed.
		                	System.out.println("MQTTSubscribeClient.CallbackConnection.connect.subscribe.onSuccess 订阅主题失败!"+value.getMessage());
		                	value.printStackTrace();
		                }
		            });

		            
		        }
		    });
		    Thread.sleep(100000000000L);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
//            //连接断开
            connection.disconnect(new Callback<Void>() {
                public void onSuccess(Void v) {
                  // called once the connection is disconnected.
                	System.out.println("MQTTSubscribeClient.CallbackConnection.connect.disconnect.onSuccess called once the connection is disconnected.");
                }
                public void onFailure(Throwable value) {
                  // Disconnects never fail.
                	System.out.println("MQTTSubscribeClient.CallbackConnection.connect.disconnect.onFailure  Disconnects never fail."+value.getMessage());
                	value.printStackTrace();
                }
            });
		}
	}
}

 

 

分享到:
评论
2 楼 rongina 2014-07-15  
楼主,activemq下如何在程序中判断Mqtt客户端是否在线呀?
1 楼 ld839431455 2014-07-10  
问题出现在server端的while循环中,把while循环去掉,就可以接受消息

相关推荐

    C#实现消息发布订阅即时通信Mqtt

    本文将详细讲解如何使用C#语言实现基于Mqtt协议的消息发布订阅功能,帮助开发者快速理解和应用这一技术。 Mqtt(Message Queuing Telemetry Transport),即消息队列遥测传输协议,是一种轻量级的发布/订阅消息协议...

    C#实现MQTT消息发布订阅,即时聊天通讯源码

    本文将详细介绍如何利用C#实现MQTT消息的发布和订阅,以及如何构建即时聊天通讯系统。 首先,我们需要了解MQTT协议的基本概念: 1. **主题(Topic)**:类似于频道,消息通过主题进行分发。 2. **发布(Publish)**...

    Mqtt发布与订阅功能示例代码

    MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息协议,常用于物联网(IoT)设备之间的通信。这个压缩包包含了两个Visual Studio 2010工程,`MqttPubTest`和`MqttSubTest`,分别用于实现MQTT...

    使用SpringBoot项目对接mqtt实现发布者与订阅者进行消息处理

    结合MQTT(Message Queuing Telemetry Transport)协议,我们可以构建高效的消息传递系统,实现发布者与订阅者之间的实时通信。本文将深入探讨如何利用Spring Boot与MQTT进行集成,以实现发布和订阅功能。 首先,...

    mqtt文档(亲测可用)

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的发布/订阅(Publish/Subscribe)消息协议,设计思想是开放、简单、小而精巧,适用于低带宽、高延迟或不可靠网络环境下的物联网通信。...

    java调用MQTT,实现订阅/发布功能

    在IT行业中,MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅式消息传输协议,常用于物联网(IoT)设备之间的通信。Java作为广泛应用的编程语言,有着丰富的库支持与MQTT服务器进行交互。在这个...

    MQTT发布/订阅消息机制

    根据提供的文件信息,我们可以深入探讨MQTT发布/订阅消息机制及其在Arduino传感节点的应用实现。 ### MQTT发布/订阅消息机制 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种高效的、轻量级...

    springboot+idea+java+mqtt实现订阅者订阅消息

    springboot+idea+java+mqtt实现订阅者订阅消息 针对业务需要和硬件对接,使用mqtt来处理硬件的数据 java实现订阅者订阅消息,以及处理硬件的数据 是根据业务场景写的demo,包括数据库什么的就不再上传,大家可以根据...

    java实现mqtt的发送和订阅

    MQTT是一种轻量级的发布/订阅消息传输协议,广泛应用于物联网(IoT)设备间的数据通信。我们将使用Paho MQTT Java客户端库,它是由Eclipse Paho项目提供的,为多种语言提供了MQTT支持。 首先,我们需要引入Paho ...

    MQTT+springboot 订阅/发布 多主题

    在描述中提到的“Springboot集成MQTT,订阅发布一体,提供接口可发布主题”,这意味着开发人员已经创建了一个服务,该服务不仅具备订阅MQTT主题并处理接收到的消息的能力,还可以通过定义的API接口来主动发布消息到...

    MQTTnet 在.net core中的应用--服务端+订阅发布客户端(支持阿里云mqtt)

    MQTT是一种基于发布/订阅模式的消息协议,广泛应用于物联网、移动应用、小型设备等场景。其特点包括低开销、小延迟、网络连接可靠性高以及发布者与订阅者解耦。 **2. MQTTnet服务端** 创建MQTTnet服务器时,首先...

    mqtt-简单实现 -动态增加订阅,取消订阅

    MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息协议,常用于物联网(IoT)设备之间的通信。在本主题中,我们将深入探讨如何在MQTT中实现动态增加订阅和取消订阅功能。 MQTT协议的核心在于...

    MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信demo

    1. **发布/订阅模型**:与点对点通信不同,MQTT采用发布者与订阅者模式,发布者发送消息到主题,订阅者根据自己的需求订阅主题,从而接收消息。 2. **三种质量服务(QoS)**:QoS 0(最多一次)、QoS 1(至少一次)和...

    mqtt发布订阅式消息队列

    MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅式消息协议,主要用于物联网(IoT)领域。它的设计目标是低带宽、低功耗和高可靠性,使得设备即使在网络不稳定的情况下也能有效地通信。MQTT的...

    C++实现mqtt协议

    MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息协议,常用于物联网(IoT)设备之间的通信。在C++中实现MQTT协议可以为开发者提供灵活且高效的解决方案,尤其对于资源受限的嵌入式系统。...

    moquette-mqtt源码

    MQTT是一种基于发布/订阅模型的消息协议,主要设计用于低带宽、高延迟或不可靠网络环境下的设备通信。它采用TCP/IP协议栈,支持QoS(Quality of Service)等级,确保消息的可靠传输。QoS 0为最多一次,QoS 1为至少一...

    C#使用 MQTTnet 快速实现 MQTT 通信,搭建的server和client例程Demo

    **四、发布与订阅** 4. **发布消息** - 创建 `MqttApplicationMessage`,指定主题和消息内容。 - 调用 `MqttClient.PublishAsync` 方法发布消息。 ```csharp var message = new MqttApplicationMessageBuilder()...

    mqtt服务器搭建及发布和订阅的测试

    MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级消息协议,非常适合移动设备和低带宽、高延迟或不可靠的网络环境中使用。本文将详细介绍如何搭建MQTT服务器,并进行发布和订阅的测试,...

    MQTT 协议基本介绍

    目录   一、简介 ...MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的“轻量级”消息协议,由 IBM 发布。 MQTT 可以被解释为一种低开销,低带宽占用

    C#版发布和订阅阿里云消息队列(Mqtt接入方式)

    在C#环境中,开发者可以使用MQTT库来实现与阿里云消息队列的交互,进行数据的发布和订阅。下面将详细介绍如何使用C#进行阿里云MQTT的接入,以及DXApp_MqttDemo项目可能包含的内容。 1. **注册阿里云账号和创建MQTT...

Global site tag (gtag.js) - Google Analytics