官方文档:Eclipse Paho Java Client

API:Package org.eclipse.paho.client.mqttv3

Paho 基础知识

Paho Java 客户端是用 Java 编写的 MQTT 客户端库,用于开发在 JVM 或其他 Java 兼容平台(例如 Android )上运行的应用程序 Paho Java 客户端提供了两个 API:MqttAsyncClient 提供了一个完全异步的 API,该活动通过注册的回调通知完成活动。 MqttClient 是 MqttAsyncClient 周围的同步包装器,其中函数与应用程序同步显示。

常用类和接口说明:

IMqttActionListener:异步操作完成后,将通知此接口的实现。

MqttCallback:使与客户端相关的异步事件发生时通知应用程序。

MqttAsyncClient:轻量级客户端,用于使用允许操作在后台运行的非阻塞方法与MQTT服务器通信。

MqttConnectOptions:包含用于控制客户端如何连接到服务器的选项集。

MqttMessage:MQTT消息包含应用程序有效负载和指定如何传递消息的选项。该消息包括表示为byte []的“有效负载”(消息的主体)。

Paho Java 实践

S1:添加依赖

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2'

S2:引入权限

S3:添加工具类(我自制)

/**

* Paho Java Client 工具类

* @author zhanghairong

* @version 2018-2-18

*/

public class MyMqttUtil {

// Log TAG

private final String TAG = "MyMqttUtil";

// MyMqttUtil 上下文环境

private Context mContext;

// MyMqttUtil 单例

private static MyMqttUtil mMyMqttUtilInstance;

// MqttAsyncClient 要连接的服务器

private final String serverURI = "tcp://xxxx:1883";

// MqttAsyncClient ID

private final String clientID = "123456";

// MqttAsyncClient 用于连接服务器的用户名

private final String userName = "root";

// MqttAsyncClient 用于连接服务器的密码

private final String password = "root";

// 断开连接的主题

private String Topic_DisCon = "Topic_DisCon";

// 数据持久化设置

private MqttDefaultFilePersistence dataStore;

// 客户端如何连接到服务器的选项集

private MqttConnectOptions mMqttConnectOptions;

// MqttAsyncClient 实例

private MqttAsyncClient mMqttAsyncClient;

// 私有构造

private MyMqttUtil(Context context) {

this.mContext = context;

initMqttClient();

}

// 单例模式

public static MyMqttUtil getInstance(Context context) {

if (mMyMqttUtilInstance == null) {

synchronized (MyMqttUtil.class) {

if (mMyMqttUtilInstance == null) {

mMyMqttUtilInstance = new MyMqttUtil(context);

}

}

}

return mMyMqttUtilInstance;

}

// 公共接口IMqttActionListener:异步操作完成后,将通知此接口的实现。在此处监听连接结果

private IMqttActionListener myIMqttActionListener = new IMqttActionListener() {

@Override// 操作成功完成后,将调用此方法。

public void onSuccess(IMqttToken asyncActionToken) {

Log.d(TAG, "MQTT 连接成功");

}

@Override// 操作失败时将调用此方法。

public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

Log.d(TAG, "MQTT 连接失败");

}

};

// 公共接口MqttCallback:使与客户端相关的异步事件发生时通知应用程序。

private MqttCallback mMqttCallback = new MqttCallback() {

@Override// 与服务器的连接丢失时,将调用此方法。

public void connectionLost(Throwable cause) {

Log.d(TAG, "与服务器的连接丢失,尝试重连");

}

@Override// 从服务器收到消息时,将调用此方法。

public void messageArrived(String topic, MqttMessage message) throws Exception {

Log.d(TAG, "从服务器收到消息 topic 是:" + topic + " message 是:" + new String(message.getPayload()));

}

@Override// 在完成消息传递并收到所有确认后调用。

public void deliveryComplete(IMqttDeliveryToken token) {

Log.d(TAG, "完成消息传递并收到所有确认");

}

};

// 初始化配置以及连接服务器

