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中三种方式实现发 ...
随机推荐
- vsftp移植(待续)
1. 下载sftp包,解压.如vsftpd-2.3.5.tar.gz2. 编译 进入目录后,修改交叉编译工具(vi Makefile) CC = arm-none-linux-gnueabi ...
- 一站式学习Wireshark(三):应用Wireshark IO图形工具分析数据流
基本IO Graphs: IO graphs是一个非常好用的工具.基本的Wireshark IO graph会显示抓包文件中的整体流量情况,通常是以每秒为单位(报文数或字节数).默认X轴时间间隔是1秒 ...
- linux设置开机服务自动启动/关闭自动启动命令
linux设置开机服务自动启动/关闭自动启动命令 2012-02-06 15:13 [root@localhost ~]# chkconfig --list 显示开机可以自动启动的服务[roo ...
- Select显示多级分类列表
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- pip国内源
pip install -i https://pypi.douban.com/simple pyqrcode
- Java-jdbc增删改查操作
java jdbc增删改查操作: package com.gordon.jdbc; import java.sql.Connection; import java.sql.DriverManager; ...
- CodeIgniter(3.1.4)框架中-使用多个公共控制器
项目目录结构: 在core/MY_Controller.php文件下: <?php /** * Class MY_Controller * 自定义控制器 */ class MY_Controll ...
- WebForm和MVC的一些知识(转)
转自:http://www.cnblogs.com/liuhf939/p/3417203.html 比较WebForm和Mvc的请求处理方式 首先简单了解一下Asp.Net中怎么对页面进行请求处理的: ...
- 关于Cocos2d-x中自己定义的类的名字和Cocos2d-x引擎库中的类的名字重复的解决方法
方法一: 修改自己定义的类的名字,VS2013中可以用Ctrl+H来替换某个特定的单词,Ctrl+F是用来查询某个单词所在的位置或者有没有存在. 方法二: 1.给自己定义的类的.h和.cpp文件的整体 ...
- selenium测试(Java)--下拉框(二十一)
例子: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...