返回顶部
首页 > 资讯 > 移动开发 >AndroidMQTT与WebSocket协议详细讲解
  • 506
分享到

AndroidMQTT与WebSocket协议详细讲解

AndroidMQTT与WebSocketAndroidWebSocket协议AndroidMQTT协议 2022-11-13 19:11:16 506人浏览 独家记忆
摘要

目录MQTTwebsocket总结MQtT MQTT是一个极其轻量级的发布/订阅消息传输协议,对于需要较小代码占用空间或网络带宽非常宝贵的远程连接非常有用 有如下特点: 开放消息协议

MQtT

MQTT是一个极其轻量级的发布/订阅消息传输协议,对于需要较小代码占用空间或网络带宽非常宝贵的远程连接非常有用

有如下特点:

  • 开放消息协议,简单易实现;
  • 发布订阅模式,一对多消息发布;
  • 基于tcp/IP网络连接,提供有序,无损,双向连接;
  • 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量;
  • 消息QoS支持,可靠传输保证。

添加依赖

        Maven { url "https://repo.eclipse.org/content/repositories/paho-snapshots/" }

    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
    implementation 'org.eclipse.paho:org.eclipse.paho.Android.service:1.1.1'

首先,连接服务器,SERVER_HOST为主机名,CLIENT_ID为客户端唯一标识,还需要用户名和密码,当然,这些一般由服务器返回。

    fun connect() {
        try {
            //MemoryPersistence设置clientId的保存形式,默认为以内存保存
            client = MqttAsyncClient(SERVER_HOST, CLIENT_ID, MemoryPersistence())
            //MQTT连接设置
            options = MqttConnectOptions()
            with(options) {
                //是否清空session,true表示每次连接到服务器都以新的身份,false表示服务器会保留客户的连接记录
                isCleanSession = true
                //用户名和密码
                userName = USERNAME
                passWord = PASSWORD.toCharArray()
                //超时时间,单位是秒
                connectionTimeout = 30
                //会话心跳时间,单位是秒,服务器每隔30秒向客户端发送消息判断客户端是否在线
                keepAliveInterval = 30
            }
            //设置回调
            client!!.setCallback(PushCallBack())
            client!!.connect(options, context, iMqttActionListener)
        } catch (e: MqttException) {
            e.printStackTrace()
        }
    }

心跳包:在空闲时间内,如果客户端没有其他任何报文发送,必须发送一个PINGREQ报文到服务器,而如果服务端在 1.5 倍心跳时间内没有收到客户端消息,则会主动断开客户端的连接,发送其遗嘱消息给所有订阅者,而服务端收到PINGREQ报文之后,立即返回PINGRESP报文给客户端。

如果两个客户端的 clientID 一样,那么服务端记录第一个客户端连接之后再收到第二个客户端连接请求,则会向第一个客户端发送 Disconnect 报文断开连接,并连接第二个客户端。

遗嘱消息:MqttConnectOptions的setWill方法可以设置遗嘱消息,客户端没有主动向服务端发起disconnect断开连接消息,但服务端检测到和客户端的连接已断开,此时服务端将该客户端设置的遗嘱消息发送出去,遗嘱Topic中不能存在通配符。

应用场景:客户端掉线之后,可以及时通知到所有订阅该遗嘱topic的客户端。

订阅消息。

    fun subscribeMessage(topic: String, qos: Int) {
        client?.let {
            try {
                it.subscribe(topic, qos)
            } catch (e: MqttException) {
                e.printStackTrace()
            }
        }
    }

MQTT是一种发布/订阅的消息协议, 通过设定的主题topic,发布者向topic发送的payload负载消息会经过服务器,转发到所有订阅该topic的订阅者。topic有两个通配符,“+” 和 “#”,与 “/” 组合使用,“+” 只能表示一级topic,“#” 可以表示任意层级,例如,订阅topic为 “guangdong/+”,发布者发布的topic可以是 guangdong,guangdong/shenzhen,但是不能是guangdong/shenzhen/nanshan,而订阅的topic如果是 “guangdong/#” 则可以收到。

Qos为服务质量等级,qos=0,表示发送方只发一次,不管是否发成功,也不管接收方是否成功接收,适用于不重要的数据传输;qos=1,表示消息至少有一次到达接收方,发送方发送消息,需要等待接收方返回应答消息,如果发送方在一定时间内未收到应答,发送方将继续发送,直到收到应答消息,删除本地消息缓存,不再发送。适用于需要收到所有消息,客户端可以处理重复消息;qos = 2:确保消息只一次到达接收方,一般我们都会选择2。

