Я создаю Android приложение, в этом приложении также есть функция для отправки данных по каналу MQTT.
Так что я собираю этот код для соединения с прерванным mqtt.
mqttAndroidClient = new MqttAndroidClient(this, MQTTConstants.MQTT_HOST, "namechannel");
mqttAndroidClient.setCallback(new MqttCallbackExtended() {
@Override
public void connectComplete(boolean reconnect, String serverURI) {
Log.d("mqtt connected :: ", serverURI);
}
@Override
public void connectionLost(Throwable cause) {
}
@Override
public void messageArrived(String topic, MqttMessage message) {
Log.d("Message Arrival :: ", message.toString());
String typeUser = PreferenceHandler.readString(ZephyrMqttService.this, PreferenceHandler.TYPE_USER, null);
if (typeUser != null) {
if (typeUser.equalsIgnoreCase("3") || typeUser.equalsIgnoreCase("4")) {
String json = message.toString();
try {
JSONObject obj = new JSONObject(json);
JSONArray jsonArray = obj.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Gson gson = new Gson();
ecgDataListForRelative.add(gson.fromJson(jsonObject.toString(), Data.class));
}
Intent sendMQTTPackets = new Intent(AppConstants.RECIEVE_MQTT);
relativeRoleECGData = new RelativeRoleECGData();
relativeRoleECGData.setData(ecgDataListForRelative);
sendMQTTPackets.putExtra(AppConstants.EXTRA_RELATIVE_ROLE_MQTT_DATA, relativeRoleECGData);
sendBroadcast(sendMQTTPackets);
Log.e("My App", ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hit broadcast");
// Toast.makeText(ZephyrMqttService.this, "mqtt data sent", Toast.LENGTH_SHORT).show();
} catch (Throwable t) {
Log.e("My App", "Could not parse malformed JSON: \"" + json + "\"");
}
}
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
if (token.isComplete()) {
try {
Log.d("Message Sent :: ", token.getMessage().toString());
} catch (MqttException e) {
e.printStackTrace();
Log.d("Message Sent :: ", token.getException().toString());
}
}
}
});
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setAutomaticReconnect(true);
mqttConnectOptions.setCleanSession(true);
try {
mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
disconnectedBufferOptions.setBufferEnabled(true);
disconnectedBufferOptions.setBufferSize(100);
disconnectedBufferOptions.setPersistBuffer(false);
disconnectedBufferOptions.setDeleteOldestMessages(false);
mqttAndroidClient.setBufferOpts(disconnectedBufferOptions);
subscribeToTopic("/ecg/omniacare/devices/0X" + bioHarnessDeviceId, 0);
try{
subscribeToTopic("/rr/omniacare/devices/0X" + bioHarnessDeviceId, 0);
}catch(Exception e){
e.printStackTrace();
}
try{
subscribeToTopic("/gen/omniacare/devices/0X" + bioHarnessDeviceId, 0);
}catch(Exception e){
e.printStackTrace();
}
try{
subscribeToTopic("/dosimeter/omniacare/devices/0X" + bioHarnessDeviceId, 0);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.w("Mqtt", "Failed to connect to: " + exception.toString());
}
});
} catch (MqttException ex) {
Log.e("MQTT", ex.getMessage());
}catch (Exception ex) {
Log.e("MQTT", ex.getMessage());
}
Это работает, но иногда, когда приложение запускается и пытается соединиться с MQTT, не работает, я получаю это сообщение об ошибке:
E/ActivityThread: Service com.example.dcubeandroid.dietcontrol.mqtt.ZephyrMqttService has leaked ServiceConnection org.eclipse.paho.android.service.MqttAndroidClient$MyServiceConnection@bacf38f that was originally bound here
android.app.ServiceConnectionLeaked: Service com.example.dcubeandroid.dietcontrol.mqtt.ZephyrMqttService has leaked ServiceConnection org.eclipse.paho.android.service.MqttAndroidClient$MyServiceConnection@bacf38f that was originally bound here
at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1538)
at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1430)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1622)
at android.app.ContextImpl.bindService(ContextImpl.java:1574)
at android.content.ContextWrapper.bindService(ContextWrapper.java:697)
at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:425)
at com.example.dcubeandroid.dietcontrol.mqtt.ZephyrMqttService.setupMQTT(ZephyrMqttService.java:326)
at com.example.dcubeandroid.dietcontrol.mqtt.ZephyrMqttService.onCreate(ZephyrMqttService.java:241)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3544)
at android.app.ActivityThread.-wrap4(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1786)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: it.bioresult.cardio, PID: 17697
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1881)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Ошибка в этой строке кода, но я не могу перехватить и исправить ит.
mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {