Android Q 接入 MQTT
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的更多相关文章
- Android 支付宝接入时常见的问题
1.概述 首先说明下,Android支付宝接入用的是快捷支付,下载地址是https://b.alipay.com/order/techService.htm 支付宝移动接入地址https://b ...
- 【Android Studio安装部署系列】三十七、从Android Studio3.2升级到Android Studio3.4【以及创建Android Q模拟器】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 保持Android Studio开发环境的最新版本. 下载Android Studio3.4 使用Android Studio自带的 ...
- 谷歌的Android Q到底有哪些新特性及变更?
Android Q 隐私更改相关介绍 存储范围变更 Android Q 改变了应用程序访问设备外部存储上文件的方式. 通过使用更细粒度的媒体特定权限替换以前的 READ_EXTERNAL_STORAG ...
- Android Q 变更和新特性
安全和隐私变更 隐私保护是Android Q重要的主题之一,Android Q带来了一系列增强用户隐私保护的变更. 1 应用文件存储空间限制 应用访问限制是Android Q影响最大变更之一.在And ...
- android Q build 变化
一 概述 android Q build变化整体上越来越严格,语法上之前能够使用的Q上将不能使用. 二 主要变化 2.1 'USER' 弃用 ‘USER’后面的值会被设置成‘nobody',andr ...
- 让最新的 Android Q Beta 3 强制重启的 Project Mainline,到底是什么?
一. 序 最新的 Android 版本 Q,已经发布了 Android Q Beta 3,虽然没有正式发布,但是不少用户已经加入了测试计划,抢先体验 Android Q 的新功能. 近期不少体验用户反 ...
- Android Q 兼容那些事
文章微信公众号「AndroidTraveler」首发 5 月 20 号参加了 Android Q Labs,因此本篇说一说会议的部分内容以及自己的一些想法. 会议主要是加深开发者对 Android Q ...
- Android Q 正式命名为 Android 10
根据官方博文,谷歌已经公布了 Android Q 的名称,它并不是想以前一样,以甜食命名,也不是以任何以字母 Q 开头来命名,而是简单称它为 Android 10. 该公司表示,它正在改变其发布版本的 ...
- Android Q Beta 6 终极测试版发布!
前言 当今手机市场可谓是百花齐放,但手机系统却屈指可数,其中Android和iOS就占据了整个手机系统市场的99%,单单Android就占据了整个手机系统市场的86%,可谓是占据绝对优势. 其 ...
随机推荐
- Java实体对象为什么要实现Serializable接口?
前言 Java实体对象为什么一定要实现Serializable接口呢?在学JavaSE的时候有些实体对象不实现Serializable不是也没什么影响吗? 最近在学习mybatis的时候发现,老师写的 ...
- python基础扩展
一.垃圾回收机制 垃圾回收机制是自动帮助我们管理内存,清理垃圾的一种工具 1.引用计数 当一个对象的引用被创建或者复制时,对象的引用计数加1: 当一个对象的引用被销毁时,对象的引用计数减1: 当对象的 ...
- [CF1311A] Add Odd or Subtract Even
Solution a<b, delta=odd, ans=1 a<b, delta=even, ans=2 a=b ans=0 a>b, delta=odd, ans=2 a> ...
- 关于javascript中的内置函数
(1) parseInt()函数 语法:parseInt(string,[n]) 该函数主要将首位为数字的字符串转化为数字,若该字符串不是以数字开头,则返回NaN; n是用于指出字符串中的数据是几 ...
- 制作MySQL RPM安装包Spec
适用环境: 数据库版本:MySQL 操作系统:CentOS 7 制作思路: 将数据库初始化和配置工作放到安装脚本中方便定制: 1.打包MySQL应用目录 2.不自动生成配置文件 3.不自动生成数据目录 ...
- 【58】目标检测之YOLO 算法
YOLO 算法(Putting it together: YOLO algorithm) 你们已经学到对象检测算法的大部分组件了,在这个笔记里,我们会把所有组件组装在一起构成YOLO对象检测算法. ...
- 安卓自定义View实例-----跟随手指移动的鸟
今天学习了一些安卓开发中的自定义布局,编写了简单一个实例,“跟随手指移动的鸟”,需要两张图片,背景图片和鸟的图片,鸟的图片可以在屏幕中跟随手指的移动而移动. 1.将两张图片导入到mipmap中: 2. ...
- QPixmap和QImage
1.QPixmap QPixmap的设计本来就是用来加速显示,用paint绘图时用QPixmap会比其他类的效果好很多.一般小图片用QPixmap. 2.QImage 依赖软件,直接像素访问,适合大图 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hive安装
实验目的 了解hive的原理和安装方式 学习使用MySQL数据库 使用hive进行基本操作 实验原理 1.Hive Hive是一个数据仓库技术,包括解释器.编译器.优化器,一次将一个sql语句装化为m ...
- Python3中的支持向量机SVM的使用(有实例)
https://www.cnblogs.com/luyaoblog/p/6775342.html 首先,我们需要安装scikit-learn 一.导入sklearn算法包 在python中导入sci ...