2016-02-13 192 views
0

我是一个android的新手。我想使用org.eclipse.paho.android.service(here)连接到Mqtt服务器。我已阅读文档并已实施IMqttActionListener,MqttCallbackMqttTraceHandler。然后我使用MqttAndroidClient连接到服务器,但无法连接服务器。我调试了android代码,但它似乎很无奈。org.eclipse.paho.android.service示例代码如何运行?

我的示例代码如下。

ActionListener acListener = new ActionListener(this.context,ActionListener.Action.CONNECT,this.clientHandle,null); 
MqttConnectOptions connOpt = new MqttConnectOptions(); 

//connOpt.setConnectionTimeout(10); 
connOpt.setKeepAliveInterval(1000); 

this.client.setCallback(new MqttCallbackHandler(this.context,this.clientHandle)); 
this.client.setTraceCallback(new MqttTraceCallback()); 

try{ 
    this.client.connect(connOpt,null, acListener); 
} catch (MqttException e){ 
    Log.e(this.getClass().getCanonicalName(),"----------------------------------------",e); 
} 

if(this.client.isConnected()) { 
    Log.i("connect", "------------------------------------"); 
} else { 
    *Log.i("is not connect", "----------------------------------"); 
} 

总是程序会告诉我,客户端没有连接到服务器。我不知道这一点。

有一个例外:

com.example.zhangkai.gpstraker E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.zhangkai.gpstraker/com.example.zhangkai.gpstraker.GPSActivity}: java.lang.NullPointerException 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2312) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2364) 
at android.app.ActivityThread.access$600(ActivityThread.java:162) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1346) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:153) 
at android.app.ActivityThread.main(ActivityThread.java:5320) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at org.eclipse.paho.android.service.MqttAndroidClient.publish(MqttAndroidClient.java:812) 
at org.eclipse.paho.android.service.MqttAndroidClient.publish(MqttAndroidClient.java:668) 
at com.example.zhangkai.gpstraker.MqttConnection.connect(MqttConnection.java:128) 
at com.example.zhangkai.gpstraker.GPSActivity.onCreate(GPSActivity.java:27) 
at android.app.Activity.performCreate(Activity.java:5265) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2276) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2364)? 
at android.app.ActivityThread.access$600(ActivityThread.java:162)? 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1346)? 
at android.os.Handler.dispatchMessage(Handler.java:99)? 
at android.os.Looper.loop(Looper.java:153)? 
at android.app.ActivityThread.main(ActivityThread.java:5320)? 
at java.lang.reflect.Method.invokeNative(Native Method)? 
at java.lang.reflect.Method.invoke(Method.java:511)? 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851)? 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)? 
at dalvik.system.NativeStart.main(Native Method)? 

调试应用程序之后。唯一的例外是因为mqttService是null.But现在,我得到另一个异常

E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x8000010 (has extras) } in org.eclipse.p[email protected]415460e8 
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:820) 
at android.os.Handler.handleCallback(Handler.java:725) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:153) 
at android.app.ActivityThread.main(ActivityThread.java:5320) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
at dalvik.system.NativeStart.main(Native Method) 
sed by: java.lang.SecurityException: ConnectivityService: Neither user 10090 nor current process has android.permission.ACCESS_NETWORK_STATE. 
at android.os.Parcel.readException(Parcel.java:1425) 
at android.os.Parcel.readException(Parcel.java:1379) 
at android.net.IConnectivityManager$Stub$Proxy.getActiveNetworkInfo(IConnectivityManager.java:720) 
at android.net.ConnectivityManager.getActiveNetworkInfo(ConnectivityManager.java:570) 
at org.eclipse.paho.android.service.MqttService.isOnline(MqttService.java:814) 
at org.eclipse.paho.android.service.MqttService$NetworkConnectionIntentReceiver.onReceive(MqttService.java:796) 
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:808) 
at android.os.Handler.handleCallback(Handler.java:725)? 
at android.os.Handler.dispatchMessage(Handler.java:92)? 
at android.os.Looper.loop(Looper.java:153)? 
at android.app.ActivityThread.main(ActivityThread.java:5320)? 
at java.lang.reflect.Method.invokeNative(Native Method)? 
at java.lang.reflect.Method.invoke(Method.java:511)? 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851)? 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)? 
at dalvik.system.NativeStart.main(Native Method)? 

我的AndroidManifest.xml是

<uses-permission android:name="android.permission.INTERNET" /> 
<uses_permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses_permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
+0

请使用logcat输出更新问题,以便我们可以查看是否有任何异常 – hardillb

+0

@hardillb感谢您的回复。我已经用logcat输出更新了这个问题。 – zhangkai

回答

1

您可能想要检查我刚扔​​在一起的这个示例。这是一个非常简单的空白活动,但它展示了如何创建客户端,连接到代理,订阅&发布到具有基本回调的主题。 https://github.com/jpwsutton/PahoAndroidSample

+0

我已经像你一样做了。我没有测试订阅。现在我有一个问题,mqtt.android.service如何在后台运行。 – zhangkai

+0

我在BroadcastReceiver的OnReceive方法中使用您的示例代码。它抛出一个异常.'android.content.ReceiverCallNotAllowedException:BroadcastReceiver组件不允许绑定到服务'我想使用一个服务来获取位置。其他服务(mqttService)数据)。如何使用mqttService.It似乎mqttAndroidClient和mqttService是不同的东西?谢谢。 – zhangkai

0

第二个例外java.lang.SecurityException: ConnectivityService: Neither user 10090 nor current process has android.permission.ACCESS_NETWORK_STATE.已经modified.The原因,也许是因为AndroidManifest .xml不解析正确。它很奇怪,现在我可以连接到服务器now.I实现了IMqttActionListener并使用connect.The connect是一个异步函数。所以当我成功连接到服务器。应用程序运行到IMqttActionListener覆盖函数OnSuccess。 我的代码github