首页 > 其他分享 >Android MQTT的使用以及一些常见的问题

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

时间:2024-11-22 16:19:32浏览次数:3  
标签:常见 eclipse MQTT client MQTTService import Android public paho

1.Android MQTT

使用步骤

  1. 引入依赖
  2. 先连接
  3. 订阅
  4. 发布
  5. 取消订阅
  6. 取消连接

首先,确保你的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接口:用于监听与服务的连接状态。当服务连接成功或断开时,系统会分别调用onServiceConnectedonServiceDisconnected方法。
  • 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

相关文章

  • Android 11.0 系统默认打开的TP触摸开关功能实现
    1.前言在11.0的系统rom定制化开发中,在进行某些产品开发中,在一些测试版的生产贴片软件中,默认需要打开系统中的TP触摸开关,就是在点击触摸屏的时候,会处理坐标和手势轨迹的功能,接下来就看系统中是怎么样控制的,然后实现相关功能2.系统默认打开的TP触摸开关功能实现的核心类frame......
  • 人工智能之机器学习基础——常见的激活函数
    激活函数是神经网络中的关键组件,用于引入非线性特性,从而使神经网络能够学习复杂的模式和关系。以下是常见的激活函数及其特点、公式和应用场景: 1.Sigmoid(S型函数)公式:σ(x) = 1 +1 / (e−x)特点:输出范围:(0,1)(0,1)(0,1)。常用于二分类问题的概率输出。优点:......
  • 1(5)led灯闪烁、常见ip核介绍
    内容工程设计框架采用top-down设计思路代码设计采用down-top设计思路注:由于zynq7020上面的pll输出范围不包括5,因此设置为10生成ip时线程越多速度越快生成好后在这里可以找到对应的例化模板选择I/O:上板验证:实际效果:可以观察到led灯1s翻转一次......
  • kbmMW 文件服务在android64平台下的bug
    InternalLocalChecksum,这个函数返回大于64位的结果,前64位是正常的:functionTkbmMWCustomFileClient.InternalLocalChecksum(Path:string):string;begin...Result:=kbmMWDigestToString(digest);Result:=Result.Substring(0,64);//前64位是正常的结......
  • Android开发教程案例源码分享-匹配动画多个头像飘动效果
    Android开发教程案例源码分享-匹配动画多个头像飘动效果匹配往往出现多个头像飘动,吸引人点击,有时出现的位置还不固定一、思路:用MotionLayout二、效果图:看视频更直观点:Android开发教程案例源码分享-匹配动画多个头像飘动效果三、关键代码:xml布局<?xmlversion......
  • 常见大模型——chatlm系列
    ChatGLM背景主流的预训练框架主要有三种:1、AutoRegressive自回归模型(AR模型):代表GPT。本质上是一个Left-to-Right的语言模型。通常用于生成式任务,在长文本生成方面取得了巨大的成功。当扩展到十亿级别参数时,变现出了少样本学习能力。缺点是单向注意力机制,在NLU任务中,无法......
  • 视频流媒体播放器EasyPlayer.js无插件直播流媒体音视频播放器Android端webview全屏调
    流媒体播放器的核心技术与发展趋势正在不断推动着行业的变革。未来,随着技术的不断进步和应用场景的不断拓展,流媒体播放器将为用户带来更加便捷、高效、个性化的观看体验。同时,流媒体播放器也会成为数字娱乐产业的重要组成部分,为整个行业的繁荣发展贡献更多的力量。Android端webvi......
  • 国标GB28181软件LiteGBS国标GB28181公网平台在Android端实现设备接入的语音对讲
    在智能安防领域,GB28181协议已经成为一种广泛应用的通信标准。通过该协议,可以实现不同品牌和型号的安防设备之间的互联互通。而在Android平台上实现GB28181设备接入端的语音广播和语音对讲功能,对于提升安防监控系统的实时性和交互性具有重要意义。而在功能方面,LiteGBS国标GB28181......
  • Android13修改一些默认设置
    platform:RK3588 1.导航栏选择手势方式device/rockchip/rk3588---a/overlay/frameworks/base/core/res/res/values/config.xml+++b/overlay/frameworks/base/core/res/res/values/config.xml@@-61,7+61,10@@0:3buttonmode(back,home,overviewbutt......
  • Android CoordinatorLayout使用示例记录
    原文链接:AndroidCoordinatorLayout使用示例记录-Stars-One的杂货小窝简单记录下常用CoordinatorLayout的几个效果代码示例,方便后续有需求的时候参照实现开始之前,注意下项目material版本,下文提到的某些属性是在后续版本才有的implementation("com.google.android.materia......