Android Q 接入 MQTT

首先在APP 下引入mqtt的库

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

创建一个MQTT连接的实体类

package com.example.iot.bean;

/**
* @TODO MQTT 连接实体类
* @Create by: wjw
* @Create time: 2020/2/8 11:26
*/
public class MQTTentity { //以下请自己配置否则MainActivity中button_login的监听会有问题
private String host;
private String userName;
private String passWord;
private String[] timeTopic; public String getHost() {
return host;
} public void setHost(String host) {
this.host = host;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassWord() {
return passWord;
} public void setPassWord(String passWord) {
this.passWord = passWord;
} public String[] getTimeTopic() {
return timeTopic;
} public void setTimeTopic(String[] timeTopic) {
this.timeTopic = timeTopic;
} public MQTTentity() {
} public MQTTentity(String host, String userName, String passWord, String[] timeTopic) {
this.host = host;
this.userName = userName;
this.passWord = passWord;
this.timeTopic = timeTopic;
} @Override
public String toString() {
return "MQTTentity{" +
"host='" + host + '\'' +
", userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
", timeTopic='" + timeTopic + '\'' +
'}';
}
}

然后在activity中写主逻辑

//我们自己新建的MQTT实体类
private MQTTentity mqttentity;
private MqttClient client;
private MqttConnectOptions options;
//以下两个声明目的是为了实现MQTT消息在testview刷新
private ScheduledExecutorService scheduler;
private Handler handler;

在onCreate方法中

handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what == 1) {
Toast.makeText(MonitorAct.this, (String) msg.obj, Toast.LENGTH_SHORT).show();
} else if (msg.what == 2) {
MqttToast.setVisibility(View.GONE);
try {
client.subscribe(mqttentity.getTimeTopic()); //订阅主题“timeTopic”
Toast.makeText(MonitorAct.this, "场景已成功接入服务器", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
} else if (msg.what == 3) {
MqttToast.setVisibility(View.VISIBLE);
Toast.makeText(MonitorAct.this, "接入服务器失败,务必确保网络正常,系统正在重连,请稍后...", Toast.LENGTH_LONG).show();
}
return false;
}
});

mqtt连接

// MQTT 订阅主题
String[] topics = new String[1];
topics[0] = "/wjw";
mqttentity = new MQTTentity("tcp://127.0.0.1:1888", "admin", "admin", topics);
initMQTT(mqttentity);
startReconnect();
 /**
* @TODO 获取手机imei
* @Create by: wjw
* @Create time: 2020/2/8 11:27
*/
public static String getIMEI(Context context, int slotId) {
try {
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Method method = manager.getClass().getMethod("getImei", int.class);
String imei = (String) method.invoke(manager, slotId);
return imei;
} catch (Exception e) {
return "";
}
}
/**
* @TODO MQTT初始化
* @Create by: wjw
* @Create time: 2020/2/8 12:08
*/
private void initMQTT(MQTTentity mqtTentity) { // 获取手机IMEI作为clientId
String imei = getIMEI(MonitorAct.this, 0);
// HOST为主机名
try {
client = new MqttClient(mqtTentity.getHost(), imei, new MemoryPersistence());
} catch (MqttException e) {
e.printStackTrace();
}
// MQTT连接设置
options = new MqttConnectOptions();
// 设置是否清空session,如果是false则表示服务器保留客户端连接记录
options.setCleanSession(true);
// 设置连接的用户名
options.setUserName(mqtTentity.getUserName());
// 设置连接的密码
options.setPassword(mqtTentity.getPassWord().toCharArray());
// 设置超时时间,单位为秒
options.setConnectionTimeout(10);
// 设置会话间心跳时间,单位为秒,服务器每隔1.5*20向客户端发消息确认
options.setKeepAliveInterval(20);
// 设置回调
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
// 连接丢失后,一般在这里进行重连
} @Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// subscribe后,得到的消息会执行到这里
Message msg = new Message();
msg.what = 1;
msg.obj = message.toString();
handler.sendMessage(msg);
} @Override
public void deliveryComplete(IMqttDeliveryToken token) {
// publish后,会执行这里
}
}); }
 /**
* @TODO MQTT建立连接及重连
* @Create by: wjw
* @Create time: 2020/2/8 11:48
*/
private void startReconnect() {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if (!client.isConnected()) {
connect();
}
}
}, 0, 10 * 1000, TimeUnit.MILLISECONDS);
}
/**
* @TODO MQTT连接状态鉴别
* @Create by: wjw
* @Create time: 2020/2/8 11:51
*/
private void connect() {
new Thread(new Runnable() {
@Override
public void run() {
try {
client.connect(options);
Message msg = new Message();
msg.what = 2;
handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
Message msg = new Message();
msg.what = 3;
handler.sendMessage(msg);
}
}
}).start();
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
scheduler.shutdown();
client.disconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}

