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"/>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |