Android MQTT的使用以及一些常见的问题

嚴華  金牌会员 | 2024-12-12 19:17:52 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 912|帖子 912|积分 2736

1.Android MQTT

使用步骤


  • 引入依赖
  • 先连接
  • 订阅
  • 发布
  • 取消订阅
  • 取消连接
起首,确保你的AndroidManifest.xml文件中声明白这些权限
  1.     <uses-permission android:name="android.permission.INTERNET"/>
  2.     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
  3.     <uses-permission android:name="android.permission.WAKE_LOCK"/>
  4.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
复制代码
2.Android连接mqtt

往build.gradle引入
Android开辟mqtt客户端主流使用的是eclipse提供的paho.mqtt
  1.   implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
  2.   implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3-1.1.0'
复制代码
这是使用的是Android12(api30)  
1.MQTTService类

  1. import android.app.Service;
  2. import android.content.Intent;
  3. import android.os.Binder;
  4. import android.os.IBinder;
  5. import android.util.Log;
  6. import org.eclipse.paho.android.service.MqttAndroidClient;
  7. import org.eclipse.paho.client.mqttv3.IMqttActionListener;
  8. import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
  9. import org.eclipse.paho.client.mqttv3.IMqttToken;
  10. import org.eclipse.paho.client.mqttv3.MqttCallback;
  11. import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
  12. import org.eclipse.paho.client.mqttv3.MqttException;
  13. import org.eclipse.paho.client.mqttv3.MqttMessage;
  14. import java.util.Date;
  15. // MQTT服务类,继承自Service
  16. public class MQTTService extends Service {
  17.     // MQTT服务器地址
  18.     public static String host = "tcp://192.168.**";
  19.     // 订阅的主题
  20.     public static String topic = "order";
  21.     // MQTT客户端实例
  22.     private MqttAndroidClient client;
  23.     // MQTT连接选项
  24.     private MqttConnectOptions mqttConnectOptions;
  25.     // 构造方法,通常用于初始化成员变量(这里为空)
  26.     public MQTTService() {
  27.     }
  28.     // onBind方法,当其他组件(如Activity)绑定到此服务时调用
  29.     @Override
  30.     public IBinder onBind(Intent intent) {
  31.         // 返回一个CustomBinder实例,允许客户端与服务进行通信
  32.         return new CustomBinder();
  33.     }
  34.     // onCreate方法,当服务创建时调用
  35.     @Override
  36.     public void onCreate() {
  37.         super.onCreate();
  38.         Log.d("tag", "服务启动成功");
  39.         try {
  40.             // 初始化MQTT客户端和连接
  41.             init();
  42.         } catch (MqttException e) {
  43.             // 打印异常堆栈信息
  44.             e.printStackTrace();
  45.         }
  46.     }
  47.     // 自定义Binder类,用于客户端与服务之间的通信
  48.     public class CustomBinder extends Binder {
  49.         // 获取MQTTService实例的方法
  50.         public MQTTService getService() {
  51.             return MQTTService.this;
  52.         }
  53.     }
  54.     // 初始化MQTT客户端的方法
  55.     public void init() throws MqttException {
  56.         // 创建MqttAndroidClient实例,传入上下文、服务器地址、客户端ID和自动确认消息模式
  57.         client = new MqttAndroidClient(this, host, String.valueOf(new Date().getTime()), MqttAndroidClient.Ack.AUTO_ACK);
  58.         // 设置MQTT回调
  59.         client.setCallback(mqttCallback);
  60.         // 创建MqttConnectOptions实例
  61.         mqttConnectOptions = new MqttConnectOptions();
  62.         // 如果客户端未连接,则尝试连接
  63.         if (!client.isConnected()) {
  64.             client.connect(mqttConnectOptions, null, iMqttActionListener);
  65.         }
  66.     }
  67.     // MQTT连接操作的监听器
  68.     IMqttActionListener iMqttActionListener = new IMqttActionListener() {
  69.         @Override
  70.         public void onSuccess(IMqttToken iMqttToken) {
  71.             try {
  72.                 // 连接成功后订阅指定主题
  73.                 client.subscribe(topic, 1); // QoS等级为1
  74.             } catch (MqttException e) {
  75.                 // 打印异常堆栈信息
  76.                 e.printStackTrace();
  77.             }
  78.         }
  79.         @Override
  80.         public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
  81.             // 连接失败时打印异常堆栈信息
  82.             throwable.printStackTrace();
  83.         }
  84.     };
  85.     // MQTT回调接口的实现,用于处理连接丢失、消息到达和消息发送完成事件
  86.     MqttCallback mqttCallback = new MqttCallback() {
  87.         @Override
  88.         public void connectionLost(Throwable throwable) {
  89.             // 连接丢失时的处理(此处为空)
  90.         }
  91.         @Override
  92.         public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
  93.             // 当消息到达时打印消息内容、主题、QoS等级和保留标志
  94.             Log.d("string", mqttMessage.getPayload().toString());
  95.      
  96.         }
  97.         @Override
  98.         public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
  99.             // 消息发送完成时的处理(此处为空)
  100.         }
  101.     };
  102. }
