「Android基于MQTT实现消息通知」

本文介绍了Android基于MQTT协议实现IoT设备的消息通知功能。MQTT是一种针对硬件性能有限和网络环境不稳定的场景设计的协议,适用于物联网设备。文章详细阐述了MQTT与HTTP的区别,MQTT的构成部分,以及在实际项目中的使用,包括连接配置、消息处理接口和自动重连机制。同时,还提供了数据接口回调和消息处理器的实现思路。
「Android基于MQTT实现消息通知」
一、写在前面

在对接项目中IoT时,发现目前有对MQTT做了接入,这里记录一下,官方的资料比较详细,这里主要从实现细节出发;对具体的需求以及配套的技术方案进行整理,以供参考。

一、IoT与MQTT

提到IoT(Internet of Things)、IIoT(Industrial IoT )不得不说MQTT,其被广泛的应用在物联网以及工业物联网之中,是一种消息传递协议。不同于我们所认识的平时常见的一些智能设备,如手机、电脑、平板等;这些设备一般都有着很好的计算能力,所依赖的网络环境很优质。但是一般的硬件设备性能较差,网络环境不稳定,而MQTT则是专门针对于硬件性能,网络状态不稳定场景下而生的。有着天然的优势。

二、什么是MQTT

MQTT是用于物联网的最常用的消息传递协议 (IoT)。MQTT代表MQ遥测运输。该协议是一组规则,它定义了IoT设备如何通过Internet 发布订阅数据。用于IoT和工业IoT(IIT)设备(例如嵌入式设备,传感器,工业PLC等)之间的消息传递和数据交换。协议是事件驱动的,并使用发布/订阅(PUB / SUB)模式连接设备。发布者和接收器(订阅者)通过主题通信,并 彼此分离。它们之间的连接由MQTT代理处理。MQTT代理过滤所有传入消息并将其正确分发给订阅者。

三、与传统Http的区别
  • MQTT以数据为中心,底层基于TCP链接,直接操作轻量级的二进制数据,并且数据包很小(可以小到一个字符,两个字节)。划重点,由于这个特性,其对于网络环境状态要求没有HTTP那么高,这也是为什么广泛应用于IoT设备的原因之一。
  • MQTT基于发布/订阅模式,区别于HTTP的请求/回调模式,这就决定了一个同一个设备即可以是客户端(Client)同时也可以是服务端(Server),回想发布订阅模式,消息的发布可以是1toN(N>=0),而HTTP则是1to1。
  • MQTT的发布/订阅架构决定了其无法基于UDP(面向无链接),而HTPP底层可以是基于TCP或者UDP。
  • 消息体量的区别,MQTT数据包很小,而HTTP数据量一般较大。
四、MQTT构成部分
1.Publish&Subscribe

MQTT对于发布订阅做了自身的解耦处理,主要是从三个维度出发,1.空间解耦:发布者和订阅者不需要相互了解(例如,没有IP地址和端口的交换)。2.时间解耦:发布者和订阅者不需要同时运行。3.同步解耦:在发布或接收期间,两个组件的操作不需要中断。详细信息

2.Client、Broker

详细信息

3.Topics&Best Practices

主要需要注意Topics的匹配规则,分为单项通配符,与多项通配符。单项以 + 连接:this/is/+/single,其中仅仅 + 部分可以被替换为单个路径(以 / 分割)。多项通配符仅支持在尾端支持:this/is/multi/#,并且是多级的。

详细信息

4.Keep Alive

保活时效,包括其他的字段,官方文档都给出了很详细的解释,认真了解一项技术实现,官方的文档还是最好的选择文档。这里主要基本认识MQTT是个什么东西,具体的实现细节与规范也不是一两句话可以说的清楚的,且可能存在误导的风险。MQTT

五、MQTT实际项目中的使用
1.实现什么需求?

以实际的项目为例,现需要实现的功能有:

  • 服务端下发消息通知到IoT设备,消息以Type区分,不同的消息需对应不同的处理措施。
  • 根据消息的不同,有语音播放、叫号、本地数据更新、服务端配置下发。

功能相对很简单,总结就是服务端推送消息,设备根据消息做出响应。

2.具体实现方案

导入依赖

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

主要分为几个类:a.主体请求Client,b.数据返回的回调dataCallback,c.链接状态回调connectCallback,d.具体消息处理策略IHandler。方案主要就包括这几个大类,逐步实现各个细节。

3.数据接口回调IDataCallback
interface IDataCallback {
   
   
  fun connectionError(cause: Throwable?)
  fun dataMessage(dataMessage: String)
}
4.连接状态回调IConnectionCallback
interface IConnectionCallback {
   
   
  fun connectSuccess()
  fun connectFail(reason: Throwable?)
}
5.CMqttClient链接类

在实现之前,列举几个关键的参数,参数配置在MqttConnectOptions

val options = MqttConnectOptions()
//默认为true,表示非持久订阅,无论服务端或者客户端重启,不会保持状态,重启后指定消息也无法送达
//设置为false,表示持久订阅,服务端与客户端重启或重链,指定消息可以送达
options.isCleanSession 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐二狗呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值