Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Paho MqttAndroidClient.connect始终失败_Android_Service_Publish_Mqtt_Paho - Fatal编程技术网

Paho MqttAndroidClient.connect始终失败

Paho MqttAndroidClient.connect始终失败,android,service,publish,mqtt,paho,Android,Service,Publish,Mqtt,Paho,我想将安卓服务的消息发布到本地服务器。下面是我的代码的一部分,以最简单的形式显示,它是基于 但是onFailure函数总是被调用,我得到一个错误: I/MQTT﹕ Client connection failed: cannot start service org.eclipse.paho.android.service.MqttService 显然是由库返回的,因为“侦听器”=空'。使用调试器,它显示'listener=SensorLoggerService$1@3634'. SensorL

我想将安卓
服务的消息发布到本地服务器。下面是我的代码的一部分,以最简单的形式显示,它是基于

但是onFailure函数总是被调用,我得到一个错误:

I/MQTT﹕ Client connection failed: cannot start service org.eclipse.paho.android.service.MqttService
显然是由库返回的,因为“侦听器”=空'。使用调试器,它显示'listener=SensorLoggerService$1@3634'. SensorLogger服务是我的服务


知道会出什么问题吗?非常感谢。

尝试了几个小时后,我成功地连接到了
MqttClient
,而不是
MqttAndroidClient
。我仍然不知道为什么
MqttAndroidClient
失败

以下是一些提示:

  • 服务类应该实现
    MqttCallback

  • 清单(`AndroidManifest.xml')必须至少包含以下内容:


修改后的代码:

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");
}

有关更多详细信息,请参阅本指南:

对我来说是同一期;在我的例子中,问题是
标记在
标记之外

一开始我有这样的想法:

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

...
...

一切都成功了

您还需要添加
互联网
访问网络状态
唤醒锁定
权限


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


您不需要为该解决方案添加androidmanifest.xml,因为您使用paho库执行同步任务。要使用android服务,您应该使用MqttAndroidClient而不是MqttClient。我的情况与此相同,任何使用
MqttAndroidClient
的解决方案都需要
WAKE_LOCK
权限才能运行。
<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" />