目的是为了实时监控室外广告屏的亮度,界面,声音,开关机等等…… 因为室外的网络情况是随时可变的,所以采用的MQTT协议,作为Android客户端来说因为用MQTT发送消息太繁琐,我们采用的是客户端只接收命令,然后用Http进行数据反馈,这个项目近期也做完了,故记录一下。

第一步:导入在线库

// mqtt 包导入
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

第二步:声明广播(这个是在线库自带的 直接这么写就行,不用自己写这个service)

<service android:name="org.eclipse.paho.android.service.MqttService" />

第三步:MqttManager的全部代码

public class MqttManager {public final static String TAG = MqttManager.class.getSimpleName();@SuppressLint("StaticFieldLeak")private static volatile MqttManager mInstance = null;private MqttCallback mCallback;public MqttClient client;private MqttConnectOptions conOpt;private Context context;public String[] topic;private MqttManager(Context context) {mCallback = new MqttCallbackBus(context);this.context = context;}public static MqttManager getInstance(Context context) {if (mInstance == null) {synchronized (MqttManager.class) {if (mInstance == null) {mInstance = new MqttManager(context);}}}return mInstance;}/*** 释放单例, 及其所引用的资源*/public static void release() {try {if (mInstance != null) {mInstance.disConnect();mInstance = null;}} catch (Exception e) {e.printStackTrace();}}/*** 创建Mqtt 连接** @param brokerUrl Mqtt服务器地址(tcp://xxxx:1863)* @param userName  用户名* @param password  密码* @return*/public boolean createConnect(String brokerUrl, String userName, String password) {topic = new String[]{PUBLISH_TOPIC};String deviceId = Utils.getDeviceNo();if (client != null && client.isConnected()) {return true;}boolean flag = false;try {conOpt = new MqttConnectOptions();conOpt.setCleanSession(true); //不接收离线期间的消息  每次都是重新登陆conOpt.setAutomaticReconnect(true); //自动重连if (!TextUtils.isEmpty(password)) {conOpt.setPassword(password.toCharArray());}if (!TextUtils.isEmpty(userName)) {conOpt.setUserName(userName);}client = new MqttClient(brokerUrl, deviceId, new MemoryPersistence());client.setCallback(mCallback);flag = doConnect();client.subscribe(topic);} catch (MqttException e) {e.printStackTrace();//重连String msg = "exception_reconnect";EventBus.getDefault().post(msg);}return flag;}/*** 建立连接** @return*/private boolean doConnect() {boolean flag = false;if (client != null) {try {client.connect(conOpt);flag = true;} catch (Exception e) {e.printStackTrace();}}return flag;}public boolean publish(String topicName, int qos, byte[] payload) {boolean flag = false;try {if (client == null) {createConnect(HOST, USERNAME, PASSWORD);}if (!client.isConnected()) {this.reconnect();}MqttMessage message = new MqttMessage(payload);message.setQos(qos);client.publish(topicName, message);flag = true;} catch (MqttException e) {e.printStackTrace();}return flag;}private boolean subscribe(String topicName, int qos) {boolean flag = false;if (client != null && client.isConnected()) {try {client.subscribe(topicName, qos);flag = true;} catch (MqttException e) {e.printStackTrace();}}return flag;}private boolean subscribe(String[] topicName, int qos[]) {boolean flag = false;if (client != null && client.isConnected()) {try {client.subscribe(topicName, qos);flag = true;} catch (MqttException e) {e.printStackTrace();}}return flag;}/*** 取消连接** @throws MqttException*/public void disConnect() throws MqttException {if (client != null && client.isConnected()) {client.disconnect();}}/*** 关闭连接*/public void close() {if (client != null && client.isConnected()) {try {client.disconnect();} catch (MqttException e) {e.printStackTrace();}}}/*** 重新连接*/private void reconnect() {if (client != null && !client.isConnected()) {try {client.setCallback(mCallback);client.connect(conOpt);client.subscribe(topic);} catch (MqttException e) {e.printStackTrace();}}}
}

里面用eventBus做了下重连处理,后续响应如下

boolean isHavNet = isConnectIsNomarl(); //判断是否有网
if (isHavNet) {handler.removeMessages(4);MqttManager.getInstance(BaseApplication.getContext()).createConnect(HOST, USERNAME, PASSWORD);
}else{handler.sendEmptyMessageDelayed(4, 10000);//无网等待有网再连
}

第四步:mqtt消息回调类

public class MqttCallbackBus implements MqttCallbackExtended {private Context mContext;public MqttCallbackBus(Context context) {this.mContext = context;}@Overridepublic void connectComplete(boolean reconnect, String serverURI) {Log.e("MqttCallbackBus", "MQTT_connectComplete:");//断开连接必须重新订阅才能收到之前订阅的session连接的消息if(reconnect){Log.e("MqttCallbackBus_重连订阅主题", "MQTT_connectComplete:");//这里是发送消息去重新订阅String msg = "reconnect";EventBus.getDefault().postSticky(msg);}}@Overridepublic void connectionLost(Throwable cause) { //掉线Log.e("MqttCallbackBus>>>", "MQTT_connectionLost 掉线原因:"+cause.getMessage());cause.printStackTrace();}@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {MqttReceivedMessage msg = (MqttReceivedMessage) message;String s = msg.toString();Log.e("MQTT_messageArrived_msg", "MQTT_msg"+topic);HashMap hs = new Gson().fromJson(s, HashMap.class);EventBus.getDefault().post(hs); //抛出收到的消息 eventbus响应做自己的业务处理}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) { //(发布)publish后会执行到这里,发送状态 token.isComplete()Log.e("MqttCallbackBus>>>", "MQTT_deliveryComplete:");}
}

其中connectComplete的重连回调reconnect = true 的eventbus的响应是:

//重连  能进重连  说明必有网了  不必再else 定时重试网络String[] topic = new String[]{PUBLISH_TOPIC};try {MqttManager.getInstance(BaseApplication.getContext()).client.subscribe(topic);} catch (MqttException e) {e.printStackTrace();}

MainActivity的使用如下:

//网络变化监听  首次连接mqttboolean isHavNet = isConnectIsNomarl();if (isHavNet) {handler.removeMessages(1);MqttManager.getInstance(BaseApplication.getContext()).createConnect(HOST, USERNAME, PASSWORD);} else {handler.sendEmptyMessageDelayed(1, 5000);}

MQTT全局的配置参数:

附赠个判断是否有网的工具类

/*** 判断网络是否连接*/
private boolean isConnectIsNomarl() {ConnectivityManager connectivityManager = (ConnectivityManager) this.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);@SuppressLint("MissingPermission") NetworkInfo info = connectivityManager.getActiveNetworkInfo();if (info != null && info.isConnected()) {String name = info.getTypeName();return true;} else {return false;}
}

Android MQTT客户端相关推荐

