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%,可谓是占据绝对优势. 其 ...
随机推荐
- C# 多线程的阻塞和继续-ManaulResetEvent的使用
在工作中,会遇到需要多线程处理相应的业务需求,最典型的包括Socket的通信. 多线程处理里,就会考虑到,哪个线程先运行,哪个线程后运行的情况. 这里我介绍一下,使用ManualResetEvent类 ...
- 微信小程序组件构建UI界面小练手 —— 表单登录注册微信小程序
通过微信小程序中丰富的表单组件来完成登录界面.手机快速注册界面.企业用户注册界面的微信小程序设计. 将会用到view视图容器组件.button按钮组件.image图片组件.input输入框组件.che ...
- 如何在IDEA的maven项目中连接并使用MySQL8.0
首先看一下我的基本的开发环境: 操作系统:MacOS 10.13.5 编辑器:IDEA 2018.3 其他:MySQL8.0.15.Maven 3.3.9.JDK 1.8 好,下面就正式开始: 第一步 ...
- redis 5.0.7 源码阅读——跳跃表skiplist
redis中并没有专门给跳跃表两个文件.在5.0.7的版本中,结构体的声明与定义.接口的声明在server.h中,接口的定义在t_zset.c中,所有开头为zsl的函数. 一.数据结构 单个节点: t ...
- Gartner评估:众包将掀起IT服务市场的革命
国际IT顾问与咨询公司Gartner发布评估报告,称众包是中国的一种新兴业务模式,将掀起IT服务市场的革命.然而,只有很少的的服务提供商会构建众包平台来尝试使用该业务模式.IT服务提供商的业务部门负责 ...
- Git命令行操作方法
1.GitHub上创建一个Repositories(仓库),并复制仓库地址
- 简单说说常用的css选择器
这里先来一段HTML代码 <div id="div" class="div"> <p class="div_P1"> ...
- 9.16java总结
枚举 EnunTest.java 运行结果 falsefalsetrueSMALLMEDIUMLARGE 枚举类型可以直接用==来判断是否相等,即代表数据串,又有数的属性.是引用类型. 浮点数计算 ...
- Qt的QString,QByteArray,char *相互转换
1.QString转换为QByteArray QString str = "; QByteArray byte = str.toUtf8(); // 转换为Utf8格式 byte.toLoc ...
- sqlserver2014部署安装
百度云网址链接: https://pan.baidu.com/s/1BwgdnESI8Fqlos9EIOLv1A 提取码: wsy5 1.解压ISO镜像文件,点击setup安装程序 2.进入安装界面 ...