java - 无法连接到 Android 上的 MQTT 服务器
问题描述
我正在尝试编写一个简单的代码来发布和订阅 Android Java 上的 MQTT 服务器。当我的应用程序尝试运行 onCreat() 时,它一直在崩溃。我在互联网上尝试了很多解决方案,但我无法弄清楚并解决这个问题,请帮助。
这是我的代码和错误日志:
这是我的 MainActivity.java
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.DisconnectedBufferOptions;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import java.io.UnsupportedEncodingException;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private MqttAndroidClient mqttAndroidClient;
private static final String TAG = "PahoMqttClient";
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main );
getMqttClient ( getApplicationContext(),"tcp//test.mosquitto.org:1883","esp32_hello" );
}
public MqttAndroidClient getMqttClient( Context context, String brokerUrl, String clientId) {
mqttAndroidClient = new MqttAndroidClient(context, brokerUrl, clientId);
try {
IMqttToken token = mqttAndroidClient.connect(getMqttConnectionOption());
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
mqttAndroidClient.setBufferOpts(getDisconnectedBufferOptions());
Log.d( "TAG", "Success");
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d("TAG", "Failure " + exception.toString());
}
});
} catch (MqttException e) {
e.printStackTrace();
}
return mqttAndroidClient;
}
public void disconnect(@NonNull MqttAndroidClient client) throws MqttException {
IMqttToken mqttToken = client.disconnect();
mqttToken.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
Log.d(TAG, "Successfully disconnected");
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
Log.d(TAG, "Failed to disconnected " + throwable.toString());
}
});
}
@NonNull
private DisconnectedBufferOptions getDisconnectedBufferOptions() {
DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
disconnectedBufferOptions.setBufferEnabled(true);
disconnectedBufferOptions.setBufferSize(100);
disconnectedBufferOptions.setPersistBuffer(false);
disconnectedBufferOptions.setDeleteOldestMessages(false);
return disconnectedBufferOptions;
}
@NonNull
private MqttConnectOptions getMqttConnectionOption() {
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setCleanSession(false);
mqttConnectOptions.setAutomaticReconnect(true);
//mqttConnectOptions.setWill(Constants.PUBLISH_TOPIC, "I am going offline".getBytes(), 1, true);
//mqttConnectOptions.setUserName("ngbllzzy");
//mqttConnectOptions.setPassword("WtjhZKl3OPoK".toCharArray());
return mqttConnectOptions;
}
/*
public void publishMessage(@NonNull MqttAndroidClient client, @NonNull String msg, int qos, @NonNull String topic)
throws MqttException, UnsupportedEncodingException {
byte[] encodedPayload = new byte[0];
encodedPayload = msg.getBytes("UTF-8");
MqttMessage message = new MqttMessage(encodedPayload);
message.setId(320);
message.setRetained(true);
message.setQos(qos);
client.publish(topic, message);
}
public void subscribe(@NonNull MqttAndroidClient client, @NonNull final String topic, int qos) throws MqttException {
IMqttToken token = client.subscribe(topic, qos);
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
Log.d(TAG, "Subscribe Successfully " + topic);
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
Log.e(TAG, "Subscribe Failed " + topic);
}
});
}
public void unSubscribe(@NonNull MqttAndroidClient client, @NonNull final String topic) throws MqttException {
IMqttToken token = client.unsubscribe(topic);
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
Log.d(TAG, "UnSubscribe Successfully " + topic);
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
Log.e(TAG, "UnSubscribe Failed " + topic);
}
});
}
*/
}
我使用这些权限AndroidMainfest
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我<service android:name="org.eclipse.paho.android.service.MqttService"/>
也加了这个。
我也在我的build.gradle(:app)中使用这些实现
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
这是我的错误日志:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.im_tierd_of_this_shit, PID: 28422
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/content/LocalBroadcastManager;
at org.eclipse.paho.android.service.MqttAndroidClient.registerReceiver(MqttAndroidClient.java:450)
at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:428)
at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:334)
at com.example.im_tierd_of_this_shit.MainActivity.getMqttClient(MainActivity.java:34)
at com.example.im_tierd_of_this_shit.MainActivity.onCreate(MainActivity.java:29)
at android.app.Activity.performCreate(Activity.java:8198)
at android.app.Activity.performCreate(Activity.java:8182)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3765)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.LocalBroadcastManager" on path: DexPathList[[dex file "/data/data/com.example.im_tierd_of_this_shit/code_cache/.overlay/base.apk/classes3.dex", zip file "/data/app/~~W6OhEC-2fwAmOWAaC45Xyw==/com.example.im_tierd_of_this_shit-ghc3dmh_JMIqEeq5cr5lWg==/base.apk"],nativeLibraryDirectories=[/data/app/~~W6OhEC-2fwAmOWAaC45Xyw==/com.example.im_tierd_of_this_shit-ghc3dmh_JMIqEeq5cr5lWg==/lib/arm64, /system/lib64, /system/system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at org.eclipse.paho.android.service.MqttAndroidClient.registerReceiver(MqttAndroidClient.java:450)
at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:428)
at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:334)
at com.example.im_tierd_of_this_shit.MainActivity.getMqttClient(MainActivity.java:34)
at com.example.im_tierd_of_this_shit.MainActivity.onCreate(MainActivity.java:29)
at android.app.Activity.performCreate(Activity.java:8198)
at android.app.Activity.performCreate(Activity.java:8182)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3765)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
W/System: A resource failed to call close.
A resource failed to call close.
解决方案
推荐阅读
- javascript - 如何在(点击)和(输入)事件上调用方法
- excel - 使用 FILTER 或类似公式定义数据验证列表
- django - AWS EB Django ModuleNotFoundError:没有名为“my_project”的模块
- appium - 无法验证“////apks/appium-uiautomator2-server-v4.15.0.apk”的签名
- python - 为什么在两个不同的地方使用 upper() 会产生不同的结果?
- python-sphinx - Sphinx 在文字块中发出神秘错误
- python - 如何在 Ubuntu 上为 python3.8 安装 tkinter?
- c++ - 如何在 GDB 中输出 HashMap 元素?
- amazon-web-services - AWS Sagemaker:Jupyter Notebook 内核不断死亡
- mysql - LEFT JOIN 返回所有空值