在对接项目中 IoT 时,发现目前有对 MQTT 做了接入,这里记录一下,官方的资料比较详细,这里主要从实现细节出发;对具体的需求以及配套的技术方案进行整理,以供参考。
提到 IoT(Internet of Things)、IIoT(Industrial IoT ) 不得不说 MQTT ,其被广泛的应用在物联网以及工业物联网之中,是一种消息传递协议。不同于我们所认识的平时常见的一些智能设备,如手机、电脑、平板等;这些设备一般都有着很好的计算能力,所依赖的网络环境很优质。但是一般的硬件设备性能较差,网络环境不稳定,而 MQTT 则是专门针对于硬件性能,网络状态不稳定场景下而生的。有着天然的优势。
详细信息
主要需要注意 Topics 的匹配规则,分为单项通配符,与多项通配符。单项以 + 连接:this/is/+/single,其中仅仅 + 部分可以被替换为单个路径(以 / 分割)。多项通配符仅支持在尾端支持:this/is/multi/#,并且是多级的。
详细信息
保活时效,包括其他的字段,官方文档都给出了很详细的解释,认真了解一项技术实现,官方的文档还是最好的选择文档。这里主要基本认识MQTT是个什么东西,具体的实现细节与规范也不是一两句话可以说的清楚的,且可能存在误导的风险。MQTT
以实际的项目为例,现需要实现的功能有:
功能相对很简单,总结就是服务端推送消息,设备根据消息做出响应。
导入依赖
主要分为几个类:a主体请求 Client ,b数据返回的回调 dataCallback ,c链接状态回调 connectCallback ,d具体消息处理策略 IHandler 。方案主要就包括这几个大类,逐步实现各个细节。
在实现之前,列举几个关键的参数,参数配置在 MqttConnectOptions 中
关于自动重新连接有三个必要条件, cleanSession 需要设置为 false , isAutomaticReconnect 需要设置为 true ,并且初始 已经连接过 。划重点,这里就要求, MQTT 虽然可以自动重试连接当时必须有这三个前提,那么首次由于网络等其他原因,这里的重试机制是需要我们自身去实现的,也就是需要保证首次能够连接到服务端。源码以及注释:
需要注意的是这里的 ClientId ,是唯一性的,像 IoT 设备以设备 deviceId 作为 ClientId ,如果换成用户 userId ,当在多设备登录的情况下,那么重试等其他一些机制会影响预期结果,给排查问题带来一定的难度。
消息体中会包含不同的 type ,根据不同的 type 实现不同的处理器,当然为了灵活还要借助 注解机制 。
通过反射的方式加载对应的 IHandler 实现类,核心代码
使用时,直接加上注解:
整个流程的主要部分已经给出,核心是通过不同的消息 type 查找出对应的 处理器 ;当然这部分主要是由注解完成的,对于处理器的查找则是通过 反射 的方式来进行匹配的。
MQTT官网
两者虽然都是从传统的Pub/Sub消息系统演化出来的,但是进化的方向不一样,以下是几个比较突出的点:Kafka是为了日志收集的场景,抛弃exact once的语义而支持at least once以便得到更高的可扩展性。
MQTT是为了物联网场景而优化,不但提供多个QoS选项(exact once、at least once、at most once),而且还有层级主题、遗嘱等等特性。
说白了都是传统消息系统(老爸)的子嗣,只是与不同的场景(老妈)结合的产物。MQTT:MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。
物联网(TheInternetofThings,简称IOT)是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、连接、互动的物体或过程,采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络。最近应系统功能需求,采购了一款云喇叭的物联网设备,就是插着4G卡那种,可以播放各种语音,仔细阅读了开发文档之后发现使用的是MQTT的协议,记录一下在对接中遇到的各种问题
MQTT是一个轻量的发布订阅模式消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用设计。
MQTT特点:
阿里云的MQTT有两个版本,这里只说没有RocketMQ依赖的311及以上版本。
这里会自动生成用户名密码
MQTT (Message Queuing Telemetry Transport,消息队列遥测传输) 是一种基于 TCP/IP 协议族的应用层协议。MQTT 协议是专门针对硬件性能低下 & 网络状况不稳定的场景设计的,这使得 MQTT 在物联网和移动应用等受限场景得到广泛应用。
目前,MQTT 主要分为两个大版本:
物联网和移动应用场景的特点是硬件性能低下和网络状况不稳定,而 MQTT 协议就是专门针对这种环境设计的,主要在四个方面有优势:
结论:这三种协议并没有绝对的优胜者,最好的协议取决于具体的需求和限制条件。但如果只从带宽、电池、功能多样性这些基本条件看,MQTT 在其中是更占优的选择。
MQTT 协议的设计特性中包含了一项 “高可靠性交付”,它需要一个保证可靠的底层传输层协议,因此 TCP 协议、TLS 协议、WebSocket 协议都可以作为 MQTT 的底层协议。而无连接的 UDP 协议会丢失或重排数据,不能满足 MQTT 协议的传输需要。
MQTT 是基于发布 - 订阅模型 (pub/sub) 的消息传递协议,与请求 - 响应模型不同,发布 - 订阅模型主要有三种角色: publisher & subscriber & subscriber :
当 client 发布某个主题的消息时,broker 会将该消息分发给任何已订阅该主题的 client。通常来说,client 不会存储消息,一旦消息被发送到这些 client,消息就会从 broker 上删除。另外,保留消息、持久连接和服务质量 QoS 可能会导致消息临时存储在 broker 上。
发布 - 订阅模式使得 消息的发布者和订阅者解耦 ,主要体现为空间解耦和时间解耦:
引用自 >
这里我们使用了一个库: PubSubClient
创建产品
创建新设备
(1) 产品ID, 用户ID,和登录key
(2) 设备名称, ID和 设备key
OneNet MQTTS用携带token的方式进行鉴权
访问者(可以为应用或者设备)固化访问密钥于软件中,在需要进行服务访问时,通过密钥计算临时token,通过临时token进行服务访问认证
访问者首先通过访问管理者获取临时访问token,访问管理者可根据需要自定义该token的访问有效期(即过期时间),访问者获取该token后方才能访问OneNET
访问管理者直接将密钥授权给访问者(例如,直接为设备烧写key),访问者通过密钥生成token进行访问
计算方法: >
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)