莱莱 发表于 2024-9-8 02:28:08

Android使用MQTT

目录
MQTT
MQTT通信流程
第三方MQTT服务
使用步骤
使用留意事项
使用MQTT题目
前言
        本文是一个学习过程记录。
MQTT

        MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,常用于物联网(IoT)应用中。
        MQTT协议中有三种身份:发布者(Publish)、署理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息署理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和载荷(payload)两部门:


[*]Topic(主题):消息的范例,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);它是消息的标识符,用于指定消息的范例或者位置。主题是一个由层级结构构成的字符串,使用斜杠(/)作为分隔符。例如,home/bedroom/temperature 是一个主题,用于表示卧室的温度数据。在MQTT中,发布者发布消息到特定的主题,而订阅者通过订阅主题来接收干系消息。
[*]Payload(载荷):是实际的消息内容。它可以是任何范例的数据,例如文本、JSON、二进制数据等。发布者将消息发送到特定的主题时,将携带一个载荷,订阅者接收到消息后,可以从载荷中提取所需的数据。
        当应用数据通过MQTT网络发送时,MQTT会把与之干系的服务质量(QoS)和主题名(Topic)干系连。
QoS(服务质量):QoS界说了消息传递的可靠性级别。MQTT支持三个QoS级别:


[*]QoS 0(最多一次):消息尽最多一次传递。消息不会进行确认,也不会重传。适用于实时性要求不高的数据,可能会丢失消息。
[*]QoS 1(至少一次):消息至少传递一次,确保消息至少被接收一次。如果消息未收到确认,会进行重传。适用于需要确保消息不丢失,但可以重复传输的环境。
[*]QoS 2(仅一次):消息只传递一次,确保消息仅被接收一次。会进行两阶段确认,确保消息的准确传递。适用于要求非常高的数据完整性的环境。

使用MQTT参考SDK,一步一步利用来也可以完成,EMQX SDK使用指南:Android 使用 Kotlin 连接 MQTT | EMQ
这篇文章讲的非常清楚:
Android使用MQTT订阅及发布消息((一)开端了解Mqtt以及实现Android利用mqtt服务)_android mqtt-CSDN博客 ​​​​​​


MQTT通信流程


[*]Publisher发布消息到Broker。
[*]Broker接收消息并根据主题将消息路由给相应的Subscriber。
[*]Subscriber接收到消息并处置惩罚。
第三方MQTT服务


[*]使用EMQX,15天免费,网站:EMQX
[*]EMQX SDK使用指南:Android 使用 Kotlin 连接 MQTT | EMQ
[*]这里使用 专有版,如果使用 serverless,进行测试连接会报错 Unregister alarmreceiver tohttps://i-blog.csdnimg.cn/blog_migrate/2150e0fb1a5b74925e7c983168ec459d.png
使用步骤


[*]引入依赖
[*]先连接
[*]订阅
[*]发布
[*]取消订阅
[*]取消连接
使用留意事项

        在连接的时间,万万别忘记tcp://,否则会连接失败。
val serverURI = "tcp://b601afc1.ala.dedicated.aliyun.emqxcloud.cn:1883"         使用只需要创建一个【客户端认证】,当作连接账号和密码。其他一概不用利用
https://i-blog.csdnimg.cn/blog_migrate/4336711c48fe9deeb6fbb2ef1c223832.png
使用MQTT题目

这个播客已经办理:Android——Failed resolution of: Landroid/support/v4/content/LocalBroadcastManager-CSDN博客
题目1、java.lang.NoClassDefFoundError: Failed resolution of:Landroid/support/v4/content/LocalBroadcastManager;
FATAL EXCEPTION: main
Process: com.dfg.mqtt, PID: 5049
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 com.dfg.mqtt.MainActivity.connect(MainActivity.kt:74)
at com.dfg.mqtt.MainActivity.onCreate$lambda$0(MainActivity.kt:29)
at com.dfg.mqtt.MainActivity.$r8$lambda$lscMx1wR-Gmz1hZBIc0L-o8IfBI(Unknown Source:0)
at com.dfg.mqtt.MainActivity$$ExternalSyntheticLambda0.onClick(Unknown Source:2)
at android.view.View.performClick(View.java:6599)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1202)
at android.view.View.performClickInternal(View.java:6576)
at android.view.View.access$3100(View.java:780)
at android.view.View$PerformClick.run(View.java:25899)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6819)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.LocalBroadcastManager" on path: DexPathList[,nativeLibraryDirectories=]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312) 办理:
1、往build.gradle引入
implementation "com.android.support:support-v4:30.4.1" 2、gradle.properties加入
android.enableJetifier=true 3、Sync编译题目办理

我写的功能:GitHub - Fugui-Dai/MQTT

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Android使用MQTT