makcar/app/src/main/java/com/aros/apron/tools/MqttManager.java

139 lines
5.5 KiB
Java
Raw Normal View History

2026-01-30 11:47:32 +08:00
package com.aros.apron.tools;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
2026-05-20 10:15:41 +08:00
import android.net.Network;
import android.net.NetworkCapabilities;
2026-01-30 11:47:32 +08:00
import android.net.NetworkInfo;
2026-05-20 10:15:41 +08:00
import android.os.Build;
2026-01-30 11:47:32 +08:00
import android.os.Handler;
2026-05-20 10:15:41 +08:00
import android.os.Looper;
2026-01-30 11:47:32 +08:00
import com.aros.apron.app.ApronApp;
import com.aros.apron.callback.MqttActionCallBack;
import com.aros.apron.callback.MqttCallBack;
import com.aros.apron.constant.AMSConfig;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import java.util.Random;
public class MqttManager {
public MqttAndroidClient mqttAndroidClient; //ltz change
public MqttConnectOptions mMqttConnectOptions;
String TAG = getClass().getSimpleName();
private MqttManager() {
}
private static class MqttHolder {
private static final MqttManager INSTANCE = new MqttManager();
}
public static MqttManager getInstance() {
return MqttHolder.INSTANCE;
}
public void needConnect() {
initMqttClientParams();
}
private void initMqttClientParams() {
mqttAndroidClient = new MqttAndroidClient(ApronApp.Companion.getApplication(), AMSConfig.getInstance().getMqttServerUri(), generateRandomString(10));
mMqttConnectOptions = new MqttConnectOptions();
2026-06-18 15:04:36 +08:00
mMqttConnectOptions.setAutomaticReconnect(true);
mMqttConnectOptions.setMaxInflight(1000);// 避免消息积压导致连接拥塞
2026-01-30 11:47:32 +08:00
mMqttConnectOptions.setCleanSession(true); //设置是否清除缓存
mMqttConnectOptions.setConnectionTimeout(30); //设置超时时间,单位:秒 ltz denote
mMqttConnectOptions.setKeepAliveInterval(20); //设置心跳包发送间隔,单位:秒 ltz denote
mMqttConnectOptions.setUserName(AMSConfig.getInstance().getUserName()); //设置用户名
mMqttConnectOptions.setPassword(AMSConfig.getInstance().getPassword().toCharArray()); //设置密码
mqttAndroidClient.setCallback(new MqttCallBack()); //设置监听订阅消息的回调
doClientConnection();
}
private void doClientConnection() {
2026-05-20 10:15:41 +08:00
if (mqttAndroidClient.isConnected()) {
return;
}
// 先检查网络状态(仅用于日志和延迟策略,不阻塞连接尝试)
boolean networkAvailable = isConnectIsNomarl();
if (networkAvailable) {
tryConnect();
} else {
// 网络检查未通过时,仍尝试连接(防止网络误判导致永久断连)
LogUtil.log(TAG, "网络检查未通过,但仍尝试连接");
tryConnect();
2026-01-30 11:47:32 +08:00
}
2026-05-20 10:15:41 +08:00
}
2026-01-30 11:47:32 +08:00
2026-05-20 10:15:41 +08:00
private void tryConnect() {
if (mqttAndroidClient.isConnected()) {
return;
}
try {
mqttAndroidClient.connect(mMqttConnectOptions, null, new MqttActionCallBack(mqttAndroidClient, mMqttConnectOptions));
} catch (MqttException e) {
LogUtil.log(TAG, "mqtt连接异常:" + e.toString());
e.printStackTrace();
}
2026-01-30 11:47:32 +08:00
}
2026-06-06 20:09:36 +08:00
2026-01-30 11:47:32 +08:00
private boolean isConnectIsNomarl() {
ConnectivityManager connectivityManager = (ConnectivityManager) ApronApp.Companion.getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
2026-05-20 10:15:41 +08:00
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Network network = connectivityManager.getActiveNetwork();
if (network != null) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
if (capabilities != null) {
String transportInfo;
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
transportInfo = "ETHERNET";
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
transportInfo = "WIFI";
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
transportInfo = "CELLULAR";
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
transportInfo = "VPN";
} else {
transportInfo = "OTHER";
}
LogUtil.log(TAG, "当前网络可用:" + transportInfo);
return true;
}
}
LogUtil.log(TAG, "没有可用Mqtt网络API 23+");
2026-01-30 11:47:32 +08:00
return false;
2026-05-20 10:15:41 +08:00
} else {
@SuppressLint("MissingPermission") NetworkInfo info = connectivityManager.getActiveNetworkInfo();
if (info != null && info.isAvailable()) {
String name = info.getTypeName();
LogUtil.log(TAG, "当前网络名称:" + name);
return true;
} else {
LogUtil.log(TAG, "没有可用Mqtt网络");
return false;
}
2026-01-30 11:47:32 +08:00
}
}
private String generateRandomString(int length) {
String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
StringBuilder builder = new StringBuilder();
Random random = new Random();
for (int i = 0; i < length; i++) {
int index = random.nextInt(characters.length());
builder.append(characters.charAt(index));
}
return builder.toString();
}
}