1.Android MQTT
使用步骤
- 引入依赖
- 先连接
- 订阅
- 发布
- 取消订阅
- 取消连接
首先,确保你的AndroidManifest.xml
文件中声明了这些权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
2.Android连接mqtt
往build.gradle引入
Android开发mqtt客户端主流使用的是eclipse提供的paho.mqtt
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3-1.1.0'
这是使用的是Android12(api30)
1.MQTTService类
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import java.util.Date;
// MQTT服务类,继承自Service
public class MQTTService extends Service {
// MQTT服务器地址
public static String host = "tcp://192.168.**";
// 订阅的主题
public static String topic = "order";
// MQTT客户端实例
private MqttAndroidClient client;
// MQTT连接选项
private MqttConnectOptions mqttConnectOptions;
// 构造方法,通常用于初始化成员变量(这里为空)
public MQTTService() {
}
// onBind方法,当其他组件(如Activity)绑定到此服务时调用
@Override
public IBinder onBind(Intent intent) {
// 返回一个CustomBinder实例,允许客户端与服务进行通信
return new CustomBinder();
}
// onCreate方法,当服务创建时调用
@Override
public void onCreate() {
super.onCreate();
Log.d("tag", "服务启动成功");
try {
// 初始化MQTT客户端和连接
init();
} catch (MqttException e) {
// 打印异常堆栈信息
e.printStackTrace();
}
}
// 自定义Binder类,用于客户端与服务之间的通信
public class CustomBinder extends Binder {
// 获取MQTTService实例的方法
public MQTTService getService() {
return MQTTService.this;
}
}
// 初始化MQTT客户端的方法
public void init() throws MqttException {
// 创建MqttAndroidClient实例,传入上下文、服务器地址、客户端ID和自动确认消息模式
client = new MqttAndroidClient(this, host, String.valueOf(new Date().getTime()), MqttAndroidClient.Ack.AUTO_ACK);
// 设置MQTT回调
client.setCallback(mqttCallback);
// 创建MqttConnectOptions实例
mqttConnectOptions = new MqttConnectOptions();
// 如果客户端未连接,则尝试连接
if (!client.isConnected()) {
client.connect(mqttConnectOptions, null, iMqttActionListener);
}
}
// MQTT连接操作的监听器
IMqttActionListener iMqttActionListener = new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
try {
// 连接成功后订阅指定主题
client.subscribe(topic, 1); // QoS等级为1
} catch (MqttException e) {
// 打印异常堆栈信息
e.printStackTrace();
}
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
// 连接失败时打印异常堆栈信息
throwable.printStackTrace();
}
};
// MQTT回调接口的实现,用于处理连接丢失、消息到达和消息发送完成事件
MqttCallback mqttCallback = new MqttCallback() {
@Override
public void connectionLost(Throwable throwable) {
// 连接丢失时的处理(此处为空)
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
// 当消息到达时打印消息内容、主题、QoS等级和保留标志
Log.d("string", mqttMessage.getPayload().toString());
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
// 消息发送完成时的处理(此处为空)
}
};
}
2.MqttCerviceConn类
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.os.IBinder;
// MqttCerviceConn类实现了ServiceConnection接口,用于处理MQTT服务的连接和断开
public class MqttCerviceConn implements ServiceConnection {
// MQTTService类的实例,用于与服务进行交互
public MQTTService mqttService;
// 当服务成功连接时调用此方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 将IBinder转换为MQTTService中定义的CustomBinder类型,并获取MQTTService的实例
// 这里假设MQTTService有一个名为CustomBinder的内部类,它实现了IBinder接口,并有一个getService()方法返回MQTTService的实例
mqttService = ((MQTTService.CustomBinder)service).getService();
//你可以在这里实现其他业务功能 比如 aidl接口
}
// 当服务断开连接时调用此方法
@Override
public void onServiceDisconnected(ComponentName name) {
// 在这里可以处理服务断开连接的逻辑,比如清理资源或更新UI
// 当前方法体为空,表示没有特定的断开连接处理逻辑
}
}
- ServiceConnection接口:用于监听与服务的连接状态。当服务连接成功或断开时,系统会分别调用
onServiceConnected
和onServiceDisconnected
方法。 - IBinder接口:服务通过它与客户端(如Activity或其他组件)进行通信。在
onServiceConnected
方法中,你可以通过传递给你的IBinder
对象来获取服务的实例。 - MQTTService:假设这是一个自定义的服务类,用于处理MQTT相关的操作。它有一个为
CustomBinder
的单独的Binder类,该类实现了IBinder
接口,并提供了一个方法来获取MQTTService
的实例。
这个类通常用于在Activity或其他组件中,当需要与服务进行交互时,通过绑定服务来使用。绑定服务后,你可以通过mqttService
实例来调用服务中定义的方法。
在MainActivity启动Mqtt服务
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建MqttCerviceConn的实例,这个类实现了ServiceConnection接口,用于处理服务连接和断开的回调
MqttCerviceConn mqttCerviceConn = new MqttCerviceConn();
// 创建一个Intent,用于指定要绑定的服务。这里指定的是MQTTService类
Intent intent = new Intent(this, MQTTService.class);
// 绑定服务。这个方法会异步地尝试连接到指定的服务
// 第一个参数是Intent,用于指定要绑定的服务
// 第二个参数是ServiceConnection的实例,用于接收服务连接和断开的回调
// 第三个参数是一个标志,这里使用的是Context.BIND_AUTO_CREATE,表示如果服务尚未创建,则自动创建它
bindService(intent, mqttCerviceConn, Context.BIND_AUTO_CREATE);
}
3.常见的报错
1. 在连接的时候 千万别忘记tcp:// 否则会连接失败。
2.如果报cannot start service org.eclipse.paho.android.service.MqttService
你需要在AndroidManifest.xml中添加
<service android:name="org.eclipse.paho.android.service.MqttService"/>
标签:常见,eclipse,MQTT,client,MQTTService,import,Android,public,paho From: https://blog.csdn.net/m0_53992752/article/details/143951767