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

139 lines
5.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.aros.apron.tools;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
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();
mMqttConnectOptions.setAutomaticReconnect(true);
mMqttConnectOptions.setMaxInflight(1000);// 避免消息积压导致连接拥塞
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() {
if (mqttAndroidClient.isConnected()) {
return;
}
// 先检查网络状态(仅用于日志和延迟策略,不阻塞连接尝试)
boolean networkAvailable = isConnectIsNomarl();
if (networkAvailable) {
tryConnect();
} else {
// 网络检查未通过时,仍尝试连接(防止网络误判导致永久断连)
LogUtil.log(TAG, "网络检查未通过,但仍尝试连接");
tryConnect();
}
}
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();
}
}
private boolean isConnectIsNomarl() {
ConnectivityManager connectivityManager = (ConnectivityManager) ApronApp.Companion.getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
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+");
return false;
} 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;
}
}
}
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();
}
}