发布消息

    fun publish(topic: String, msg: String, isRetained: Boolean, qos: Int) {
        try {
            client?.let {
                val message = MqttMessage()
                message.qos = qos
                message.isRetained = isRetained
                message.payload = msg.toByteArray()
                it.publish(topic, message)
            }
        } catch (e: MqttPersistenceException) {
            e.printStackTrace()
        } catch (e: MqttException) {
            e.printStackTrace()
        }
    }

payload为负载消息,字节流类型,是 MQTT 通信传输的真实数据。retain是保留信息,服务端将保留对应topic最新的一条消息记录,保留消息的作用是每次客户端连上都会收到其topic的最后一条保留消息。

整个封装类如下:

class MQTTManager private constructor(private val context: Context) {
    private var client: MqttAsyncClient? = null
    private lateinit var options: MqttConnectOptions
    private val iMqttActionListener = object : IMqttActionListener {
        override fun onSuccess(asyncActionToken: IMqttToken?) {
            //连接成功,开始订阅
            subscribeMessage(TOPIC, 2)
        }
        override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
            //连接失败
        }
    }
    compaNIOn object {
        @Volatile
        private var instance: MQTTManager? = null
        fun getInstance(context: Context): MQTTManager = instance ?: synchronized(this) {
            instance ?: MQTTManager(context).also {
                instance = it
            }
        }
    }
    
    fun connect() {
        try {
            //MemoryPersistence设置clientId的保存形式,默认为以内存保存
            client = MqttAsyncClient(SERVER_HOST, CLIENT_ID, MemoryPersistence())
            //MQTT连接设置
            options = MqttConnectOptions()
            with(options) {
                //是否清空session,true表示每次连接到服务器都以新的身份,false表示服务器会保留客户的连接记录
                isCleanSession = true
                //用户名和密码
                userName = USERNAME
                password = PASSWORD.toCharArray()
                //超时时间,单位是秒
                connectionTimeout = 30
                //会话心跳时间,单位是秒,服务器每隔30秒向客户端发送消息判断客户端是否在线
                keepAliveInterval = 30
                //自动重连
                isAutomaticReconnect = true
            }
            //设置回调
            client!!.setCallback(PushCallBack())
            client!!.connect(options, context, iMqttActionListener)
        } catch (e: MqttException) {
            e.printStackTrace()
        }
    }
    
    fun subscribeMessage(topic: String, qos: Int) {
        client?.let {
            try {
                it.subscribe(topic, qos)
            } catch (e: MqttException) {
                e.printStackTrace()
            }
        }
    }
    
    fun publish(topic: String, msg: String, isRetained: Boolean, qos: Int) {
        try {
            client?.let {
                val message = MqttMessage()
                message.qos = qos
                message.isRetained = isRetained
                message.payload = msg.toByteArray()
                it.publish(topic, message)
            }
        } catch (e: MqttPersistenceException) {
            e.printStackTrace()
        } catch (e: MqttException) {
            e.printStackTrace()
        }
    }
    
    fun disconnect() {
        client?.takeIf {
            it.isConnected
        }?.let {
            try {
                it.disconnect()
                instance = null
            } catch (e: MqttException) {
                e.printStackTrace()
            }
        }
    }
    
    fun isConnected() = if (client != null) client!!.isConnected else false
    inner class PushCallBack : MqttCallback {
        override fun connectionLost(cause: Throwable?) {
            //断开连接
        }
        override fun messageArrived(topic: String?, message: MqttMessage?) {
            //接收消息回调
        }
        override fun deliveryComplete(token: IMqttDeliveryToken?) {
            //发布消息完成后的回调
        }
    }
}

WEBSocket

WebSocket是应用层的一种协议,是建立在TCP协议基础上的,主要特点就是全双工通信,允许服务器主动发送信息给客户端。

这里使用OKHttp进行WebSocket开发

