繁体   English   中英

Paho MqttAndroidClient.connect总是失败

[英]Paho MqttAndroidClient.connect always fails

我想将消息从android 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是我的服务。

什么可能出错? 非常感谢。

对我来说同样的问题; 在我的例子中,问题是<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>

然后我改为:

<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>

一切正常!

您还需要添加INTERNETACCESS_NETWORK_STATEWAKE_LOCK权限。

HTH

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" />

经过几个小时的尝试,我设法连接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.motorolaso​​lutions.com/docs/DOC-2315

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM