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

我用的版本是Android Studio Bumblebee | 2021.1.1 Patch 1,所以接下来记录的方法比较适用于解决新版本遇到的问题

本文实现MQTT客户端的方法比较初级,后续在能保证基本功能实现的情况下可以使用继承Service类的方法实现MQTT服务

0. 配置MQTT服务器

如果还没有mqtt服务器的同学,可以去一些知名的物联网云平台弄,也可以跟我一样参考以下文章搭建自己的mqtt服务器(基于mosquitto)
和我一起构建私有物联网云平台

1. Android中使用MQTT

Android中使用MQTT需要使用到Paho Android Service库,Paho Android Service是一个用Java编写的MQTT客户端库。
GitHub地址:https://github.com/eclipse/paho.mqtt.android

1.1 集成

在我找的一些博文中会在module的build.gradle文件中添加依赖,但新版本Android Studio的话添加依赖的方法会有区别:

  1. 首先在项目主目录的settings.gradle添加
repositories {maven {url "https://repo.eclipse.org/content/repositories/paho-snapshots/"}
}

settings.gradle:

pluginManagement {repositories {gradlePluginPortal()google()mavenCentral()maven {url "https://repo.eclipse.org/content/repositories/paho-releases/"}}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()maven {url "https://repo.eclipse.org/content/repositories/paho-releases/"}}
}
rootProject.name = "mqtt_example"
include ':app'
  1. 接着在app目录下的build.gradle添加
dependencies {implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}
  1. 在AndroidManifest.xml添加限权
<!-- Permissions the Application Requires -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
  1. 在AndroidManifest.xml注册Service
<!-- Mqtt Service -->
<service android:name="org.eclipse.paho.android.service.MqttService">
</service>

注意,androidx在依赖第三方库时,第三方库自身使用v4库,会引起程序崩溃,而androidx项目接入mqtt时,引入了依赖库

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

这是由于第三方库引入的v4库没有转化为androidx导致。
此时在程序根目录的gradle.propertites文件启用一下代码,可以正常运行程序

android.enableJetifier=true

1.2 MQTT客户端实现

实现方法比较简单,直接在MainActivity上建立MqttClient,按一下按钮发送信息

package com.example.mqtt_example;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;public class MainActivity extends AppCompatActivity {private final String TAG = "AiotMqtt";final private String PUB_TOPIC = "pubtopic"; //发送主题final private String SUB_TOPIC = "substopic";  //订阅主题/* 阿里云Mqtt服务器域名 */final String host = "tcp://xxx.xxx.xxx.xxx:xxxxx";   //服务器地址(协议+地址+端口号)private String clientId = "AndroidTest";   //客户端IDprivate String userName = "xxxxxx";   //用户名private String passWord = "xxxxx";  //密码MqttAndroidClient mqttAndroidClient;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/* 创建MqttConnectOptions对象并配置username和password */MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();mqttConnectOptions.setUserName(userName);mqttConnectOptions.setPassword(passWord.toCharArray());/* 创建MqttAndroidClient对象, 并设置回调接口 */mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), host, clientId);mqttAndroidClient.setCallback(new MqttCallback() {@Overridepublic void connectionLost(Throwable cause) {Log.i(TAG, "connection lost");}@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {Log.i(TAG, "topic: " + topic + ", msg: " + new String(message.getPayload()));}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {Log.i(TAG, "msg delivered");}});/* Mqtt建连 */try {mqttAndroidClient.connect(mqttConnectOptions,null, new IMqttActionListener() {@Overridepublic void onSuccess(IMqttToken asyncActionToken) {Log.i(TAG, "connect succeed");subscribeTopic(SUB_TOPIC);}@Overridepublic void onFailure(IMqttToken asyncActionToken, Throwable exception) {Log.i(TAG, "connect failed");}});} catch (MqttException e) {e.printStackTrace();}/* 通过按键发布消息 */Button pubButton = findViewById(R.id.publish);pubButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {publishMessage("hello IoT");}});}/*** 订阅特定的主题* @param topic mqtt主题*/public void subscribeTopic(String topic) {try {mqttAndroidClient.subscribe(topic, 0, null, new IMqttActionListener() {@Overridepublic void onSuccess(IMqttToken asyncActionToken) {Log.i(TAG, "subscribed succeed");}@Overridepublic void onFailure(IMqttToken asyncActionToken, Throwable exception) {Log.i(TAG, "subscribed failed");}});} catch (MqttException e) {e.printStackTrace();}}/*** 向默认的主题/user/update发布消息* @param payload 消息载荷*/public void publishMessage(String payload) {try {if (mqttAndroidClient.isConnected() == false) {mqttAndroidClient.connect();}MqttMessage message = new MqttMessage();message.setPayload(payload.getBytes());message.setQos(0);mqttAndroidClient.publish(PUB_TOPIC, message,null, new IMqttActionListener() {@Overridepublic void onSuccess(IMqttToken asyncActionToken) {Log.i(TAG, "publish succeed!");}@Overridepublic void onFailure(IMqttToken asyncActionToken, Throwable exception) {Log.i(TAG, "publish failed!");}});} catch (MqttException e) {Log.e(TAG, e.toString());e.printStackTrace();}}
}

