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

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

采用Callback式 发布主题

  1. package com.etrip.mqtt.callback;
  2. import java.net.URISyntaxException;
  3. import org.fusesource.hawtbuf.Buffer;
  4. import org.fusesource.hawtbuf.UTF8Buffer;
  5. import org.fusesource.mqtt.client.Callback;
  6. import org.fusesource.mqtt.client.CallbackConnection;
  7. import org.fusesource.mqtt.client.Listener;
  8. import org.fusesource.mqtt.client.MQTT;
  9. import org.fusesource.mqtt.client.QoS;
  10. import org.fusesource.mqtt.client.Topic;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. /**
  14. *
  15. * MQTT moquette 的Server 段用于并发布主题信息
  16. *
  17. * 采用Callback式 发布主题
  18. *
  19. * @author longgangbai
  20. */
  21. public class MQTTCallbackServer {
  22. private static final Logger LOG = LoggerFactory.getLogger(MQTTCallbackServer.class);
  23. private final static String CONNECTION_STRING = "tcp://localhost:1883";
  24. private final static boolean CLEAN_START = true;
  25. private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s
  26. public  static Topic[] topics = {
  27. new Topic("china/beijing", QoS.EXACTLY_ONCE),
  28. new Topic("china/tianjin", QoS.AT_LEAST_ONCE),
  29. new Topic("china/henan", QoS.AT_MOST_ONCE)};
  30. public final  static long RECONNECTION_ATTEMPT_MAX=6;
  31. public final  static long RECONNECTION_DELAY=2000;
  32. public final static int SEND_BUFFER_SIZE=2*1024*1024;//发送最大缓冲为2M
  33. public static void main(String[] args)   {
  34. //创建MQTT对象
  35. MQTT mqtt = new MQTT();
  36. try {
  37. //设置mqtt broker的ip和端口
  38. mqtt.setHost(CONNECTION_STRING);
  39. //连接前清空会话信息
  40. mqtt.setCleanSession(CLEAN_START);
  41. //设置重新连接的次数
  42. mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);
  43. //设置重连的间隔时间
  44. mqtt.setReconnectDelay(RECONNECTION_DELAY);
  45. //设置心跳时间
  46. mqtt.setKeepAlive(KEEP_ALIVE);
  47. //设置缓冲的大小
  48. mqtt.setSendBufferSize(SEND_BUFFER_SIZE);
  49. //获取mqtt的连接对象BlockingConnection
  50. final CallbackConnection connection = mqtt.callbackConnection();
  51. //添加连接的监听事件
  52. connection.listener(new Listener() {
  53. public void onDisconnected() {
  54. }
  55. public void onConnected() {
  56. }
  57. public void onPublish(UTF8Buffer topic, Buffer payload, Runnable ack) {
  58. // You can now process a received message from a topic.
  59. // Once process execute the ack runnable.
  60. ack.run();
  61. System.out.println("topic"+topic.toString()+"="+new String(payload.getData()));
  62. }
  63. public void onFailure(Throwable value) {
  64. }
  65. });
  66. //添加连接事件
  67. connection.connect(new Callback<Void>() {
  68. /**
  69. * 连接失败的操作
  70. */
  71. public void onFailure(Throwable value) {
  72. // If we could not connect to the server.
  73. System.out.println("MQTTCallbackServer.CallbackConnection.connect.onFailure"+"连接失败......"+value.getMessage());
  74. value.printStackTrace();
  75. }
  76. /**
  77. * 连接成功的操作
  78. * @param v
  79. */
  80. public void onSuccess(Void v) {
  81. int count=1;
  82. while(true){
  83. count++;
  84. // 用于发布消息,目前手机段不需要向服务端发送消息
  85. //主题的内容
  86. final String message="hello "+count+"chinese people !";
  87. final String topic = "china/beijing";
  88. System.out.println("MQTTCallbackServer  publish  topic="+topic+" message :"+message);
  89. connection.publish(topic, message.getBytes(), QoS.AT_LEAST_ONCE, false, new Callback<Void>() {
  90. public void onSuccess(Void v) {
  91. // the pubish operation completed successfully.
  92. }
  93. public void onFailure(Throwable value) {
  94. value.printStackTrace();
  95. }
  96. });
  97. try {
  98. Thread.sleep(2000);
  99. } catch (InterruptedException e) {
  100. // TODO Auto-generated catch block
  101. e.printStackTrace();
  102. }
  103. }
  104. //                  //连接断开
  105. //                  connection.disconnect(new Callback<Void>() {
  106. //                      public void onSuccess(Void v) {
  107. //                        // called once the connection is disconnected.
  108. //                          System.out.println("MQTTSubscribeClient.CallbackConnection.connect.disconnect.onSuccess", "called once the connection is disconnected.");
  109. //                      }
  110. //                      public void onFailure(Throwable value) {
  111. //                        // Disconnects never fail.
  112. //                          System.out.println("MQTTSubscribeClient.CallbackConnection.connect.disconnect.onFailure", "Disconnects never fail."+value.getMessage());
  113. //                          value.printStackTrace();
  114. //                      }
  115. //                  });
  116. }
  117. });
  118. Thread.sleep(10000000000L);
  119. } catch (URISyntaxException e) {
  120. // TODO Auto-generated catch block
  121. e.printStackTrace();
  122. } catch (Exception e) {
  123. // TODO Auto-generated catch block
  124. e.printStackTrace();
  125. }finally{
  126. }
  127. }
  128. }

