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

MQTT moquette 的Server发布主题

Java代码  

  1. package com.etrip.mqtt.future;
  2. import java.net.URISyntaxException;
  3. import org.fusesource.mqtt.client.FutureConnection;
  4. import org.fusesource.mqtt.client.MQTT;
  5. import org.fusesource.mqtt.client.QoS;
  6. import org.fusesource.mqtt.client.Topic;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. /**
  10. *
  11. *
  12. *
  13. * 采用Future式 发布主题
  14. *
  15. * @author longgangbai
  16. */
  17. public class MQTTFutureServer {
  18. private static final Logger LOG = LoggerFactory.getLogger(MQTTFutureServer.class);
  19. private final static String CONNECTION_STRING = "tcp://192.168.208.46:1883";
  20. private final static boolean CLEAN_START = true;
  21. private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s
  22. public  static Topic[] topics = {
  23. new Topic("china/beijing", QoS.EXACTLY_ONCE),
  24. new Topic("china/tianjin", QoS.AT_LEAST_ONCE),
  25. new Topic("china/henan", QoS.AT_MOST_ONCE)};
  26. public final  static long RECONNECTION_ATTEMPT_MAX=6;
  27. public final  static long RECONNECTION_DELAY=2000;
  28. public final static int SEND_BUFFER_SIZE=2*1024*1024;//发送最大缓冲为2M
  29. public static void main(String[] args)   {
  30. MQTT mqtt = new MQTT();
  31. try {
  32. //设置服务端的ip
  33. mqtt.setHost(CONNECTION_STRING);
  34. //连接前清空会话信息
  35. mqtt.setCleanSession(CLEAN_START);
  36. //设置重新连接的次数
  37. mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);
  38. //设置重连的间隔时间
  39. mqtt.setReconnectDelay(RECONNECTION_DELAY);
  40. //设置心跳时间
  41. mqtt.setKeepAlive(KEEP_ALIVE);
  42. //设置缓冲的大小
  43. mqtt.setSendBufferSize(SEND_BUFFER_SIZE);
  44. //创建连接
  45. final FutureConnection connection= mqtt.futureConnection();
  46. connection.connect();
  47. int count=1;
  48. while(true){
  49. count++;
  50. // 用于发布消息,目前手机段不需要向服务端发送消息
  51. //主题的内容
  52. String message="hello "+count+"chinese people !";
  53. String topic = "china/beijing";
  54. connection.publish(topic, message.getBytes(), QoS.AT_LEAST_ONCE,
  55. false);
  56. System.out.println("MQTTFutureServer.publish Message "+"Topic Title :"+topic+" context :"+message);
  57. }
  58. } catch (URISyntaxException e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. } catch (Exception e) {
  62. // TODO Auto-generated catch block
  63. e.printStackTrace();
  64. }
  65. }
  66. }

MQTT moquette 的Client接收主题

Java代码  

  1. package com.etrip.mqtt.future;
  2. import java.net.URISyntaxException;
  3. import org.fusesource.mqtt.client.Future;
  4. import org.fusesource.mqtt.client.FutureConnection;
  5. import org.fusesource.mqtt.client.MQTT;
  6. import org.fusesource.mqtt.client.Message;
  7. import org.fusesource.mqtt.client.QoS;
  8. import org.fusesource.mqtt.client.Topic;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. /**
  12. *
  13. * MQTT moquette 的Client 段用于订阅主题,并接收主题信息
  14. *
  15. * 采用Future 式 订阅主题
  16. *
  17. * @author longgangbai
  18. */
  19. public class MQTTFutureClient {
  20. private static final Logger LOG = LoggerFactory.getLogger(MQTTFutureClient.class);
  21. private final static String CONNECTION_STRING = "tcp://192.168.208.46:1883";
  22. private final static boolean CLEAN_START = true;
  23. private final static short KEEP_ALIVE = 30;// 低耗网络,但是又需要及时获取数据,心跳30s
  24. private final static String CLIENT_ID = "publishService";
  25. public  static Topic[] topics = {
  26. new Topic("china/beijing", QoS.EXACTLY_ONCE),
  27. new Topic("china/tianjin", QoS.AT_LEAST_ONCE),
  28. new Topic("china/henan", QoS.AT_MOST_ONCE)};
  29. public final  static long RECONNECTION_ATTEMPT_MAX=6;
  30. public final  static long RECONNECTION_DELAY=2000;
  31. public final static int SEND_BUFFER_SIZE=2*1024*1024;//发送最大缓冲为2M
  32. public static void main(String[] args)   {
  33. //创建MQTT对象
  34. MQTT mqtt = new MQTT();
  35. try {
  36. //设置mqtt broker的ip和端口
  37. mqtt.setHost(CONNECTION_STRING);
  38. //连接前清空会话信息
  39. mqtt.setCleanSession(CLEAN_START);
  40. //设置重新连接的次数
  41. mqtt.setReconnectAttemptsMax(RECONNECTION_ATTEMPT_MAX);
  42. //设置重连的间隔时间
  43. mqtt.setReconnectDelay(RECONNECTION_DELAY);
  44. //设置心跳时间
  45. mqtt.setKeepAlive(KEEP_ALIVE);
  46. //设置缓冲的大小
  47. mqtt.setSendBufferSize(SEND_BUFFER_SIZE);
  48. //获取mqtt的连接对象BlockingConnection
  49. final FutureConnection connection= mqtt.futureConnection();
  50. connection.connect();
  51. connection.subscribe(topics);
  52. while(true){
  53. Future<Message> futrueMessage=connection.receive();
  54. Message message =futrueMessage.await();
  55. System.out.println("MQTTFutureClient.Receive Message "+ "Topic Title :"+message.getTopic()+" context :"+String.valueOf(message.getPayloadBuffer()));
  56. }
  57. } catch (URISyntaxException e) {
  58. // TODO Auto-generated catch block
  59. e.printStackTrace();
  60. } catch (Exception e) {
  61. // TODO Auto-generated catch block
  62. e.printStackTrace();
  63. }finally{
  64. }
  65. }
  66. }