Android Q 接入 MQTT的更多相关文章

  1. Android 支付宝接入时常见的问题

    1.概述 首先说明下,Android支付宝接入用的是快捷支付,下载地址是https://b.alipay.com/order/techService.htm    支付宝移动接入地址https://b ...

  2. 【Android Studio安装部署系列】三十七、从Android Studio3.2升级到Android Studio3.4【以及创建Android Q模拟器】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 保持Android Studio开发环境的最新版本. 下载Android Studio3.4 使用Android Studio自带的 ...

  3. 谷歌的Android Q到底有哪些新特性及变更?

    Android Q 隐私更改相关介绍 存储范围变更 Android Q 改变了应用程序访问设备外部存储上文件的方式. 通过使用更细粒度的媒体特定权限替换以前的 READ_EXTERNAL_STORAG ...

  4. Android Q 变更和新特性

    安全和隐私变更 隐私保护是Android Q重要的主题之一,Android Q带来了一系列增强用户隐私保护的变更. 1 应用文件存储空间限制 应用访问限制是Android Q影响最大变更之一.在And ...

  5. android Q build 变化

    一 概述 android Q build变化整体上越来越严格,语法上之前能够使用的Q上将不能使用. 二 主要变化 2.1  'USER' 弃用 ‘USER’后面的值会被设置成‘nobody',andr ...

  6. 让最新的 Android Q Beta 3 强制重启的 Project Mainline,到底是什么?

    一. 序 最新的 Android 版本 Q,已经发布了 Android Q Beta 3,虽然没有正式发布,但是不少用户已经加入了测试计划,抢先体验 Android Q 的新功能. 近期不少体验用户反 ...

  7. Android Q 兼容那些事

    文章微信公众号「AndroidTraveler」首发 5 月 20 号参加了 Android Q Labs,因此本篇说一说会议的部分内容以及自己的一些想法. 会议主要是加深开发者对 Android Q ...

  8. Android Q 正式命名为 Android 10

    根据官方博文,谷歌已经公布了 Android Q 的名称,它并不是想以前一样,以甜食命名,也不是以任何以字母 Q 开头来命名,而是简单称它为 Android 10. 该公司表示,它正在改变其发布版本的 ...

  9. Android Q Beta 6 终极测试版发布!

    前言 当今手机市场可谓是百花齐放,但手机系统却屈指可数,其中Android和iOS就占据了整个手机系统市场的99%,单单Android就占据了整个手机系统市场的86%,可谓是占据绝对优势.     其 ...

随机推荐

  1. 传智播客C++视频学习笔记(1)

    下载Visual Studio Community版本, #include<iostream> using namespace std; int main() { cout << ...

  2. C++实现一个简单的双栈队列

    双栈队列的原理是用两个栈结构模拟一个队列, 一个栈A模拟队尾, 入队的元素全部压入此栈, 另一个栈B模拟队首, 出队时将栈A的元素弹入栈B, 将栈B的栈顶元素弹出 此结构类似汉诺塔, 非常经典, 这里 ...

  3. SSH-Secure-Shell 3.2.9 build283版本,创建直接打开文件传输的快捷方式的方法

    2019-12-31 16:21:23 版本信息: 在安装目录下新建快捷方式 目标填写:"D:\SSH-Secure-Shell\SshClient.exe" /f 图标选择,系统 ...

  4. 题解 Luogu P3370

    讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ...

  5. 使用JAVA导出EXCEL表格(POI)

    一.POI概述 Jakarta POI 是一套用于访问微软格式文档的Java API.POI提供API给Java程序对Microsoft Office格式档案读和写的功能.在许多企业办公系统中,经常会 ...

  6. Java Web Servlet知识点讲解(一)

    一.Web应用架构 如图所示: HTTP协议:一个简单的请求一响应协议,通常运行在TCP之上,它指定了客户端可能发送给服务器什么样的信息以及得到什么样的响应. JDBC:Java语言中用来规范客户端程 ...

  7. ORACLE10G非归档模式下RMAN异机迁库

    环境信息: 源库 目标库 操作系统 WIN7 WIN SVR 2012 R2 IP x.x.x.216 x.x.x.112 数据库版本 10.2.0.4.0 - 64bi 10.2.0.4.0 - 6 ...

  8. Windos framework .net 3.5规则失败

    1. 安装的时候有一个.net警告,这里给后边造成了一个隐患,实际上是wondows少了一个framework .net的插件,跟SQLserver安装本身没关系,一开始忽略了,后边就报错了. 2.点 ...

  9. 剑指offer-面试题57_1-和为s的两个数字-双指针

    /* 题目: 输入一个递增数组和一个s,求和等于s的两个数组中的数字. */ /* 思路: 双指针问题. */ #include<iostream> #include<cstring ...

  10. 【笔记】机器学习 - 李宏毅 - 13 - Why Deep

    当参数一样多的时候,神经网络变得更高比变宽更有效果.为什么会这样呢? 其实和软件行业的模块化思想是一致的. 比如,如果直接对这四种分类进行训练,长发的男孩数据较少,那么这一类训练得到的classifi ...