public void initMqttClient(){

try {

// MqttConnectOptions:包含用于控制客户端如何连接到服务器的选项集。

mMqttConnectOptions = new MqttConnectOptions();

// 设置MQTT版本。默认操作是连接版本3.1.1,如果失败则回落到3.1。分别使用MQTT_VERSION_3_1_1或MQTT_VERSION_3_1选项,可以选择特定的版本3.1.1或3.1,而不会回退。

mMqttConnectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);

// 设置连接超时值。该值(以秒为单位)定义了客户端将等待与MQTT服务器建立网络连接的最大时间间隔。默认超时为30秒。值为0将禁用超时处理,这意味着客户端将等待,直到成功建立网络连接或失败。

mMqttConnectOptions.setConnectionTimeout(10);

/*

设置客户端和服务器是否应该记住重新启动和重新连接之间的状态。

如果设置为false,则客户端和服务器都将在客户端,服务器和连接重新启动期间保持状态。维持状态:

即使重新启动客户端,服务器或连接,消息传递也将可靠地满足指定的QOS。

服务器会将订阅视为持久订阅。

如果设置为true,则客户端和服务器将不会在客户端,服务器或连接的重新启动期间保持状态。这表示

如果重新启动客户端,服务器或连接,则无法维持到指定QOS的消息传递

服务器会将订阅视为非持久订阅

*/

mMqttConnectOptions.setCleanSession(true);

/*

设置“保持活动”间隔。该值以秒为单位,定义了发送或接收消息之间的最大时间间隔。

它使客户端能够检测服务器是否不再可用,而不必等待TCP / IP超时。

客户端将确保在每个有效期内,至少有一条消息在网络上传播。

在这段时间内,如果没有与数据相关的消息,则客户端会发送一个很小的“ ping”消息,服务器将予以确认。

值为0将禁用客户端中的keepalive处理。

*/

mMqttConnectOptions.setKeepAliveInterval(10);

// 设置用于连接的用户名。

mMqttConnectOptions.setUserName(userName);

// 设置用于连接的密码。

mMqttConnectOptions.setPassword(password.toCharArray());

/*

设置连接的“最后的遗嘱”(LWT)。如果此客户端意外断开与服务器的连接,则服务器将使用提供的详细信息向自身发布消息。

topic -要发布到的主题。

payload -消息的字节有效负载。

qos -以(0、1或2)发布消息的服务质量。

retained -是否保留消息。

*/

mMqttConnectOptions.setWill(Topic_DisCon, "close".getBytes(), 1, false);

/*

设置如果连接断开,客户端是否将自动尝试重新连接到服务器。

如果设置为false,则在连接丢失的情况下,客户端将不会尝试自动重新连接到服务器。

如果设置为true,则在连接断开的情况下,客户端将尝试重新连接到服务器。它最初将等待1秒钟,然后再尝试重新连接,对于每次失败的重新连接尝试,延迟都会加倍,直到2分钟为止,此时延迟将保持2分钟。

*/

mMqttConnectOptions.setAutomaticReconnect(true);

dataStore = new MqttDefaultFilePersistence(System.getProperty("java.io.tmpdir"));

mMqttAsyncClient = new MqttAsyncClient(serverURI, clientID, dataStore);

mMqttAsyncClient.setCallback(mMqttCallback);// 设置一个回调侦听器以用于异步发生的事件。

} catch (MqttException e) {

e.printStackTrace();

}

}

// 连接服务器

public void connectServer(){

try {

if((mMqttAsyncClient != null) && (!mMqttAsyncClient.isConnected())){

mMqttAsyncClient.connect(mMqttConnectOptions, mContext, myIMqttActionListener);// 使用指定的选项连接到MQTT服务器

}

} catch (MqttException e) {

e.printStackTrace();

}

}

// 订阅主题

public void subTopic(String subTopic, int qos) {

if (mMqttAsyncClient != null && mMqttAsyncClient.isConnected()) {

try {

mMqttAsyncClient.subscribe(subTopic, qos);

Log.d(TAG, "订阅主题:" + subTopic + " 成功");

} catch (MqttException e) {

e.printStackTrace();

}

}

else {

Log.d(TAG, "服务器未连接");

}

}

// 推送数据

public void pubMessage(String pubTopic, String message){

if (mMqttAsyncClient != null && mMqttAsyncClient.isConnected()) {

try {

MqttMessage mqttMessage = new MqttMessage(message.getBytes());

mMqttAsyncClient.publish(pubTopic, mqttMessage);

Log.d(TAG, "推送主题:" + pubTopic + "数据 " + message + " 成功");

} catch (MqttException e) {

e.printStackTrace();

}

}

else {

Log.d(TAG, "服务器未连接");

}

}

// 断开连接

public void disConnectServer(){

if (mMqttAsyncClient != null && mMqttAsyncClient.isConnected()) {

try {

mMqttAsyncClient.disconnect();

Log.d(TAG, "服务器断开成功");

} catch (MqttException e) {

e.printStackTrace();

}

}

else {

Log.d(TAG, "服务器未连接");

}

}

}

S4:测试

btn_connect.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

MyMqttUtil.getInstance(Sample_MQTT.this).connectServer();

}

});

btn_publish.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

MyMqttUtil.getInstance(Sample_MQTT.this).pubMessage("Topic_Pub", "123456");

}

});

btn_subscribe.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

MyMqttUtil.getInstance(Sample_MQTT.this).subTopic("Topic_Sub", 1);

}

});

btn_disconnect.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

MyMqttUtil.getInstance(Sample_MQTT.this).disConnectServer();

}

});