  1. android paho框架,Android Mqtt 客户端paho使用心得

    Android mqtt 客户端实现一般使用以下两个库: implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1 ...

  2. Android mqtt客户端实例

    build.gredle中配置 dependencies{ api 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' } 代码实例 pac ...

  3. 记录每天学习的新知识:MQTT客户端

    Android - MQTT客户端 什么是MQTT Android 客户端的使用 操作1.创建新连接 - newClient 操作2.设置参数 - setClientConfig 操作3.连接 - c ...

  4. Android使用的MQTT客户端

    Android使用的MQTT客户端,支持订阅.发送消息: 支持创建连接到本地保存: 支持话题消息筛选: 使用视频:https://dwz.cn/undJFEnq 小米应用商店也有 [蘑菇IoT]~ 核 ...

  5. Android实现MQTT客户端

    java代码 package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import andr ...

  6. Android Studio实现MQTT客户端

    初学Android Studio,在实现MQTT客户端的过程中遇到了很多坑,而在查阅博文的时候发现各个博文能提供的解决方法很零碎,我也是结合了诸多博文才最终解决了问题,于是打算做一个小总结 我用的版本 ...

  7. c++ mqtt客户端_MQTT详解及百度物接入连接手机测试(含源码) 秦子帅

    MQTT简介 MQTT定义 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支 ...

  8. android mqtt详解_Android mqtt入门 Android studio(转)

    Android mqtt入门 Android studio 2018年04月09日 14:02:30 hbw020 阅读数:1564 分享 mqtt简单使用介绍: 1.as创建工程 2.官网下载mqt ...

  9. 物联网阿里云——Android Mqtt协议连接阿里云

    实现步骤: 一.云平台端 1.首先在阿里云物联网平台创建产品和设备,获取设备三元组 {       "ProductKey": "a1QRE182gGH",   ...

  10. 一步步实现Android MQTT详细步骤,附工程文件

    一.lib下载 1,服务的lib org.eclipse.paho.android.service-1.1.1.jar 2,客户端的lib org.eclipse.paho.client.mqttv3 ...

最新文章

  1. VB6 通过winsock控件数组实现客户端和服务器多对一通信
  2. Oracle 绑定变量 详解 .
  3. 刷排名优优软件_QQ群拉人了,排名后置了?申诉案例
  4. SpringBoot时间戳与MySql数据库记录相差14小时排错
  5. 查找文件夹下所有文件名字_我的电脑如何快速查找文件,分分钟钟找到你想要的文件!...
  6. 这就是数据分析之算法认知
  7. matplotlib3d柱状图_Matplotlib——画图(散点图、柱状图、等高线图、3D图)
  8. PCB图纸太小元件放不下怎么办
  9. 方阵主对角线元素之和
  10. 干货:统计学派的18种经典「数据分析方法」
  11. 全球及中国标签印刷行业十四五发展形势与需求规模预测报告2022版
  12. LSA(Latent semantic analysis)
  13. html鼠标滑过带音效,html5 + css3 带音效下拉菜单的实现
  14. webshell查杀工具
  15. 北京开元数图科技有限公司面试总结(1)
  16. ChatGPT商业前景如何?人工智能未来会如何发展?
  17. 我是怎么招聘程序员的——引自大牛【陈皓】
  18. C语言-文件操作-练习
  19. 技嘉主板raid组建方法_【技嘉Z370评测】M.2磁盘RAID测试及总结_技嘉 Z370 AORUS Gaming 7_主板评测-中关村在线...
  20. 一种简单的蒙特卡洛树搜索并行化方法

热门文章

  1. DEVCON.EXE管理USB
  2. 软考中级网络工程师知识目录
  3. 基于JAVA获取行政区边界坐标_基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标...
  4. 通信专业综合能力(中级)考试大纲
  5. python如何截长图_Python网页截图/屏幕截图/截长图如何实现?
  6. JavaScript 3D实时线图
  7. UDS协议入门之10服务
  8. 智慧灯杆供电系统设计要求
  9. NXP iMX8系列处理器核心性能对比测试
  10. c语言开发arcgis,2017Esri开发竞赛GIS应用开发组一等奖作品