复制代码
2.MqttCerviceConn类

  1. import android.content.ComponentName;
  2. import android.content.ServiceConnection;
  3. import android.os.IBinder;
  4. // MqttCerviceConn类实现了ServiceConnection接口,用于处理MQTT服务的连接和断开
  5. public class MqttCerviceConn implements ServiceConnection {
  6.     // MQTTService类的实例,用于与服务进行交互
  7.     public MQTTService mqttService;
  8.     // 当服务成功连接时调用此方法
  9.     @Override
  10.     public void onServiceConnected(ComponentName name, IBinder service) {
  11.         // 将IBinder转换为MQTTService中定义的CustomBinder类型,并获取MQTTService的实例
  12.         // 这里假设MQTTService有一个名为CustomBinder的内部类,它实现了IBinder接口,并有一个getService()方法返回MQTTService的实例
  13.         mqttService = ((MQTTService.CustomBinder)service).getService();
  14.         //你可以在这里实现其他业务功能 比如 aidl接口
  15.     }
  16.     // 当服务断开连接时调用此方法
  17.     @Override
  18.     public void onServiceDisconnected(ComponentName name) {
  19.         // 在这里可以处理服务断开连接的逻辑,比如清理资源或更新UI
  20.         // 当前方法体为空,表示没有特定的断开连接处理逻辑
  21.     }
  22. }
复制代码


  • ServiceConnection接口:用于监听与服务的连接状态。当服务连接乐成或断开时,系统会分别调用onServiceConnected和onServiceDisconnected方法。
  • IBinder接口:服务通过它与客户端(如Activity或其他组件)进行通信。在onServiceConnected方法中,你可以通过通报给你的IBinder对象来获取服务的实例。
  • MQTTService:假设这是一个自界说的服务类,用于处理MQTT相干的操作。它有一个为CustomBinder的单独的Binder类,该类实现了IBinder接口,并提供了一个方法来获取MQTTService的实例。
这个类通常用于在Activity或其他组件中,当需要与服务进行交互时,通过绑定服务来使用。绑定服务后,你可以通过mqttService实例来调用服务中界说的方法。
在MainActivity启动Mqtt服务

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3.     super.onCreate(savedInstanceState);
  4.     setContentView(R.layout.activity_main);
  5.     // 创建MqttCerviceConn的实例,这个类实现了ServiceConnection接口,用于处理服务连接和断开的回调
  6.     MqttCerviceConn mqttCerviceConn = new MqttCerviceConn();
  7.    
  8.     // 创建一个Intent,用于指定要绑定的服务。这里指定的是MQTTService类
  9.     Intent intent = new Intent(this, MQTTService.class);
  10.    
  11.     // 绑定服务。这个方法会异步地尝试连接到指定的服务
  12.     // 第一个参数是Intent,用于指定要绑定的服务
  13.     // 第二个参数是ServiceConnection的实例,用于接收服务连接和断开的回调
  14.     // 第三个参数是一个标志,这里使用的是Context.BIND_AUTO_CREATE,表示如果服务尚未创建,则自动创建它
  15.     bindService(intent, mqttCerviceConn, Context.BIND_AUTO_CREATE);
  16. }
复制代码
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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表