Android - MQTT客户端

    • 什么是MQTT
    • Android 客户端的使用
      • 操作1.创建新连接 - newClient
      • 操作2.设置参数 - setClientConfig
      • 操作3.连接 - connectMqtt
      • 操作4.订阅 - subscribeTopic
      • 操作5.心跳- startKeepAliveAlarm
  • 参考地址

什么是MQTT

MQTT是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。

限制:
MQTT协议传输内容格式目前只支持2中,一个为UTF-8和askii,传输的内容最大为256M

Android 客户端的使用

依赖

    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'

代码


@Route(path = "/main/MqttActivity")
public class MqttActivity extends AppCompatActivity {/*** 服务端地址*/private String serverUri;/*** 连接时使用的clientId, 必须唯一, 一般加时间戳 (作为客户端的标识)*/private String clientId;/*** 消息持久化* <p>* 可以 内存存储或者文件存储,这里用的是文件存储*/private MqttClientPersistence mqttClientPersistence;/*** 声明一个MQTT客户端对象*/private MqttAndroidClient mqttAndroidClient;private MqttConnectOptions mqttConnectOptions;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_mqtt);newClient();setClientConfig();connectMqtt();}@Overrideprotected void onDestroy() {super.onDestroy();disconnectMqtt();}private void disconnectMqtt() {try {mqttAndroidClient.disconnect();} catch (MqttException e) {e.printStackTrace();}}private String topicFilter;private int qos;/*** 连接成功后,可以订阅了*/private void subscribeTopic() {try {mqttAndroidClient.subscribe(topicFilter, qos);startKeepAliveAlarm();} catch (MqttException e) {e.printStackTrace();//订阅失败可以重连}}private static final String MQTT_ACTION_KEEP_ALIVE = "MQTT 保活广播";private static final int MQTT_KEEP_ALIVE = 15 * 1000; //心跳包时间,毫秒/*** 开启保活的 Alarm*/private void startKeepAliveAlarm() {//使用 AlarmManager 进行保活,通过 PendingIntent 调用到 广播或者服务,实现真正的保活AlarmManager mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);Intent intent = new Intent(MQTT_ACTION_KEEP_ALIVE);PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);mAlarmManager.cancel(pi);mAlarmManager.setWindow(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + MQTT_KEEP_ALIVE, MQTT_KEEP_ALIVE, pi);}public static final byte[] MQTT_KEEP_ALIVE_MESSAGE = {0}; // 心跳包发送内容private String topicPublish;/*** 用于保活调用,被 {@link MqttActivity#startKeepAliveAlarm()} 触发*/private void keepAlive() {MqttMessage message = new MqttMessage(MQTT_KEEP_ALIVE_MESSAGE);message.setQos(0);topicPublish = "这是保活的topic";try {mqttAndroidClient.publish(topicPublish, message);} catch (MqttException e) {e.printStackTrace();}}private void connectMqtt() {try {mqttAndroidClient.connect(mqttConnectOptions, new IMqttActionListener() {/*** 连接成功* @param asyncActionToken -*/@Overridepublic void onSuccess(IMqttToken asyncActionToken) {subscribeTopic();}/*** 连接失败* @param asyncActionToken -* @param exception -*/@Overridepublic void onFailure(IMqttToken asyncActionToken, Throwable exception) {}});} catch (MqttException e) {e.printStackTrace();}}/*** 验证HTTPS*/private SSLSocketFactory sslSocketFactory;private void setClientConfig() {mqttConnectOptions = new MqttConnectOptions();//设置自动重连mqttConnectOptions.setAutomaticReconnect(true);// 缓存,mqttConnectOptions.setCleanSession(false);// 设置超时时间,单位:秒mqttConnectOptions.setConnectionTimeout(15);// 心跳包发送间隔,单位:秒mqttConnectOptions.setKeepAliveInterval(15);// 用户名mqttConnectOptions.setUserName("username");// 密码mqttConnectOptions.setPassword("password".toCharArray());//版本mqttConnectOptions.setMqttVersion(4);//HTTPSmqttConnectOptions.setSocketFactory(sslSocketFactory);}private void newClient() {mqttClientPersistence = new MqttDefaultFilePersistence(getCacheDir().getAbsolutePath());mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), serverUri, clientId, mqttClientPersistence);mqttAndroidClient.setCallback(new MqttCallback() {/***当与服务器的连接丢失时       ,将调用此方法。*@param cause 导致连接丢失的原因。*/@Overridepublic void connectionLost(Throwable cause) {}/*** 当来自服务器的消息到达时,调用此方法。** MQTT客户端同步调用此方法。* 直到此方法干净地返回,才会将确认发送回服务器。** 如果此方法的实现引发异常,则客户端将被关闭。下次重新连接客户端时,服务器将重新传递任何QoS 1或2消息。** 在运行此方法的实现时到达的任何其他消息将在内存中建立,然后在网络上备份。** 如果应用程序需要持久化数据,那么它应该确保在从该方法返回之前持久化数据,因为从该方法返回之后,消息被视为已传递,并且不可复制。** 可以在该回调的实现中发送新消息(例如,对此消息的响应),但该实现不能断开客户端的连接,因为无法发送对正在处理的消息的确认,并且会发生死锁。** @param topic 邮件主题的名称已发布到* @param message 实际消息* @throws Exception 如果发生终端错误,则应关闭客户端。*/@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {}/*** 在完成邮件传递并收到所有确认时调用。对于QoS 0消息,一旦消息被传递到网络,就会调用它。对于QoS 1,当接收到PUBACK时调用它;对于QoS 2,当接收到PUBCOMP时调用它。该令牌将与发布消息时返回的令牌相同。* @param token 与邮件关联的传递令牌。*/@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {}});}}

操作1.创建新连接 - newClient

需要参数:

服务端地址 - serverUri
连接时使用的clientId, 必须唯一, 一般加时间戳 (作为客户端的标识) - clientId
消息持久化(文件存储) - mqttClientPersistence
MQTT客户端 - mqttAndroidClient

mqttAndroidClient 是Android 专用的,除此之外还可以用 MqttAsyncClient = = 基本一致

public interface MqttCallback {public void connectionLost(Throwable cause);public void messageArrived(String topic, MqttMessage message) throws Exception;public void deliveryComplete(IMqttDeliveryToken token);
}

MqttCallback 是消息回调接口,订阅的消息动态由此返回

操作2.设置参数 - setClientConfig

需要参数:

如需验证HTTPS - SSLSocketFactory

设置自动重连 -
缓存 是否会话持久化 - cleanSession
超时时间,单位:秒 - connectionTimeout
心跳包发送间隔,单位:秒 -
用户名
密码
版本 - MqttVersion

操作3.连接 - connectMqtt

public interface IMqttActionListener {public void onSuccess(IMqttToken asyncActionToken );public void onFailure(IMqttToken asyncActionToken, Throwable exception);
}

返回成功 、 失败

操作4.订阅 - subscribeTopic

参数

主题 - topic

服务质量 - qos

“至多一次 Qos level=0”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次Qos level=1”,确保消息到达,但消息重复可能会发生。
“只有一次Qos level=2”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

操作5.心跳- startKeepAliveAlarm

订阅的同时也要做心跳保活

参考地址

基于MQTT协议的 org.eclipse.paho.client.mqttv3 源码学习(一)
https://blog.csdn.net/chenbifeng/article/details/25050693

基于MQTT协议的 org.eclipse.paho.client.mqttv3 源码学习(二)
https://blog.csdn.net/chenbifeng/article/details/25067761

Android实现MQTT客户端:https://www.jianshu.com/p/f2a043aeaa6d

Android Mqtt 客户端paho使用心得:https://www.jianshu.com/p/0d2086c4f6f4

基于paho在android平台上实现MQTT Client间的简单通信 - CSDN博客
http://itindex.net/detail/58745-paho-android-%E5%B9%B3%E5%8F%B0

MQTT基本应用(Mosquitto+Eclipse Paho):https://blog.csdn.net/AhaQianxun/article/details/102756981

记录每天学习的新知识:MQTT客户端相关推荐