class WebSocketManager private constructor() {
    private val client: OkHttpClient = OkHttpClient.Builder().writeTimeout(5, TimeUnit.SECONDS)
        .readTimeout(5, TimeUnit.SECONDS)
        .connectTimeout(5, TimeUnit.SECONDS)
        .build()
    private var webSocket: WebSocket? = null
    companion object {
        val instance: WebSocketManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { WebSocketManager() }
    }
    fun connect(url: String) {
        webSocket?.cancel()
        val request = Request.Builder().url(url).build()
        webSocket = client.newWebSocket(request, object : WebSocketListener() {
            //连接成功后回调
            override fun onOpen(webSocket: WebSocket, response: Response) {
                super.onOpen(webSocket, response)
            }
            //服务器发送消息给客户端时回调
            override fun onMessage(webSocket: WebSocket, text: String) {
                super.onMessage(webSocket, text)
            }
            //服务器发送的byte类型消息
            override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
                super.onMessage(webSocket, bytes)
            }
            //服务器连接关闭中
            override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
                super.onClosing(webSocket, code, reason)
            }
            //服务器连接已关闭
            override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
                super.onClosed(webSocket, code, reason)
            }
            //服务器连接失败
            override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
                super.onFailure(webSocket, t, response)
            }
        })
    }
    //发送消息
    private fun sendMessage(message: String) {
        webSocket?.send(message)
    }
    private fun close(code: Int, reason: String) {
        webSocket?.close(code, reason)
    }
}

总结

WebSocket是一种简单的报文协议,着重解决客户端与服务端不能双向通信的问题。

MQTT是基于TCP的发布/订阅消息传输协议,客户端可以创建和订阅任意主题,并向主题发布或接收消息,此外,有许多为物联网优化的特性,比如服务质量等级Qos,层级主题,遗嘱信息等。

MQTT和WebSocket都是应用层协议,都使用TCP协议来确保可靠传输,都支持双向通信,都使用二进制编码。WebSocket更简单灵活,MQTT相对复杂,但功能强大,大家可以根据自己的使用场景来选择 。

到此这篇关于Android MQTT与WebSocket协议详细讲解的文章就介绍到这了,更多相关Android MQTT与WebSocket内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: AndroidMQTT与WebSocket协议详细讲解

