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>
...
...
一切都成功了
您还需要添加互联网
、访问网络状态
和唤醒锁定
权限
HTHMqttService需要此权限
<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" />