2.实现效果


Android Studio实现MQTT客户端相关推荐

  1. Android使用的MQTT客户端

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

  2. 【Android Studio安装部署系列】十九、Android studio使用SVN

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在AndroidStudio中开发版本控制,除了Git就是SVN,和Eclipse不同,Android Studio没有提供单独的插 ...

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

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

  4. android studio中使用AIDL进行客户端与服务端互相通信

    前言 在AIDL实现IPC通信,调用远程服务端的方法.但是,远程服务端并不能主动给客户端返回信息.在很多情况下是需要远程服务端主动给客户端返回数据,客户端只需要进行监听即可,这是典型的观察者模式.这篇 ...

  5. 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(七)基于CrossApp跨平台框架的MQTT客户端控制应用android版

    本文在前一篇基础上,详细介绍以CrossApp跨平台框架为基础,利用mosquito库和easySQLite库设计实现了基于MQTT协议的android版步进电机控制客户端. 一.开发环境的准备 编译 ...

  6. Android实现MQTT客户端

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

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

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

  8. [源码和文档分享]基于Android Studio实现的论坛网站Android客户端和JAVA EE后台

    第一章 概述 1.1 开发环境 本安卓程序在Windows 10系统下使用Android Studio开发,后台使用MyEclipse开发,测试环境为安卓系统5.1.4.4.4.3.5.0,屏幕尺寸5 ...

  9. android studio编写阿里云物联网APP的基本步骤(附CSDN视频教程链接)

    摘要:本文介绍一下物联网APP的制作基本步骤,并附CSDN视频课链接,可以在短时间内制作出属于自己的APP.其实制作物联网APP的步骤其实并不复杂,但是有一个思路要大家转变:物联网APP的核心是通过h ...

最新文章

  1. python 加密和解密
  2. ITK:两个图像的平方差
  3. git 创建 本地 裸 仓库
  4. 十分钟上线 - 函数计算构建支付宝小程序的后端
  5. function 多个函数用一个_用递归函数和栈逆序一个栈
  6. 消息称字节跳动将推迟IPO 官方回应:尚无上市计划
  7. android学习十三(android的通知使用)
  8. 为何 iOS 越来越偏爱 Swift?
  9. Spelling, Edit Distance, and Noisy Channels 拼写、编辑距离和噪声通道
  10. java poi导出excel模板_Java poi实现导出excel,添加数据有效性,生成模板
  11. Java对图片Base64转码--HTML对Base64解码
  12. Multisim14 - 运行10版本文件时数码管一直显示为0的问题
  13. 设计一个巴特沃斯低通滤波器
  14. Authentication—身份验证流程
  15. 网络广告创意的特点及产生的方法
  16. java生成一年中假日表(包括周末和法定假期),用于计算一年中的工作日
  17. 计算机中电容状态表示什么,电容上面是字母代表什么
  18. 计算机科学 基础课程
  19. qq/微信联合登录整体流程图!
  20. AI人工智能外呼机器人

热门文章

  1. compare排序原理
  2. 计算机进制bcd啥意思,怎样理解二进制和十六进制及BCD码 | 北岛夜话
  3. java 文字互换_Java简繁体中文互换
  4. 回头看看,是否会有更好的人与物……
  5. 【HDU 1870 --- 愚人节的礼物】栈水题
  6. 2007世界程序语言排名
  7. Hololens开发之实时音视频通讯--02初始化项目+添加必要碰撞组件
  8. JSE7-反射和注解
  9. 低于4G内存安装 Jumpserver
  10. 121584-52-9,6-[(3R,4R)-3-(Acetyloxy)-N,4-dimethyl-6-oxo-L-norleucine] Cyclosporin A,环孢菌素A