本文链接: https://lsjlt.com/news/170510.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • AndroidMQTT与WebSocket协议详细讲解
    目录MQTTWebSocket总结MQTT MQTT是一个极其轻量级的发布/订阅消息传输协议,对于需要较小代码占用空间或网络带宽非常宝贵的远程连接非常有用 有如下特点: 开放消息协议...
    99+
    2022-11-13
    Android MQTT与WebSocket Android WebSocket协议 Android MQTT协议
  • JavaTCP协议通信超详细讲解
    目录什么是tcp服务端客户端服务端与客户端代码实现实例什么是tcp Tcp通信有两个特点分别是面向连接,具有可靠性. 面向连接:指的是客户端与服务端之间的连接,在通信之前会有三次握手...
    99+
    2024-04-02
  • 详细讲解HTTP协议工作方式
    目录HTTP协议简介HTTP协议概述HTTP工作原理基于 请求-响应 的模式无状态保存无连接HTTP请求方法GETHEADPOSTPUTDELETETRACEOPTIONSCONN...
    99+
    2024-04-02
  • JavaTCP网络通信协议详细讲解
    TCP与UDP都属于TCP/IP协议 TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的...
    99+
    2024-04-02
  • WebSocket协议与HTTP协议的差异与联系
    引言:随着互联网的普及,Web应用的需求不断增加,为了实现实时交互和推送功能,新的通信协议WebSocket应运而生。而传统的HTTP协议也在这个过程中逐渐被WebSocket取代。本文将重点探讨WebSocket协议与HTTP协议的差异与...
    99+
    2023-10-21
    Http websocket 差异与联系
  • WebSocket协议与TCP协议的对比与选择
    在网络通信中,TCP协议是一种可靠的传输协议,广泛应用于各种网络通信场景。而WebSocket协议则是一种基于HTTP的应用层协议,它提供了双向通信的能力,使得客户端和服务器之间可以实时地进行数据交互。本文将对WebSocket协议和TCP...
    99+
    2023-10-21
    它提供可靠的数据传输 错误检测和拥塞控制。
  • http协议详解(超详细)
    http1. 基础概念篇1.1 介绍  HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Intern...
    99+
    2023-06-04
  • HTTP协议详细解读
    文章目录 1. HTTP概念2. HTTP 特点3. HTTP 协议的工作过程4. 认识URL5. HTTP 请求数据格式6. HTTP 响应数据格式7. 总结📂橙子精品文章学习推荐 1. HTTP概念 HTTP...
    99+
    2023-08-16
    http java 网络
  • 存储协议——FC协议讲解
    目录 FC基础概念 FC协议结构 FC通信 FC交换网络工作流程:(以封装SCSI协议为例) FC拓扑结构 FC协议的端口类型 FC适配器(FC HBA卡) FC基础概念 FC最开始为一种传输协议,由于其性能较高,逐渐发展到前端作为主机接...
    99+
    2023-09-18
    存储 网络 网络协议
  • HTTP协议详细介绍
    我们日常生活中经常会使用浏览器访问Web站点这个过程中到底发生了什么吗?为什么我们在浏览器地址栏上面输入要访问的URL后就可以访问到Web页面呢?这几乎是面试过程中的高频问题。 简单...
    99+
    2024-04-02
  • WebSocket协议的优势与劣势分析
    WebSocket协议是一种在客户端和服务器之间实现双向通信的协议,它与传统的HTTP协议相比,具有许多优势和劣势。本文将对WebSocket协议的优势与劣势进行分析,并给出一些具体的代码示例。一、WebSocket协议的优势:双向通信:W...
    99+
    2023-10-21
    协议 优势 优势:WebSocket 劣势:WebSocket
  • WebSocket协议的限制与可行性分析
    摘要:随着互联网的快速发展,实时性要求越来越高的应用也越来越多。WebSocket协议作为一种全双工通信协议,被广泛应用于实时通信和即时通讯领域。但是,WebSocket协议也存在一些限制,本文将对WebSocket协议的限制进行分析,并探...
    99+
    2023-10-21
    websocket 限制 可行性分析
  • Telnet协议详解
    目录 1、Telnet协议 2、telnet协议的基本概念 1、NVT(Network Virtual Terminal)网络虚拟终端  2、telnet连接 3、telnet的C/S模式 3、telnet的工作原理 1、Telnet协议 ...
    99+
    2023-09-09
    服务器 网络 linux
  • FTP协议详解
    文章目录 1 FTP概述2 实验环境3 FTP详解3.1 文件传输过程3.2 报文格式3.3 数据连接3.4 主动模式3.5 被动模式3.6 匿名服务器 4 总结 链接: C/C...
    99+
    2023-10-06
    服务器 网络 linux
  • DHCP协议详解
    DHCP是什么 1.1 DHCP定义 DHCP( Dynamic Host Configuration Protocol, 动态主机配置协议)定义: 存在于应用层(OSI) 前身是BOOTP(Bootstrap P...
    99+
    2023-10-12
    网络 服务器 网络协议 DHCP DHCP6 Powered by 金山文档
  • https协议详解
    目录HTTPS协议概念HTTPS通信(握手)过程HTTPS的优缺点优点:缺点:HTTPS如何保证安全对称加密:非对称加密:TLS/SSL的工作原理TLS/SSL概述TLS/SSL功能...
    99+
    2022-11-13
    什么是https协议 HTTPS协议详解 HTTPS协议基础知识
  • ARP协议详解
    目录 ARP概述ARP协议的定义物理地址逻辑地址为什么需要2级地址 ARP工作原理如何建立ARP高速缓存使用ARP协议的4种不同情况高速缓存的生存周期 ARP报文格式封装ARP协议抓包分析抓取ARP请求报文抓取ARP响应报文...
    99+
    2023-08-21
    网络 服务器 linux 网络协议
  • android websocket快速上手使用和详细讲解
    1、快速使用 项目中的使用,以github的开源库org.java-websocket:Java-WebSocket:1.3.8为例,并且封装了...
    99+
    2022-06-06
    websocket Android
  • WebSocket和HTTP协议的性能比较与选择
    引言:在web应用开发中,无论是实时聊天应用、多人在线游戏还是实时数据传输,网络连接的稳定性和传输效率都是关键要素之一。目前,WebSocket和HTTP是两种常用的网络传输协议,它们在性能和功能上有较大的差异。本文将重点讨论WebSock...
    99+
    2023-10-21
    websocket HTTP协议 关键词: 性能比较与选择
  • Netty与NIO超详细讲解
    目录Linux下的五种I/O模型阻塞IO的流程IO复用信号驱动I/O异步IONIOI0多路复用NIO核心组件使用Java原生API实现NIO操作Redis为什么支持高并发Linux下...
    99+
    2022-11-13
    Netty NIO模型 Netty NIO原理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作