采用Callback式 订阅主题

  1. package com.etrip.mqtt.callback;
  2. import java.net.URISyntaxException;
  3. import org.fusesource.hawtbuf.Buffer;
  4. import org.fusesource.hawtbuf.UTF8Buffer;
  5. import org.fusesource.mqtt.client.Callback;
  6. import org.fusesource.mqtt.client.CallbackConnection;
  7. import org.fusesource.mqtt.client.Listener;
  8. import org.fusesource.mqtt.client.MQTT;
  9. import org.fusesource.mqtt.client.QoS;
  10. import org.fusesource.mqtt.client.Topic;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. /**
  14. *
  15. * MQTT moquette 的Client 段用于订阅主题,并接收主题信息
  16. *
  17. * 采用Callback式 订阅主题
  18. *
  19. * @author longgangbai
  20. */
  21. public class MQTTCallbackClient {
  22. private static final Logger LOG = LoggerFactory.getLogger(MQTTCallbackClient.class);
  23. private final static String CONNECTION_STRING = "tcp://localhost:1883";
  24. private final static boolean CLEAN_START = true;
  25. private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s
  26. public  static Topic[] topics = {
  27. new Topic("china/beijing", QoS.AT_MOST_ONCE),
  28. new Topic("china/tianjin", QoS.AT_LEAST_ONCE),
  29. new Topic("china/henan", QoS.AT_MOST_ONCE)};
  30. public final  static long RECONNECTION_ATTEMPT_MAX=6;
  31. public final  static long RECONNECTION_DELAY=2000;
  32. final String topic = "china/beijing";
  33. public final static int SEND_BUFFER_SIZE=2*1024*1024;//发送最大缓冲为2M
  34. public static void main(String[] args)   {
  35. //创建MQTT对象
  36. MQTT mqtt = new MQTT();
  37. //设置mqtt broker的ip和端口
  38. try {
  39. mqtt.setHost(CONNECTION_STRING);
  40. } catch (URISyntaxException e1) {
  41. e1.printStackTrace();
  42. }
  43. //连接前清空会话信息
  44. mqtt.setCleanSession(CLEAN_START);
  45. //设置重新连接的次数
  46. mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);
  47. //设置重连的间隔时间
  48. mqtt.setReconnectDelay(RECONNECTION_DELAY);
  49. //设置心跳时间
  50. mqtt.setKeepAlive(KEEP_ALIVE);
  51. //设置缓冲的大小
  52. mqtt.setSendBufferSize(SEND_BUFFER_SIZE);
  53. //获取mqtt的连接对象CallbackConnection
  54. final CallbackConnection connection= mqtt.callbackConnection();
  55. try {
  56. //添加连接的监听事件
  57. connection.listener(new Listener() {
  58. public void onDisconnected() {
  59. }
  60. public void onConnected() {
  61. System.out.println(" 连接成功!");
  62. }
  63. public void onPublish(UTF8Buffer topic, Buffer payload, Runnable onComplete) {
  64. }
  65. public void onFailure(Throwable value) {
  66. }
  67. });
  68. //添加连接事件
  69. connection.connect(new Callback<Void>() {
  70. /**
  71. * 连接失败的操作
  72. */
  73. public void onFailure(Throwable value) {
  74. // If we could not connect to the server.
  75. System.out.println("MQTTSubscribeClient.CallbackConnection.connect.onFailure  连接失败......"+value.getMessage());
  76. value.printStackTrace();
  77. }
  78. /**
  79. * 连接成功的操作
  80. * @param v
  81. */
  82. public void onSuccess(Void v) {
  83. System.out.println("MQTTSubscribeClient.CallbackConnection.connect.onSuccess 订阅连接成功......");
  84. //订阅相关的主题
  85. connection.subscribe(topics, new Callback<byte[]>() {
  86. public void onSuccess(byte[] qoses) {
  87. System.out.println("MQTTSubscribeClient.CallbackConnection.connect.subscribe.onSuccess 订阅主题成功......");
  88. }
  89. public void onFailure(Throwable value) {
  90. // subscribe failed.
  91. System.out.println("MQTTSubscribeClient.CallbackConnection.connect.subscribe.onSuccess 订阅主题失败!"+value.getMessage());
  92. value.printStackTrace();
  93. }
  94. });
  95. }
  96. });
  97. Thread.sleep(100000000000L);
  98. } catch (Exception e) {
  99. // TODO Auto-generated catch block
  100. e.printStackTrace();
  101. }finally{
  102. //            //连接断开
  103. connection.disconnect(new Callback<Void>() {
  104. public void onSuccess(Void v) {
  105. // called once the connection is disconnected.
  106. System.out.println("MQTTSubscribeClient.CallbackConnection.connect.disconnect.onSuccess called once the connection is disconnected.");
  107. }
  108. public void onFailure(Throwable value) {
  109. // Disconnects never fail.
  110. System.out.println("MQTTSubscribeClient.CallbackConnection.connect.disconnect.onFailure  Disconnects never fail."+value.getMessage());
  111. value.printStackTrace();
  112. }
  113. });
  114. }
  115. }
  116. }

