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中三种方式实现发 ...
随机推荐
- 指针的引用(*&)与指针的指针(**)
指针的引用(*&)与指针的指针(**) 在下列函数声明中,为什么要同时使用*和&符号?以及什么场合使用这种声明方式? void func1( MYCLASS *&pBuildi ...
- 使用Spring MVC统一异常处理实战<转>
1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合 ...
- uboot中env实现
通过搜素比对字符串保存env. 所有的env都保存在一起,每个环境变量字段都以“\0\0”结束,最后一个命令字段以“\0\0\0”结束. 每次uboot启动时,先读出环境变量.当设置新数据时,遍历整个 ...
- 设置cookies第二天0点过期
网上这个资料很少,试了csdn其中一个人的方法去算时间,返回的是Invalid Date,不知道是不是不同IE版本 返回结果不同 后面找到另外一个很简答粗暴的方法 直接加一天后,设置时分秒为0,代码如 ...
- 使用RAID与LVM磁盘阵列技术。
7.2 LVM逻辑卷管理器 前面学习的硬盘设备管理技术虽然能够有效地提高硬盘设备的读写速度以及数据的安全性,但是在硬盘分好区或者部署为RAID磁盘阵列之后,再想修改硬盘分区大小就不容易了.换句话说,当 ...
- xshell用ssh连接VMware中的ubuntu
SSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则sudo apt-ge ...
- android listview 总结
ScrollView与ListView冲突: public class MyExpandableListView extends ExpandableListView { public MyExpan ...
- QListView的子项的ViewMode
QListView.setViewMode(ViewMode mode) enum QListView::ViewMode Constant Value DescriptionQListV ...
- linux nfs
linux(十四)之linux NFS服务管理 学到这里差不多就结束了linux的基础学习了,其实linux的内容并不难,我们要经常的反复的去操作它,多多和它去联络感情才能很好的掌握这个linux. ...
- <OC>OC新特征array literals
类似于java5提供的autoboxing功能.以前的写法:NSNumber * number = [NSNumber numberWithInt:1];NSArray * array = [NSAr ...