  1. 记录每天学习的新知识:AlarmManager 定时任务

    AlarmManager 定时任务 使用场景 API 1.设置定时任务 1.1.单次定时任务 (set) 1.2.设置在时间段执行的定时任务(setWindow) 1.3.设置单次准确的定时任务(se ...

  2. 记录每天学习的新知识:Composing builds

    Composing builds 一.啥是 Composing builds ?? 二.使用 1. 于项目中新建 Moudle,取名 VersionPlugin 2.重写 VersionPlugin ...

  3. 记录每天学习的新知识:LiveData

    LiveData 前言 LiveData 使用 LiveData 的优势 使用 更新 转换 合并 扩展 - 自定义LiveData 参考地址 前言 Jetpack 是一个丰富的组件库,它的组件库按类别 ...

  4. 记录每天学习的新知识:DataBinding

    DataBinding 前言 使用前需要了解 一.基础用法 二.引入布局(include.viewStub) 三.单向绑定 (Data变化通知View) 1.BaseObservable 2.Obse ...

  5. 记录每天学习的新知识:ViewModel

    ViewModel 特点: 使用场景: 应用事例: 支持协程 参考地址 特点: 单一职责,将数据从业务中抽离出来.即只要是界面上看的到的数据,相关变量都应该存放在ViewModel,而不是Activi ...

  6. 记录每天学习的新知识:ARouter

    ARouter 前言 一.引用和初始化 二.跳转功能 三.支持跳转携带参数 四.支持URL跳转 五.Fragment跳转 六.实现 startActivityForResult 跳转 七.分组 八.拦 ...

  7. 记录每天学习的新知识:MotionEvent

    MotionEvent getAction MotionEvent.ACTION_DOWN MotionEvent.ACTION_UP MotionEvent.ACTION_MOVE MotionEv ...

  8. 【每天学习一点新知识】中间人攻击是什么

    目录 中间人攻击介绍 中间人攻击原理 1. ARP欺骗 2. DNS欺骗 防御方法 中间人攻击介绍 中间人攻击(man-in-the-middle attack, abbreviated to MIT ...

  9. MQTT协议学习:3、MQTT客户端实例

    MQTT协议学习:3.MQTT客户端实例 文章目录 MQTT协议学习:3.MQTT客户端实例 1. 前言 2. Paho MQTT (1). Go客户端实例 (2). Python客户端实例 (3). ...

最新文章

  1. halcon--1D measuring
  2. 小程序用户拒绝授权解决方法
  3. 5.深度学习练习:Deep Neural Network for Image Classification: Application
  4. 博弈——威佐夫博弈(hdu1527,2177)
  5. execve系统调用_Linux操作系统中的namespace是个什么鬼
  6. 软硬负载之间的对比及优缺点
  7. 计算机的典型网络地址 特殊0.0.0.0 本机127.0.0.1 内网192.168.xxx.xxx 172.xxx.xxx.xxx 10.xxx.xxx.xxx 外网
  8. html5集成远程控制,HP MicroServer Gen8 ILO4官方固件2.70安装及中文设置,远程控制台新增支持html5...
  9. 华为研发工程师笔试编程题
  10. IMU惯性测量单元是什么?
  11. android 连续播放动画,Android ObjectAnimator 无限循环播放,实现上下左右浮动效果...
  12. Oracle VM VirtualBox 打开Ubuntu出现0x00000000指令引用的0x00000000内存,该内存不能为written的解决方案
  13. 简单实用的查询ip地址、mac地址,修改ip地址的方法,ping命令检测网络是否通畅
  14. 使用DFA算法对敏感词进行过滤
  15. Aruba 无线调试(Instant AP)
  16. 使用Python开发一个恐龙跑跑小游戏,玩起来
  17. 速学大学计算机基本内容(一)有图
  18. Hadoop系列(一)——HDFS总结
  19. 解决简历模板无法生成下一页
  20. 中继器、集线器;网桥、交换机;路由器及网关之间的区别

热门文章

  1. DirectX 因素:音频处理对象简介
  2. java安装(找不到jre还苦恼的同志们)-彗星,请放弃jre
  3. vue-draggable-resizable放大缩小拖拽功能
  4. Integer.valueof()与Integer.parseInt()与intValue()的辨别
  5. leaflet图标跳动(leaflet篇.45)
  6. 我们该如何看待儿童编程?中年危机?
  7. mybatis逆向工程插件
  8. iphone充电图_如何为iPhone 7充电并同时听音乐
  9. h5和php前景分析,H5发展前景以及优劣势分析
  10. 数据操作日志记录表设计、可以查询、恢复历史数据记录