MQTT的学习研究(十四) MQTT moquette 的 Callback API 消息发布订阅的实现的更多相关文章

  1. MQTT的学习研究(十二) MQTT moquette 的 Future API 消息发布订阅的实现

    MQTT moquette 的Server发布主题 package com.etrip.mqtt.future; import java.net.URISyntaxException; import  ...

  2. MQTT的学习研究(四)moquette-mqtt 的使用之mqtt Blocking API客户端订阅并接收主题信息

    在上面两篇关于mqtt的broker的启动和mqtt的服务端发布主题信息之后,我们客户端需要订阅相关的信息并接收相关的主题信息. package com.etrip.mqtt; import java ...

  3. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  4. Linux学习之十四、管线命令

    Linux学习之十四.管线命令 地址:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_6.php

  5. 风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击

    风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击 XSS钓鱼攻击 HTTP Basic Authentication认证 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候 ...

  6. MQTT的学习研究(十)【转】mosquitto——一个开源的mqtt代理

    MQTT(MQ Telemetry Transport),消息队列遥测传输协议,轻量级的发布/订阅协议,适用于一些条件比较苛刻的环境,进行低带宽.不可靠或间歇性的通信.值得一提的是mqtt提供三种不同 ...

  7. MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用

    参看官方文档: http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.amqtat.doc/t ...

  8. MQTT的学习研究(十一) IBM MQTT 简单发布订阅实例

    package com.etrip.push; import com.ibm.mqtt.MqttAdvancedCallback; import com.ibm.mqtt.MqttClient; im ...

  9. MQTT的学习研究(三)moquette-mqtt 的使用之mqtt服务发布主题信息

    接着上一篇的moquette-mqtt 的使用之broker启动之后,我们需要启动moquette-mqtt 的服务端发布消息. 在moquette-mqtt 的mqtt-client中三种方式实现发 ...

随机推荐

  1. fullcalendar案例一<原>

    fullcalendar是个很强大的日历控件,可以用它进行排班.排会议.拍任务,很直观,用户体验良好. 看下效果图: #parse("index/head.vm") <lin ...

  2. Apache HttpComponents 通过代理发送HTTP请求

    package org.apache.http.examples.client; import org.apache.http.HttpEntity; import org.apache.http.H ...

  3. GDI+(一):GDI+ 绘图基础

    一.GDI+绘图基础 编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数. ...

  4. java-javaweb_URL重写

    Java WEB实现URL重写的优缺点及如何实现: http://blog.csdn.net/cselmu9/article/details/8062033 urlrewrite 地址重写: http ...

  5. DataTables 表格固定栏使用方法

    有时候数据过多,为了用户体验,需要将重要的栏目固定不动,如下图所示: 从上图我们可以看出,表格滚动的时候,左边5栏是不动的.现在说一下实现方法: 插件地址: https://datatables.ne ...

  6. 在网页中使用SVG

    SVG可以作为一个独立的文件存在.但更多的时候,我们希望他能集成在某个更大的文档中,比如HTML.将SVG插入到HTML中主要有以下几种方式: 将 SVG 作为图像导入 将 SVG放入 iframe ...

  7. r语言 技巧总结

    1.table函数返回众数,再转为dataframe as.data.frame(table(x)) 2.使用which 返回数组下标 which(rs.list=="rs1008507&q ...

  8. loadrunner -56992

    设置Run-time Settings ,network speed ,use bandwidth为 512: 回放脚本没有报错,5个并发运行场景报如下错误: vuser_init.c(12): Er ...

  9. 第三百一十三节,Django框架,Session

    第三百一十三节,Django框架,Session Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 1.数据库(默认)2.缓存3.文件4.缓存+数据库5.加密c ...

  10. 转载:【原译】Erlang列表处理(Efficiency Guide)

    转自:http://www.cnblogs.com/futuredo/archive/2012/10/22/2734186.html List handling 1  Creating a list ...