MQTT的学习研究(六) MQTT moquette 的 Blocking API 订阅消息客户端使用
* 使用 Java 为 MQ Telemetry Transport 创建订户
* 在此任务中,您将遵循教程来创建订户应用程序。订户将针对主题创建预订并接收该预订的发布。
* 提供了一个示例订户应用程序 Subscribe。Subscribe 将创建预订主题 MQTT Examples,并等待获
* 得该预订的发布,等待时间为 30 秒。订户可以创建预订并等待获得发布。它还可以接收发送至先前
* 为同一客户机标识创建的预订的发布。
* MqttConnectionOptions.cleanSession Boolean 属性将控制是否接收到先前所发送的发布
*
*4.创建新的 MqttClient 实例。
* MqttClient client = new MqttClient(Example.TCPAddress, Example.clientId);为客户机提供服务器地址,稍后会将此地址用来连接至 WebSphere MQ。设置客户机标识以对客户机命名。
*
* ◦(可选)可以提供 MqttClientPersistence 接口的实现以替换缺省实现。缺省 MqttPersistence 实现会将正在等待传递的 QoS 1 和 QoS 2 消息作为文件来存储;请参阅MQTT 客户机中的消息持久性。
* ◦MQTT 的缺省 WebSphere MQ TCP/IP 端口为 1883。对于 SSL,缺省端口为 8883。在此示例中,缺省地址设置为 tcp://localhost:1883。
* ◦通常,能够使用客户机标识来标识特定物理客户机很重要。在与服务器相连的所有客户机中,客户机标识必须是唯一的;请参阅MQTT 客户机标识。如果与前一个实例使用同一个客户机标识,那么表示目前的实例是同一个客户机的实例。如果您在两个正在运行的客户机中重复使用同一个客户机标识,那么这两个客户机中都会抛出异常,并且一个客户机会终止。
* ◦客户机标识的长度不能超过 23 个字节。如果超过了此长度,就会抛出异常。客户机标识中必须只包含队列管理器名称中允许使用的字符;例如,不能包含连字符或空格。
* ◦在您调用 MqttClient.connect 方法之前,不会处理消息。
* 使用客户机对象来发布和预订主题以及恢复有关尚未传递的发布的信息。
*
*
*6.创建一个 MqttConnectOptions 对象,并设置其 cleanSession 属性。
* a.创建一个 MqttConnectOptions 对象。
* MqttConnectOptions conOptions = new MqttConnectOptions();conOptions 是 MqttClient 构造函数的一个选项参数。
*
* b.设置 clearSession 属性。
* conOptions.setCleanSession(Example.cleanSession);缺省情况下,Example.cleanSession 参数设置为 true,从而与 MqttConnectionOptions.cleanSession 的缺省设置相匹配。
*
* 如果您使用缺省 MqttConnectOptions,或者在连接客户机之前将 MqttConnectOptions.cleanSession 设置为 true,那么在客户机建立连接时,将除去客户机的任何旧预订。当客户机断开连接时,会除去客户机在会话期间创建的任何新预订。
*
* 如果您在连接之前将 MqttConnectOptions.cleanSession 设置为 false,那么客户机创建的任何预订都会被添加至客户机在连接之前就已存在的所有预订。当客户机断开连接时,所有预订仍保持活动状态。
*
* 要了解 cleanSession 属性影响预订的方式,另一种方法就是将它视作模态属性。在其缺省方式 cleanSession=true 下,客户机仅在会话的作用域内创建预订和接收发布。在另一种方式 cleanSession=false 下,预订是持久预订。客户机可以连接和断开连接,而其预订保持活动状态。当客户机重新连接时,它将接收任何未传递的发布。在它连接之后,它可以自己修改处于活动状态的预订集。
*
* 在连接之前,您必须设置 cleanSession 方式;在整个会话期间都将保持此方式。要更改此属性的设置,必须将客户机断开连接,然后再重新连接客户机。如果您将方式从使用 cleanSession=false 更改为 cleanSession=true,那么此客户机先前的所有预订以及尚未接收到的任何发布都将被废弃。
*
MQTT订阅实现类:
- package com.etrip.wsmqtt.client;
- import com.ibm.micro.client.mqttv3.MqttClient;
- import com.ibm.micro.client.mqttv3.MqttConnectOptions;
- /**
- *
- * 使用 Java 为 MQ Telemetry Transport 创建订户
- * 在此任务中,您将遵循教程来创建订户应用程序。订户将针对主题创建预订并接收该预订的发布。
- * 提供了一个示例订户应用程序 Subscribe。Subscribe 将创建预订主题 MQTT Examples,并等待获
- * 得该预订的发布,等待时间为 30 秒。订户可以创建预订并等待获得发布。它还可以接收发送至先前
- * 为同一客户机标识创建的预订的发布。
- * @author longgangbai
- */
- public class WSMQTTClientSubscribe {
- public static void main(String[] args) {
- try {
- //创建MQTT客户端对象
- MqttClient client = new MqttClient(WSMQTTClientConstants.TCPAddress, WSMQTTClientConstants.clientId);
- //创建客户端MQTT回调类
- WSMQTTClientCallBack callback = new WSMQTTClientCallBack(WSMQTTClientConstants.clientId);
- //设置MQTT回调
- client.setCallback(callback);
- //创建一个连接对象
- MqttConnectOptions conOptions = new MqttConnectOptions();
- //设置清除会话信息
- conOptions.setCleanSession(WSMQTTClientConstants.cleanSession);
- //设置超时时间
- conOptions.setConnectionTimeout(10000);
- //设置会话心跳时间
- conOptions.setKeepAliveInterval(20000);
- //设置最终端口的通知消息
- conOptions.setWill(client.getTopic("LastWillTopic"), "the client will stop !".getBytes(), 1, false);
- //连接broker
- client.connect(conOptions);
- System.out.println("Subscribing to topic \"" + WSMQTTClientConstants.topicString
- + "\" for client instance \"" + client.getClientId()
- + "\" using QoS " + WSMQTTClientConstants.QoS + ". Clean session is "
- + WSMQTTClientConstants.cleanSession);
- //订阅相关的主题信息
- client.subscribe(WSMQTTClientConstants.topicString, WSMQTTClientConstants.QoS);
- System.out.println("Going to sleep for " + WSMQTTClientConstants.sleepTimeout / 1000
- + " seconds");
- Thread.sleep(100000000000000l);
- //关闭相关的MQTT连接
- if(client.isConnected()){
- client.disconnect();
- }
- System.out.println("Finished");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
MQTT订阅回调类:
- package com.etrip.wsmqtt.client;
- import com.ibm.micro.client.mqttv3.*;
- /**
- *
- * 消息订阅相关的回调类使用
- *
- * 必须实现MqttCallback的接口并实现对应的相关接口方法
- *
- * @author longgangbai
- */
- public class WSMQTTClientCallBack implements MqttCallback {
- private String instanceData = "";
- public WSMQTTClientCallBack(String instance) {
- instanceData = instance;
- }
- public void messageArrived(MqttTopic topic, MqttMessage message) {
- try {
- System.out.println("Message arrived: \"" + message.toString()
- + "\" on topic \"" + topic.toString() + "\" for instance \""
- + instanceData + "\"");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void connectionLost(Throwable cause) {
- System.out.println("Connection lost on instance \"" + instanceData
- + "\" with cause \"" + cause.getMessage() + "\" Reason code "
- + ((MqttException)cause).getReasonCode() + "\" Cause \""
- + ((MqttException)cause).getCause() + "\"");
- cause.printStackTrace();
- }
- public void deliveryComplete(MqttDeliveryToken token) {
- try {
- System.out.println("Delivery token \"" + token.hashCode()
- + "\" received by instance \"" + instanceData + "\"");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
常量类:
- package com.etrip.wsmqtt.client;
- /**
- *
- * 消息订阅消息的常量字段
- *
- * @author longgangbai
- */
- public final class WSMQTTClientConstants {
- public static final String TCPAddress = System.getProperty("TCPAddress", "tcp://192.168.208.46:1883");
- public static String clientId = String.format("%-23.23s",(System.getProperty("user.name") + "_" + (System.getProperty("clientId", "Subscribe."))).trim()).replace('-', '_');
- public static final String topicString = System.getProperty("topicString", "china/beijing");
- public static final String publication =System.getProperty("publication", "Hello World " + String.format("%tc", System.currentTimeMillis()));
- public static final int quiesceTimeout = Integer.parseInt(System.getProperty("timeout", "10000"));
- public static final int sleepTimeout =Integer.parseInt(System.getProperty("timeout", "10000000"));
- public static final boolean cleanSession = Boolean.parseBoolean(System.getProperty("cleanSession", "false"));
- public static final int QoS = Integer.parseInt(System.getProperty("QoS", "1"));
- public static final boolean retained = Boolean.parseBoolean(System.getProperty("retained", "false"));
- }
MQTT的学习研究(六) MQTT moquette 的 Blocking API 订阅消息客户端使用的更多相关文章
- MQTT的学习研究(十三) IBM MQTTV3 简单发布订阅实例
使用IBM MQTTv3实现相关的发布订阅功能 MQTTv3的发布消息的实现: package com.etrip.mqttv3; import com.ibm.micro.client.mqttv3 ...
- 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中三种方式实现发 ...
- MQTT的学习研究(二)moquette-mqtt 的使用之mqtt broker的启动
在MQTT 官网 (http://mqtt.org/software)中有众多MQTT的实现方式.具体参看官网,Moquette是基于Apache Mina 的模型的一个Java MQTT broke ...
- MQTT协议学习研究 & Mosquitto简要教程(安装和使用)
若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]——在RESTfu ...
- MQTT的学习研究(十七)Mosquitto简要教程(安装&使用)
Mosquitto是一个实现了MQTT3.1协议的代理服务器,由MQTT协议创始人之一的Andy Stanford-Clark开发,它为我们提供了非常棒的轻量级数据交换的解决方案.本文的主旨在于记录M ...
- MQTT的学习研究(十)【转】mosquitto——一个开源的mqtt代理
MQTT(MQ Telemetry Transport),消息队列遥测传输协议,轻量级的发布/订阅协议,适用于一些条件比较苛刻的环境,进行低带宽.不可靠或间歇性的通信.值得一提的是mqtt提供三种不同 ...
- MQTT的学习研究(十四) MQTT moquette 的 Callback API 消息发布订阅的实现
在moquette-mqtt中提供了回调callback模式的发布和订阅但是在订阅之后没有发现有消息接收的方法,参看moquette-mqtt中Block,Future式的发布订阅基础是callbac ...
- MQTT的学习研究(十二) MQTT moquette 的 Future API 消息发布订阅的实现
MQTT moquette 的Server发布主题 package com.etrip.mqtt.future; import java.net.URISyntaxException; import ...
随机推荐
- ES6 学习笔记 (2)-- Liunx环境安装Node.js 与 搭建 Node.js 开发环境
笔记参考来源:廖雪峰老师的javascript全栈教程 一.安装Node.js 目前Node.js的最新版本是6.2.x.首先,从Node.js官网下载对应平台的安装程序. 1.下载 选择对应的Liu ...
- 浏览器向下兼容之polyfill[阅后即瞎]
我们入门JavaScript的时候都写过polyfill: 比如手写一个弹窗, 手动模拟实现一个表格, 这些魔力的对象都是浏览器原生支持的, 虽然当我成为JS专家之后再也没造过轮子, 但是最近才发现我 ...
- iOS彩票项目--第四天,新特性界面搭建,UICollectionViewController的初次使用
一.新特性界面搭建的思路: 在AppDelegate加载主窗体的时候进行判断程序版本号,直接进入程序或者进入新特性展示界面 取出当前的版本号,与旧的版本号相比较(旧的版本号在进入程序的时候存起来 =& ...
- MongoDB(三):MongoDB概念解析
在上一篇文章中讲解了如何安装MongoDB,这篇文章中讲解一些有关MongoDB的概念. 不管我们要学习什么数据库,都应该学习其中的基础概念,在MongoDB中基本的概念是文档.集合.数据库,下面挨个 ...
- Linux mysql5.5
1.假设已经有mysql-5.5.10.tar.gz以及cmake-2.8.4.tar.gz两个源文件 (1)先安装cmake(mysql5.5以后是通过cmake来编译的) [root@ rhel5 ...
- sparkR could not find function "textFile"
Yeah, that’s probably because the head() you’re invoking there is defined for SparkR DataFrames[1] ( ...
- Python:基本运算、基本函数(包括复数)、Math模块、NumPy模块
基本运算 x**2 : x^2 若x是mat矩阵,那就表示x内每个元素求平方 inf:表示正无穷 逻辑运算符:and,or,not 字典的get方法 a.get(k,d) 1 1 get相当于一条if ...
- [转自setting]神奇的jQuery
前言 之前的项目也一直都是在用jQuery,遇到问题就翻翻API,也从来没有进行过比较系统的总结和整理.最近由于要做个培训,因为比较系统的归纳了一下javascript的相关知识,顺手做个笔记.说到j ...
- 关于Cocos2d-x中节点和精灵的关系以及初始化
1.每一个对象类都有一个自己public的一个create函数(等价于CREATE_FUNC),和init函数. 2.create函数返回的是自身的类型,init函数是在ceate函数被调用的时候自动 ...
- am335x reboot 命令分析
本文记录am335x运行reboot命令时,内核中运行过程. Tony Liu, 2016-6-8, Shenzhen 参考链接: http://blog.csdn.net/wavemcu/artic ...