MQTT - Android MQTT 编码实战(MQTT 客户端创建、MQTT 客户端事件、MQTT 客户端连接配置、MQTT 客户端主题)

Android MQTT 编码实战

1、Settting
  1. 在项目级 build.gradle 目录下导入 MQTT 客户端依赖
groovy 复制代码
implementation 'org.eclipse.paho:org.eclipse.paho.mqttv5.client:1.2.5'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
  1. AndroidManifest.xml,添加相关权限,这些权限也需要在 Java 代码中动态申请
xml 复制代码
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2、Java Code
(1)变量定义
java 复制代码
private String ip;
private int port;
private static final String CLIENT_ID = "";
private String username;
private String password;
private String publishTopic;
private String subscribeTopic;

getter, setter......
  1. ip:MQTT 服务端 IP

  2. port:MQTT 服务端端口

  3. CLIENT_ID:这里不使用 clientid 认证,所以定义成一个空字符串常量

  4. username:采用 username 认证,账户的用户名

  5. password:采用 username 认证,账户的密码

  6. publishTopic:发布消息的主题

  7. subscribeTopic:订阅消息的主题

java 复制代码
private MqttAsyncClient mqttAsyncClient;
private MqttConnectionOptions mqttConnectionOptions;
  1. mqttAsyncClient:MQTT 客户端实例

  2. mqttConnectionOptions:MQTT 连接配置实例

(2)MQTT 客户端创建
java 复制代码
mqttAsyncClient = new MqttAsyncClient("tcp://" + ip + ":" + port, CLIENT_ID, new MemoryPersistence());
  • 创建一个 MqttAsyncClient 的实例,用于与 MQTT 服务器进行异步通信
  1. "tcp://" + ip + ":" + port:构造 MQTT 服务器的 URI

  2. CLIENT_ID:这里不使用 clientid 认证

  3. new MemoryPersistence():指定客户端的持久化存储方式,MemoryPersistence 是 MQTT 客户端提供的一种内存中的持久化方式

(3)MQTT 客户端事件回调
java 复制代码
mqttAsyncClient.setCallback(new MqttCallback() {
    @Override
    public void disconnected(MqttDisconnectResponse disconnectResponse) {
        
    }

    @Override
    public void mqttErrorOccurred(MqttException exception) {

    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        byte[] payload = message.getPayload();
        if (payload == null) return;
        String s = new String(payload);
        Log.i(TAG, "收到 ------------------------------ " + s);
    }

    @Override
    public void deliveryComplete(IMqttToken token) {

    }

    @Override
    public void connectComplete(boolean reconnect, String serverURI) {

    }

    @Override
    public void authPacketArrived(int reasonCode, MqttProperties properties) {

    }
});
  1. disconnected(MqttDisconnectResponse disconnectResponse):当 MQTT 客户端与 MQTT 服务器断开连接时,此方法会被调用

  2. mqttErrorOccurred(MqttException exception):当 MQTT 客户端遇到任何异常时,此方法会被调用,异常可以是网络问题、协议错误或任何其他 MQTT 操作失败

  3. messageArrived(String topic, MqttMessage message) throws Exception:当 MQTT 客户端接收到来自 MQTT 服务器的消息时,此方法会被调用

  4. deliveryComplete(IMqttToken token):当一个消息发布操作完成(无论成功还是失败)时,此方法会被调用

  5. connectComplete(boolean reconnect, String serverURI):当 MQTT 客户端成功连接到 MQTT 服务器时,此方法会被调用

  6. authPacketArrived(int reasonCode, MqttProperties properties):这个方法在接收到认证数据包时被调用

  • 重点关注 disconnected、messageArrived 方法即可,其他方法可以忽略
(4)MQTT 客户端连接配置
java 复制代码
mqttConnectionOptions = new MqttConnectionOptions();

mqttConnectionOptions.setCleanStart(true);
mqttConnectionOptions.setConnectionTimeout(15);
mqttConnectionOptions.setKeepAliveInterval(60);
mqttConnectionOptions.setUserName(username);
mqttConnectionOptions.setPassword(password.getBytes());
  1. setCleanStart(true);:设置是否清除缓存

  2. setConnectionTimeout(15);:设置连接超时时间,单位为秒

  3. setKeepAliveInterval(60);:设置心跳包发送间隔,单位为秒,心跳包是客户端定期发送给服务器的消息

  4. setUserName(username);:设置用户名

  5. setPassword(password.getBytes());:设置密码

(5)MQTT 客户端连接
java 复制代码
mqttAsyncClient.connect(mqttConnectionOptions, null, new MqttActionListener() {
    @Override
    public void onSuccess(IMqttToken asyncActionToken) {

    }

    @Override
    public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

    }
});
  1. onSuccess(IMqttToken asyncActionToken):尝试建立连接成功时,此方法会被调用

  2. onFailure(IMqttToken asyncActionToken, Throwable exception):尝试建立连接失败时,此方法会被调用

(6)MQTT 客户端主题
  1. 订阅主题
java 复制代码
mqttAsyncClient.subscribe(subscribeTopic, 0);
  1. 取消订阅主题
java 复制代码
mqttAsyncClient.unsubscribe(subscribeTopic);
(7)MQTT 客户端发布主题
java 复制代码
MqttMessage mqttMessage = new MqttMessage(str.getBytes());

mqttAsyncClient.publish(publishTopic, mqttMessage);
(8)MQTT 客户端断开连接
  • 断开连接前,最好先取消订阅主题
java 复制代码
// 取消订阅主题
unSubscribe();

mqttAsyncClient.disconnect();
相关推荐
郑州光合科技余经理1 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
萧瑟余晖1 小时前
Java深入解析篇三十三之密封类与接口(Sealed Classes)详解
java·开发语言
论迹复利5 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin5 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
宸津-代码粉碎机6 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749107 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh7 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
源码宝8 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his
yychen_java8 小时前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构
lhldsg9 小时前
智慧场馆解决方案小程序开发实战:从架构设计到部署指南
java·小程序·uni-app