背景:大腦端突然報mqtt多次鏈接,不知道啥原因
報錯資訊:
E/MQTTManager: 連接斷開:已斷開連接 斷開原因: java.net.SocketException: Connection reset
E/MQTTManager: 連接斷開:已斷開連接 斷開原因: java.net.SocketException: Broken pipe
E/MQTTManager: 連接斷開:已斷開連接 斷開原因: java.io.EOFException
解決:
增加重連保護機制,最多連7次
惡補下:
Message Queuing Telemetry(遙測:遠程測量) Transport(傳輸協議),基于發布/訂閱(publish/subscribe)模式的"輕量級"通訊協議,為連接遠程設備提供實時可靠的訊息服務
MQTT協議中定義了一些方法(也被稱為動作),來于表示對確定資源所進行操作,這個資源可以代表預先存在的資料或動態生成資料,這取決于服務器的實作,通常來說,資源指服務器上的檔案或輸出,主要方法有:
(1)Connect,等待與服務器建立連接,
(2)Disconnect,等待MQTT客戶端完成所做的作業,并與服務器斷開TCP/IP會話,
(3)Subscribe,等待完成訂閱,
(4)UnSubscribe,等待服務器取消客戶端的一個或多個topics訂閱,
(5)Publish,MQTT客戶端發送訊息請求,發送完成后回傳應用程式執行緒,
application中監聽了所有activity的生命周期,在第一個activity啟動時呼叫mqtt
registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
int activityAount = 0;
ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NotNull Activity activity, Bundle savedInstanceState) {
activityList.add(activity);
ALog.d( "onActivityCreated",activity.getClass().getSimpleName(),activityList.size());
Log.e("wy", "onActivityCreated activity.getClass().getSimpleName: "+activity.getClass().getSimpleName()+" activityList.size: " +activityList.size());
/*if (activityList.size() == 0) {
ALog.d( "startService");
Intent intent = new Intent(instance, WebSocketService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent);
} else {
ServiceUtils.startService(WebSocketService.class);
}
}*/
}
@Override
public void onActivityStarted(Activity activity) {
ALog.d( "onActivityStarted: "+activity.getClass().getSimpleName());
Log.e("wy", "onActivityStarted activity.getClass().getSimpleName: "+activity.getClass().getSimpleName()+" activityList.size: " +activityList.size());
if (activityAount == 0) {
//app回到前臺
if (!debug) {
if (mqttManager == null) {
mqttManager = MQTTManager.getInstance(instance);
mqttManager.setMqConnectLisense(new MQTTManager.MqConnectLisense() {
@Override
public void onSuccess() {
Log.e("wy", "onSuccess: " );
mqttManager.publish("{\"domain\":\"video_chat\",\"command\":\"start\"}");
}
@Override
public void onFailure(Throwable t) {
ALog.i("連接失敗",t);
activity.runOnUiThread(() -> {
Toast.makeText(activity, t.toString(), Toast.LENGTH_LONG).show();
});
}
});
} else {
Log.e("wy", "170onSuccess: " );
mqttManager.publish("{\"domain\":\"video_chat\",\"command\":\"start\"}");
}
}
ALog.d( "app啟動或回到前臺");
}
activityAount++;
}
}
在MQTTManager中
初始化
HOST = "tcp://" + getIp() + ":1883";
Log.d(TAG, "HOST = " + HOST);
String serverURI = HOST; //服務器地址(協議+地址+埠號)
mqttAndroidClient = new MqttAndroidClient(mContext, serverURI, CLIENTID);
mqttAndroidClient.setCallback(mqttCallback); //設定監聽訂閱訊息的回呼
mMqttConnectOptions = new MqttConnectOptions();
mMqttConnectOptions.setCleanSession(false); //設定是否清除快取
mMqttConnectOptions.setConnectionTimeout(10); //設定超時時間,單位:秒
mMqttConnectOptions.setKeepAliveInterval(20); //設定心跳包發送間隔,單位:秒
mMqttConnectOptions.setUserName(USERNAME); //設定用戶名
mMqttConnectOptions.setPassword(PASSWORD.toCharArray()); //設定密碼
int connectNum=0;
//訂閱主題的回呼
private MqttCallback mqttCallback = new MqttCallback() {
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Log.i(TAG, "收到訊息: " + new String(message.getPayload()));
Log.e("wy", "收到訊息: " + new String(message.getPayload()));
//收到其他客戶端的訊息后,回應給對方告知訊息已到達或者訊息有問題等
//response("message arrived");
}
@Override
public void deliveryComplete(IMqttDeliveryToken arg0) {
}
@Override
public void connectionLost(Throwable arg0) {
Log.e(TAG, "連接斷開:"+arg0.getMessage()+" 斷開原因: "+arg0.getCause());
if(connectNum<7){
connectNum++;
doClientConnection();//連接斷開,重連
}
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/328202.html
標籤:其他
