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();
- }
- });
- }
- }
- }
MQTT的学习研究(十四) MQTT moquette 的 Callback API 消息发布订阅的实现的更多相关文章
- MQTT的学习研究(十二) MQTT moquette 的 Future API 消息发布订阅的实现
MQTT moquette 的Server发布主题 package com.etrip.mqtt.future; import java.net.URISyntaxException; import ...
- MQTT的学习研究(四)moquette-mqtt 的使用之mqtt Blocking API客户端订阅并接收主题信息
在上面两篇关于mqtt的broker的启动和mqtt的服务端发布主题信息之后,我们客户端需要订阅相关的信息并接收相关的主题信息. package com.etrip.mqtt; import java ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- Linux学习之十四、管线命令
Linux学习之十四.管线命令 地址:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_6.php
- 风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击
风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击 XSS钓鱼攻击 HTTP Basic Authentication认证 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候 ...
- MQTT的学习研究(十)【转】mosquitto——一个开源的mqtt代理
MQTT(MQ Telemetry Transport),消息队列遥测传输协议,轻量级的发布/订阅协议,适用于一些条件比较苛刻的环境,进行低带宽.不可靠或间歇性的通信.值得一提的是mqtt提供三种不同 ...
- MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用
参看官方文档: http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.amqtat.doc/t ...
- MQTT的学习研究(十一) IBM MQTT 简单发布订阅实例
package com.etrip.push; import com.ibm.mqtt.MqttAdvancedCallback; import com.ibm.mqtt.MqttClient; im ...
- MQTT的学习研究(三)moquette-mqtt 的使用之mqtt服务发布主题信息
接着上一篇的moquette-mqtt 的使用之broker启动之后,我们需要启动moquette-mqtt 的服务端发布消息. 在moquette-mqtt 的mqtt-client中三种方式实现发 ...
随机推荐
- [状态机]嵌入式设计模式:有限状态自动机的C语言实现
转自:http://www.cnblogs.com/autosar/archive/2012/06/22/2558604.html 状态机模式是一种行为模式,在<设计模式>这本书中对其有详 ...
- netfiler/iptables
一. 什么是netfilter netfilter is a set of hooks inside the Linux kernel that allows kernel modules to re ...
- ipad safari 滚动(overflow)解决方案
项目需要放到ipad应用了,发现有一个奇怪的问题,就是我div是设置滚动属性的,在pc上面的各个浏览器页面变小时,会出现滚动条,可是是ipad的safari,则不会滚动,开始以为是div的问题 但发现 ...
- 教你如何做一个优雅的Ecmascripter /转
看看这些被同事喷的JS代码风格你写过多少 殷荣桧 JavaScript 今天 现在写代码比以前好多了,代码的格式都有eslint,prettier,babel(写新版语法)这些来保证,然而,技术手段再 ...
- QML vs WEB
UI领域, 如果是桌面应用,QML可以更快速.如果是手机UI,H5绝对占优. 移动设备已经为各行业的HMI的响应性和用户友好性设定了标准.汽车,医疗设备,工业自动化系统和消费电子产品制造商现在希望为其 ...
- 又一个错误" Fatal error: Call to undefined function myabp_print_screenshot_all() "
xxx ( ! ) Fatal error: Call to undefined function myabp_print_screenshot_all() in D:\wamp\www\wp-con ...
- mysql数据库对时间进行默认的设置
//----------------------------------------------------------sql语句----------------------------------- ...
- 使用Backbone构建精美应用的7条建议
我们在Bizzabo使用Backbone.js已经有两年的时间了.我们从一个小的网页应用为开始,这些小应用是由Backbone驱动的,而且他们看上去非常友好. Backbone天生就不固执己见.你从文 ...
- [oracle] oracle-ibatis-整理
① <!-- 复用sql代码 --> <sql id="CUSTOM_CABINET_INFO.QUERY_CABINET"> <dynamic pr ...
- 如今在 Internet 上流传的“真正”的程序员据说是这样的
如今在 Internet 上流传的“真正”的程序员据说是这样的: (1) 真正的程序员没有进度表,只有讨好领导的马屁精才有进度表,真正的程序员会让 领导提心吊胆. (2) 真正的程序员不写使用说明书, ...