Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.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
Java Can';t在Android Studio上运行我的MQTT应用程序_Java_Android_Android Studio_Mqtt - Fatal编程技术网

Java Can';t在Android Studio上运行我的MQTT应用程序

Java Can';t在Android Studio上运行我的MQTT应用程序,java,android,android-studio,mqtt,Java,Android,Android Studio,Mqtt,我正在测试一个个人MQTT应用程序,但当我单击connect按钮时它失败了。。。有一个例外,但我不知道它来自哪里 这是我的密码 MainActivity.java: package com.application.phoste.homecontrol; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import andr

我正在测试一个个人MQTT应用程序,但当我单击connect按钮时它失败了。。。有一个例外,但我不知道它来自哪里

这是我的密码

MainActivity.java:

package com.application.phoste.homecontrol;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends Activity {
    private Paho paho = null;
    EditText topic = null;
    EditText message = null;
    Button connect = null;
    Button send = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        paho = new Paho();

        topic = (EditText) findViewById(R.id.topic);
        message = (EditText) findViewById(R.id.message);

        connect = (Button) findViewById(R.id.connect);
        connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                paho.connect();
                String res = (paho.isConnected()) ? "Connected" : "Not Connected";
                Toast toast = Toast.makeText(getApplicationContext(), res, Toast.LENGTH_SHORT);
                toast.show();
            }
        });
        send = (Button) findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                paho.publish(topic.getText().toString(), message.getText().toString());
                Toast toast = Toast.makeText(getApplicationContext(), "Message sent", Toast.LENGTH_SHORT);
                toast.show();
            }
        });
    }

    @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);
    }
}
Paho.java:

package com.application.phoste.homecontrol;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

public class Paho implements MqttCallback {

    private MqttClient client;
    private static final String BROKER = "tcp://192.168.1.189:1883";
    private static final int QOS = 2;

    public void connect() {
        try {
            client = new MqttClient(BROKER, MqttClient.generateClientId());
            MqttConnectOptions options = new MqttConnectOptions();
            options.setConnectionTimeout(1);
            client.setCallback(this);
            client.connect();
        } catch (MqttException e) {
            e.getMessage();
        }
    }

    public void disconnect() {
        if (client.isConnected()) {
            try {
                client.disconnect();
            } catch (MqttException e) {
                e.getMessage();
            }
        }
    }

    public boolean isConnected() {
        return client.isConnected();
    }

    public void publish(String topic, String m) {
        try {
            MqttMessage message = new MqttMessage(m.getBytes());
            message.setQos(2);
            client.publish(topic, message);
        } catch (MqttException e) {
            e.getMessage();
        }
    }

    @Override
    public void connectionLost(Throwable throwable) {

    }

    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {

    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

    }
}
例外情况:

07-29 15:17:23.988  15718-15718/com.application.phoste.homecontrol E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.application.phoste.homecontrol, PID: 15718
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.eclipse.paho.client.mqttv3.MqttClient.isConnected()' on a null object reference
            at com.application.phoste.homecontrol.Paho.isConnected(Paho.java:44)
            at com.application.phoste.homecontrol.MainActivity$1.onClick(MainActivity.java:35)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19748)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
我还将
行添加到AndroidManifest.xml中

我错在哪里

编辑:

我刚刚意识到,在抛出异常之前,我就收到了一些警告消息。。。这是:

07-29 17:26:52.673  32706-32706/com.application.phoste.homecontrol W/System.err﹕ MqttException (0)
07-29 17:26:52.673  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence.open(MqttDefaultFilePersistence.java:80)
07-29 17:26:52.673  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:286)
07-29 17:26:52.674  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:167)
07-29 17:26:52.674  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:224)
07-29 17:26:52.674  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:136)
07-29 17:26:52.675  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at com.application.phoste.homecontrol.MainActivity.onCreate(MainActivity.java:35)
07-29 17:26:52.675  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.Activity.performCreate(Activity.java:5933)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2282)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread.access$900(ActivityThread.java:147)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5254)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
07-29 17:26:52.676  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
07-29 17:26:52.678  32706-32706/com.application.phoste.homecontrol W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
但是它仍然不起作用,我从de debug按钮获得空Toast。

您的“客户端”对象在尝试对其执行某些操作时未初始化

移动此行:
client=newmqttclient(代理,MqttClient.generateClientId())


到应用程序中的其他位置(可能是onCreate()),以确保在访问变量之前已正确初始化该变量。i

好,因此需要设置MQTT文件持久化路径,这将需要对SD卡及其指定路径进行写访问


您还需要添加访问文件系统的正确权限。

您需要将e.getMessage()替换为e.printStackTrace(),以便您可以看到错误。因此,您应该在AsynTask中执行所有MQTT工作,就像在网络IO中一样,这不应该在Android应用程序的主线程上执行,但这并不能解决我的问题。为什么我的客户端对象没有初始化?是因为我在onCreate()函数中调用了它吗?除非我们在跟踪中看到丢失的异常消息,否则我们可能无法回答这个问题。对不起,我将所有的e.getMessage()更改为e.printStackTrace(),但id不会更改我得到的异常的格式。这仍然是上面的相同。有没有可能是因为我添加了错误的库?或者可能uses权限不是很好?来自paho的connect()函数(当我按下connect按钮时)是第一个被调用的函数,它初始化了客户机,显然不是。也许还有别的东西在那个点上抛出一个空指针。总之,您正在尝试访问一个尚未初始化的对象,这就是您的问题。我试图通过放置
client=new MqttClient(BROKER,MqttClient.generateClientId())来调试我的问题在Paho的构造函数中,以确保它已初始化,但它仍然没有…我更改了代码并将所有内容放入MainActivity中,但它仍然没有初始化,我仍然不明白为什么。我更新了我原来的帖子,也许在应用程序崩溃之前我收到的消息有点太多了!现在似乎可以工作了,我的客户端变量终于设置好了。。。我认为持久性文件是不必要的(我从来没有在简单的java编程中使用过它),我现在的问题是它说缺少internet权限,但我在AndroidManifest.xml
中写了这一行,我只是将
更改为
,它工作得很好!再次感谢
package com.application.phoste.homecontrol;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

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


public class MainActivity extends Activity {
    EditText topic = null;
    EditText message = null;
    Button send = null;
    Button debug = null;
    MqttClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            client = new MqttClient("tcp://m2m.eclipse.org:1883", MqttClient.generateClientId());
            MqttConnectOptions options = new MqttConnectOptions();
            options.setConnectionTimeout(1);
            client.connect();
        } catch (MqttException e) {
            e.printStackTrace();
        }

        topic = (EditText) findViewById(R.id.topic);
        message = (EditText) findViewById(R.id.message);

        send = (Button) findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    MqttMessage m = new MqttMessage(message.getText().toString().getBytes());
                    m.setQos(2);
                    client.publish(topic.getText().toString(), m);
                    Toast toast = Toast.makeText(getApplicationContext(), "Message sent", Toast.LENGTH_SHORT);
                    toast.show();
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }
        });

        debug = (Button) findViewById(R.id.debug);
        debug.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String res = (client == null) ? "Null" : "Not Null";
                Toast toast = Toast.makeText(getApplicationContext(), res, Toast.LENGTH_SHORT);
                toast.show();
            }
        });
    }

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