Android中mqtt的Eclipse paho抛出错误

问题描述:

我想为我的android应用程序使用MQTT eclipse paho库。我首先在java中编写代码并在Eclipse中进行了测试。它完美的作品。但是,相同的库和函数在Android中无法正常工作。我已将我的jar添加到应用程序的libs文件夹中。我还在应用程序的gradle中添加了编译文件('libs/org.eclipse.paho.client.mqttv3-1.0.2.jar')。该应用程序编译正确,但引发异常。 这是我的代码:Android中mqtt的Eclipse paho抛出错误

package com.example.ankur.mqtt; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 

import org.eclipse.paho.client.mqttv3.MqttClient; 
import org.eclipse.paho.client.mqttv3.MqttConnectOptions; 
import org.eclipse.paho.client.mqttv3.MqttException; 


public class MainActivity extends ActionBarActivity { 
    private TextView isConnected; 
    private boolean isMQTT; 
    private boolean connectionState; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     MQTTconnection mqtTconnection = new MQTTconnection(); 
     mqtTconnection.execute("Execute"); 


     isConnected = (TextView) findViewById(R.id.isConnected); 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
    private class MQTTconnection extends AsyncTask<String, Void, String>{ 
     @Override 
     protected String doInBackground(String... params){ 
      boolean connectionState; 
      connectionState = connectMQTT("tcp://iot.eclipse.org:1883","ankur145"); 
      System.out.println(connectionState); 
      if (connectionState == true){ 
       isMQTT = "True"; 
       return "TRUE"; 
      } 
       isMQTT = "False"; 
       return "False"; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      Log.d("DownloadClass", "Result was " + result); 


     } 
     protected boolean connectMQTT(String URL, String clientId){ 
      boolean connectionState; 
      try { 

       MqttClient mqClient = new MqttClient(URL, clientId); 
       MqttConnectOptions connOpts = new MqttConnectOptions(); 
       connOpts.setCleanSession(true); 
       mqClient.connect(connOpts); 
       connectionState = mqClient.isConnected(); 
       Log.d("Connection", String.valueOf(connectionState)); 
       //mqClient.setCallback(this); 


      } catch (MqttException me) { 
       // TODO Auto-generated catch block 
       System.out.println("reason "+me.getReasonCode()); 
       System.out.println("msg "+me.getMessage()); 
       System.out.println("loc "+me.getLocalizedMessage()); 
       System.out.println("cause "+me.getCause()); 
       System.out.println("excep " + me); 
       me.printStackTrace(); 
       return false; 
      } 
      Log.d("ConnectionState","in ConnectionC"); 
      return connectionState; 
     } 
    } 
} 

这是例外,我得到:

12-12 12:44:35.466 2038-2038/com.example.ankur.mqtt I/System.out: msg MqttException 
12-12 12:44:35.466 2038-2038/com.example.ankur.mqtt I/System.out: loc MqttException 
12-12 12:44:35.466 2038-2038/com.example.ankur.mqtt I/System.out: cause null 
12-12 12:44:35.466 2038-2038/com.example.ankur.mqtt I/System.out: excep MqttException (0) 


2-11 17:57:41.981 30284-30312/com.example.ankur.mqtt W/System.err: MqttException (0) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence.open(MqttDefaultFilePersistence.java:80) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:286) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:167) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:224) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:136) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at com.example.ankur.mqtt.MainActivity$MQTTconnection.connectMQTT(MainActivity.java:96) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at com.example.ankur.mqtt.MainActivity$MQTTconnection.doInBackground(MainActivity.java:75) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at com.example.ankur.mqtt.MainActivity$MQTTconnection.doInBackground(MainActivity.java:71) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
12-11 17:57:41.982 30284-30312/com.example.ankur.mqtt W/System.err:  at java.lang.Thread.run(Thread.java:818) 

权限清单文件:

uses-permission android:name="android.permission.INTERNET" 
+0

更新什么permisions你问的问题在清单中。我估计你没有要求写入存储 – hardillb

+0

你好hardillb,我已经在问题中添加了权限。是的,我没有任何访问权限的写入权限。但是我们需要那个mqtt吗? – ankur

+0

是的,除非您更改为不使用基于填充的持久性,否则QOS> 0 msgs – hardillb

的问题是,因为你使用的是默认构造函数创建MqttClient对象。这会实例化一个MqttDefaultFilePersistence对象,以便在传递它们时写入消息(QOS 1或2)。即使有写权限,您也无法访问默认目录。

您需要使用这个版本的constructor

,要么通过它指向你可以写或目录的MqttDefaultFilePersistence对象传递一个MemoryPersistence对象

+0

谢谢,它解决了这个问题。 :) – ankur