Paho MqttAndroidClient.connect всегда терпит неудачу

Я хочу публиковать сообщения с андроида service на локальный сервер. Вот части моего кода в простейшей форме на основе фрагментов из здесь.

MemoryPersistence memPer;
MqttAndroidClient client;

@Override
public IBinder onBind(Intent intent) {
    memPer = new MemoryPersistence();
    client = new MqttAndroidClient(this, "tcp://192.168.1.42:1883", "clientid", memPer);

    try {
        client.connect(null, new IMqttActionListener() {

            @Override
            public void onSuccess(IMqttToken mqttToken) {
                Log.i("MQTT", "Client connected");
                Log.i("MQTT", "Topics=" + mqttToken.getTopics());

                MqttMessage message = new MqttMessage("Hello, I am Android Mqtt Client.".getBytes());
                message.setQos(2);
                message.setRetained(false);

                try {
                    client.publish("messages", message);

                    Log.i("MQTT", "Message published");

                    client.disconnect();
                    Log.i("MQTT", "client disconnected");
                } catch (MqttPersistenceException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (MqttException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }

            @Override
            public void onFailure(IMqttToken arg0, Throwable arg1) {
                // TODO Auto-generated method stub
                Log.i("MQTT", "Client connection failed: " + arg1.getMessage());
            }
        });
    } catch (MqttException e) {
        e.printStackTrace();
    }

    return mBinder;
}

Но функция onFailure всегда вызывается, и я получаю сообщение об ошибке:

I/MQTT﹕ Client connection failed: cannot start service org.eclipse.paho.android.service.MqttService

По-видимому, возвращено библиотекой, потому что 'listener != null', строка 410. С помощью отладчика он показывает, что «listener = SensorLoggerService$1@3634». SensorLoggerService — это мой сервис.

Любая идея, что может пойти не так? Большое спасибо.


person Farshid T    schedule 05.09.2015    source источник


Ответы (3)


Та же проблема для меня; в моем случае проблема заключалась в том, что тег <service> находился за пределами тега <application>.

В начале у меня было так:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mycompany.myapp" >
...
<service android:name="org.eclipse.paho.android.service.MqttService">
    </service>
...
<application
    android:name="com.mycompany.myapp" ... >
...
</application>

Then I changed to this:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mycompany.myapp" >
...
<application
    android:name="com.mycompany.myapp" ... >
...
    <service android:name="org.eclipse.paho.android.service.MqttService">
    </service>

</application>

And everything worked!

Вам также необходимо добавить разрешения INTERNET, ACCESS_NETWORK_STATE и WAKE_LOCK.

ХТН

person Dario Fiumicello    schedule 25.11.2015
comment
Также для его запуска необходимо разрешение WAKE_LOCK. - person Sayan Sil; 24.05.2019

После нескольких часов проб и ошибок мне удалось подключиться к MqttClient вместо MqttAndroidClient. Я до сих пор не знаю, почему MqttAndroidClient не работал.

Вот несколько советов:

  • Класс обслуживания должен реализовать MqttCallback

  • Манифест (AndroidManifest.xml) должен содержать как минимум следующее:

<!-- Internet permission -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- MqttService -->
<service android:name="org.eclipse.paho.android.service.MqttService" />

Модифицированный код:

MemoryPersistence memPer;
MqttClient client;

@Override
public IBinder onBind(Intent intent) {
    memPer = new MemoryPersistence();
    try
    {
        client = new MqttClient("tcp://192.168.1.42:1883", MqttClient.generateClientId(), null);
        client.setCallback(this);
    }
    catch (MqttException e1)
    {
        e1.printStackTrace();
    }

    MqttConnectOptions options = new MqttConnectOptions();
    try
    {
        client.connect(options);
    }
    catch (MqttException e)
    {
        Log.d(getClass().getCanonicalName(), "Connection attempt failed with reason code = " + e.getReasonCode() + ":" + e.getCause());
    }

    // Now, try to publish a message
    String msg = "Hello, I am Android Mqtt Client.";
    try
    {
        MqttMessage message = new MqttMessage();
        message.setQos(1);
        message.setPayload(msg.getBytes());
        client.publish("sensors/test", message);
    }
    catch (MqttException e)
    {
        Log.d(getClass().getCanonicalName(), "Publish failed with reason code = " + e.getReasonCode());
    }

    return mBinder;
}

@Override
public void connectionLost(Throwable cause)
{
    Log.d("MQTT", "MQTT Server connection lost" + cause.getMessage());
}
@Override
public void messageArrived(String topic, MqttMessage message)
{
    Log.d("MQTT", "Message arrived:" + topic + ":" + message.toString());
}
@Override
public void deliveryComplete(IMqttDeliveryToken token)
{
    Log.d("MQTT", "Delivery complete");
}

Дополнительные сведения см. в этом замечательном руководстве: https://developer.motorolasolutions.com/docs/DOC. -2315

person Farshid T    schedule 05.09.2015
comment
Вам не нужно добавлять ‹service android:name=org.eclipse.paho.android.service.MqttService /› в androidmanifest.xml для этого решения, потому что вы используете библиотеку paho для синхронных задач. Чтобы использовать службы Android, вы должны использовать MqttAndroidClient вместо MqttClient. - person séan35; 29.04.2016
comment
У меня такая же ситуация, какое-нибудь решение для работы с MqttAndroidClient? - person Augusto; 05.11.2018

MqttService нужны эти разрешения

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person Juan Mite    schedule 11.07.2018