Android MQTT 编码实战
1、Settting
- 在项目级 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'
- 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......
-
ip
:MQTT 服务端 IP -
port
:MQTT 服务端端口 -
CLIENT_ID
:这里不使用 clientid 认证,所以定义成一个空字符串常量 -
username
:采用 username 认证,账户的用户名 -
password
:采用 username 认证,账户的密码 -
publishTopic
:发布消息的主题 -
subscribeTopic
:订阅消息的主题
java
private MqttAsyncClient mqttAsyncClient;
private MqttConnectionOptions mqttConnectionOptions;
-
mqttAsyncClient:MQTT 客户端实例
-
mqttConnectionOptions:MQTT 连接配置实例
(2)MQTT 客户端创建
java
mqttAsyncClient = new MqttAsyncClient("tcp://" + ip + ":" + port, CLIENT_ID, new MemoryPersistence());
- 创建一个 MqttAsyncClient 的实例,用于与 MQTT 服务器进行异步通信
-
"tcp://" + ip + ":" + port
:构造 MQTT 服务器的 URI -
CLIENT_ID
:这里不使用 clientid 认证 -
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) {
}
});
-
disconnected(MqttDisconnectResponse disconnectResponse)
:当 MQTT 客户端与 MQTT 服务器断开连接时,此方法会被调用 -
mqttErrorOccurred(MqttException exception)
:当 MQTT 客户端遇到任何异常时,此方法会被调用,异常可以是网络问题、协议错误或任何其他 MQTT 操作失败 -
messageArrived(String topic, MqttMessage message) throws Exception
:当 MQTT 客户端接收到来自 MQTT 服务器的消息时,此方法会被调用 -
deliveryComplete(IMqttToken token)
:当一个消息发布操作完成(无论成功还是失败)时,此方法会被调用 -
connectComplete(boolean reconnect, String serverURI)
:当 MQTT 客户端成功连接到 MQTT 服务器时,此方法会被调用 -
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());
-
setCleanStart(true);
:设置是否清除缓存 -
setConnectionTimeout(15);
:设置连接超时时间,单位为秒 -
setKeepAliveInterval(60);
:设置心跳包发送间隔,单位为秒,心跳包是客户端定期发送给服务器的消息 -
setUserName(username);
:设置用户名 -
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) {
}
});
-
onSuccess(IMqttToken asyncActionToken)
:尝试建立连接成功时,此方法会被调用 -
onFailure(IMqttToken asyncActionToken, Throwable exception)
:尝试建立连接失败时,此方法会被调用
(6)MQTT 客户端主题
- 订阅主题
java
mqttAsyncClient.subscribe(subscribeTopic, 0);
- 取消订阅主题
java
mqttAsyncClient.unsubscribe(subscribeTopic);
(7)MQTT 客户端发布主题
java
MqttMessage mqttMessage = new MqttMessage(str.getBytes());
mqttAsyncClient.publish(publishTopic, mqttMessage);
(8)MQTT 客户端断开连接
- 断开连接前,最好先取消订阅主题
java
// 取消订阅主题
unSubscribe();
mqttAsyncClient.disconnect();