android paho框架,Android 开发笔记 04 篇:Mqtt 框架 - Paho Java相关推荐

  1. 【 持续更新 】Android开发笔记汇总篇,爬各种坑,敲高效代码,各种奇难杂症,有您要治的病 。

    [持续更新]Android开发笔记汇总篇,爬各种坑,敲高效代码,各种奇难杂症,有您要治的病 . 一.AndroidStudio 开发工具的那些事 . 问题 1: AndroidStudio2.2以上在 ...

  2. AIR移动(Starling)开发笔记基础篇

    AIR移动(Starling)开发笔记基础篇 ---------kiddyPs:文档写的不是很好,欢迎指正和扩展 Starling相关 自定义移动动画 A.自定义函数 var tw:Tween = n ...

  3. 微信小程序开发笔记 进阶篇④——getPhoneNumber 获取用户手机号码(小程序云)

    文章目录 一.前言 二.前端代码wxml 三.前端代码js 四.云函数 五.程序流程 一.前言 微信小程序开发笔记--导读 大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机号码. 但是,因 ...

  4. 微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前)

    文章目录 一.前言 二.前端代码wxml 三.前端代码js 四.后端java 五.程序流程 六.参考 一.前言 微信小程序开发笔记--导读 大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机 ...

  5. Google Map 开发笔记——基础篇(Javascript )

    Google Map 开发笔记--基础篇 说明: 一.使用入门: 1.在您需要显示地图的 html 页面嵌入这段 script 2.地图 DOM 元素 3.初始化地图 二.地图画点.线.面 1.标记( ...

  6. 微信小程序开发笔记 进阶篇⑥——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之后)

    文章目录 一.前言 二.前端代码wxml 三.前端代码js 四.后端java 五.程序流程 六.参考 一.前言 微信小程序开发笔记--导读 大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机 ...

  7. 【QT开发笔记-基础篇】| 第二章 常用控件 | 2.12 表格控件 QTableWidget

    本节对应的视频讲解:B_站_链_接 QTableWidget 是 Qt 中的表格控件,可以行列的形式来展示数据 1. 属性和方法 QTableWidget 有很多属性和方法,完整的可查看帮助文档. 在 ...

  8. android大疆飞控界面,DJI Android SDK 开发笔记(入门篇)

    ##大疆SDK开发笔记## #1.文档相关 2.Android SDK文档 接入Android的SDK都在这部分,飞控相关的接口. 3.Android UX SDK文档 大疆自定义的组件,已经跟飞机关 ...

  9. Android开发笔记(二十六)Java的容器类

    容器的分类 集合(Set/HashSet) 集合中的元素是没有顺序的,而且不可以重复.这意味着,集合只能遍历而无法通过索引访问指定元素,并且如果重复添加相同值将不会增大集合.因为Set只是接口,所以实 ...

最新文章

  1. js原生操作select、radio 、checkbox
  2. python使用matplotlib画图,绘制三维、二维曲线。设置字体大小以及坐标系间距等
  3. 第一章 关于python
  4. boost::hana::tag_of_t用法的测试程序
  5. 数学的威力:一个方程提升中国卫星图像质量30%
  6. 除夕快乐 | 2月11日 星期四 | B站发文回应热搜风波;美团上线“团好货”独立App;国内首家自动驾驶企业获网约车运营许可...
  7. 【Statistics】均值
  8. python 求和并排序_Python堆排序原理与实现方法详解
  9. C/C++里面的左移和右移
  10. windows平台源码编译最新版openssl
  11. 一套提取自 Ant Design 的优质图标
  12. 解决windows update失败,正在还原的问题
  13. CSDN博客下载器v2.5(解决严重bug)
  14. 种子填充算法c语言代码实现,OpenGL绘图实例三之种子填充算法
  15. 【C语言中的EOF】零基础看懂EOF如何使用while(scanf(“%d %d”,a,b)感叹号=EOF)
  16. 数据库原理及应用 mysql版_数据库原理及应用(MySQL版)
  17. uni-app实现XCode苹果本地离线打包APP
  18. 微信小程序 + shiro 实现登录(安全管理) —— 保姆级教学
  19. 17track包裹单个物流轨迹抓取(一)
  20. matlab中的图片输出和设定

热门文章

  1. 疫情之下,企业财务职能面临的挑战与机遇并存
  2. jsp ajax加载html页面,Ajax中的load()方法实现指定区域加载或刷新html与jsp
  3. Redis学习笔记之七:有序集合类型
  4. css写三角形,对号√
  5. window caps 转换成 ctrl 按键映射
  6. Java基本语法-程序流程控制
  7. Microsoft Project 2010简体中文专业版+注册密钥
  8. html5七牛图片上传js,前端如何上传图片至七牛云
  9. 配置同时使用 Gitlab、Github、Gitee(码云) 共存的开发环境
  10. 2020牛客寒假算法基础集训营3 A.牛牛的DRB迷宫I