时间: 2024-07-31 13:39:30

MQTT的学习研究(十二) MQTT moquette 的 Future API 消息发布订阅的实现的相关文章

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

在moquette-mqtt中提供了回调callback模式的发布和订阅但是在订阅之后没有发现有消息接收的方法,参看moquette-mqtt中Block,Future式的发布订阅基础是callback式订阅发布,但是本人在研究源代码测试,发现 callback方式接收没有成功.所以本文中只是callback式的发布和订阅没有消息接收的过程,尚未查到原因. 采用Callback式 发布主题 Java代码   package com.etrip.mqtt.callback; import java

MQTT的学习研究(二)moquette-mqtt 的使用之mqtt broker的启动

在MQTT 官网 (http://mqtt.org/software)中有众多MQTT的实现方式.具体参看官网,Moquette是基于Apache Mina 的模型的一个Java MQTT broker.使用过Mina的同学发现其实broker的启动过程就是一个Mina应用的启动. 在MQTT moquette 中采用MINA作为底层消息的传递方式  本类的目的启动MQTT moquette Broker 的方式,本文的源代码来自  moquette-broker-0.1-jar-with-de

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

#HTTP协议学习# (十二)理解转发与重定向

本文转自:http://blog.csdn.net/meiyalei/article/details/2129120  生动清晰 解释一 转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求---->web服务器接受此请求-->调用内部的一个方法在容器内部完成请求处理和转发动作---->将目标资源发送给客户:在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的r

hbase 学习(十二)集群间备份原理

集群建备份,它是master/slaves结构式的备份,由master推送,这样更容易跟踪现在备份到哪里了,况且region server是都有自己的WAL 和HLog日志,它就像mysql的主从备份结构一样,只有一个日志来跟踪.一个master集群可以向多个slave集群推送,收到推送的集群会覆盖它本地的edits日志. 这个备份操作是异步的,这意味着,有时候他们的连接可能是断开的,master的变化不会马上反应到slave当中.备份个格式在设计上是和mysql的statement-based

虚拟机VMWare学习笔记十二 - 将物理机抓取成虚拟机

1. 安装VMware vCenter Converter Standalone Client 运行虚拟机,File -- Virtualize a Physical Machine 这时如果电脑中没有VMware vCenter Converter Standalone Client ,则会进行安装. 安装过程 之后图标会出现在桌面上,双击运行 选择连接到本地服务器,登陆 点击转换计算机 这个,可以将本地计算机抓取成虚拟机,也可以将其他可以访问的计算机(需知道管理员用户名及密码)抓取成虚拟机.

javascript基础学习(十二)

javascript之BOM 学习要点: 屏幕对象 History对象 Location对象 一.屏幕对象 Screen对象是一个由javascript自动创建的对象,该对象的主要作用是描述客户端的显示器的信息. 目前显示器分辨率为800X600或1024X768两种. screen.height:屏幕的高度 screen.width:屏幕的宽度 screen.availHeigh:屏幕的有效高度 screen.availWidth:屏幕的有效宽度 二.History对象 History对象可以

JavaScript学习总结(十二)——JavaScript编写类

在工作中经常用到JavaScript,今天总结一下JavaScript编写类的几种写法以及这几种写法的优缺点,关于JavaScript编写类的方式,在网上看到很多,而且每个人的写法都不太一样,经常看到的就是以下几种方式. 1.构造函数方式 用构造函数模拟"类",在其内部用this关键字指代实例对象. 基本语法: function 类名(){     this.属性名;//公共属性     var 属性名;//私有属性    /*凡是定义类的公共属性和公共方法都要使用this*/   

Mysql学习之十二:JDBC连接数据库之DriverManager方法

JDBC连接数据库 ?创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ Sy