首页 > 编程知识 正文

mqtt协议实现,mqtt应用实例

时间:2023-05-03 13:36:56 阅读:44090 作者:4926

课程亮点MQTT协议实例MQTT协议的最佳实践和反模式MQTT协议的安全性实践AI IoT项目实战本课程详细介绍了MQTT协议的各种特性,并介绍了每个

作者介绍能干的列车,10多年的工作经验,从c语言到Web开发,从微服务架构到移动开发,涉猎广泛。 我在趋势科技诺基亚工作,在德国和硅谷的Startups工作过,现在从事物的网络方向创业。

课程大纲

适宜人群物联网平台入门感兴趣的开发者有一定经验的IM平台、移动推送平台开发者学习更多物联网的实际开发经验http://www.Sina.com/为什么要学习MQTT物联网,随着原先认为紧跟计算机、互联网的基础设施建设,特别是5G的出现,万物互联的门槛和成本进一步降低。 物联网本身也是AI和区块链APP应用的良好落地场景之一,各大云服务商也纷纷陈列物联网平台和服务。 AI和区块链热潮过后,物联网很可能成为下一个风口,风口到来之前需要做好知识储备。

物联网通信是物联网的核心内容,目前物联网的通信协议没有统一的标准,MQTT、CoAP、DDS、XMPP等较为常见,其中MQTT (消息队列遥测传输协议) 看看大型云服务公司提供的物联网套件服务吧。

阿里巴巴云

新闻云

蓝天白云

所以,要进入物联网,学习MQTT是非常必要的一步。

什么是MQTT? MQTT称为消息队列遥测传输。 1999年,IBM的Andy Stanford-Clark和Arcom的Arlen Nipper为通过卫星网络连接到管线的项目开发。 为了满足低功耗和低网络带宽的需要,MQTT协议从设计之初就具有以下特点。

在建立了可轻松提供数据传输的QoS轻量级、低占用带宽和可传输的任何类型的可保存数据的会话(session )之后,IBM一直将MQTT用作产品的内部协议。 到2010年,IBM发布了mqtt 3.1版。 2014年,MQTT协议正式成为OASIS (结构化信息标准促进组织)的标准协议。 随着多年的发展,MQTT协议的重点已不仅仅局限于嵌入式系统,而是更广泛的物联网(Internet of Things )世界。

什么是MQTT协议? 简而言之,MQTT协议具有以下特性:

基于TCP协议的APP应用层协议; 使用采用C/S体系结构的订阅/发布模式,最多只能提供一次、最少一次和一次QoS (质量服务) :它提供三种类型的消息来解除消息的发件人和收件人的绑定; 所有消息都是异步的,发送方不需要等待接收方的响应。 MQTT协议名称中有消息队列一词,但不是RabbitMQ那样的消息队列。 这是初学者最容易混淆的问题。 与传统消息队列相比,MQTT具有以下差异:

传统的消息队列要求在发送消息之前创建相应的队列。 MQTT不需要预先创建要发布的主题(可订阅的主题);在传统消息队列中,在消费者消费之前,未消耗的消息始终存储在队列中;而在MQTT中,没有从任何客户端订阅的消息在传统的消息队列中,一条消息只能由一个客户端获取。 在MQTT中,多个订户可以获取一条消息。 MQTT协议不支持单个客户端检索指定的消息。 MQTT协议能够为以大量低功率操作的网络环境中不可靠的单个因特网设备提供通信保障。 其应用范围不仅如此,在移动互联网领域也发挥着巨大的作用。 许多Android App的推送功能是基于MQTT实现的,有些IM是基于MQTT实现的。

如何学习MQTT本课程学习MQTT协议的每个特性及其最佳实践,并使用实际代码进行说明。

在学习MQTT协议的所有特性后,我们将创建IoT AI实战——来改造《物体识别:TensorFlow on Android》课的App,使其能够实时发布识别结果。 在这个过程中,读者将学习以下内容。

MQTT数据包、数据发送和接收过程是如何在Web端和移动端正确使用MQTT构建自己的MQTT中介器如何提高MQTT平台的安全性使用MQTT设计和开发IoT产品和平台的最佳实践MQTT 本课程结束后,读者具有独立构建和开发基于MQTT协议的IoT平台、实时通信系统和相关物联网产品的能力; 您也可以将本课程用作MQTT协议的参考文档,以质疑协议的内容

的时候可随时查询。

课程中使用的 MQTT 协议版本为 3.1.1,代码主要使用 MQTT 的 Node.js 实现来进行演示。

点击了解更多《MQTT 协议快速入门》

第01课:MQTT 的基础概念

在这一课中,让我们来学习 MQTT 协议的基本概念和术语,同时也会介绍一下本课程中代码的开发环境搭建。本节课核心内容包括:

MQTT 协议的通信模型MQTT ClientMQTT BrokerMQTT 协议数据包1.1 MQTT 协议的通信模型

就像我们在之前提到的,MQTT 的通信是通过发布/订阅的方式来实现的,消息的发布方和订阅方通过这种方式来进行解耦,它们没有直接地连接,它们需要一个中间方。在 MQTT 里面我们称之为 Broker,用来进行消息的存储和转发。一次典型的 MQTT 消息通信流程如下所示:

发布方将消息发送到 Broker;Broker 接收到消息以后,检查下都有哪些订阅方订阅了此类消息,然后将消息发送到这些订阅方;订阅方从 Broker 获取该消息。

在之后的课程里面,我们将发送方称为 Publisher,将订阅方称为 Subscriber。

1.2 MQTT Client

任何终端,嵌入式设备也好,服务器也好,只要运行了 MQTT 的库或者代码,我们都称为 MQTT 的 Client。Publisher 和 Subscriber 都属于 Client,Pushlisher 或者 Subscriber 只取决于该 Client 当前的状态——是在发布还是在订阅消息。当然,一个 Client 可以同时是 Publisher 和 Subscriber。

MQTT Client 库在很多语言中都有实现,包括 Android、Arduino、Ruby、C、C++、C#、Go、iOS、Java、JavaScript,以及 .NET 等。如果你要查看相应语言的库实现,可以在这里找到。

本课程中,我们主要使用 Node.js 的 MQTT Client 库来进行演示,所以需要先安装 Node.js,然后安装 MQTT Client 的 Node.js 包:

npm install mqtt -g1.3 MQTT Broker

如前面所讲的,Broker 负责接收 Publisher 的消息,并发送给相应的 Subscriber,它是整个 MQTT 订阅/发布的核心。在实际应用中,一个 MQTT Broker 还应该提供以下一些功能:

可以横向扩展,比如集群,来满足大量的 Client 接入;可以扩展接入业务系统;易于监控,满足高可用性。

我们在导读里面提到的阿里云、腾讯云、青云之类的云服务商提供的 MQTT 服务,其实就可以理解为他们提供了满足上述要求的 MQTT Broker。

在本课程中,我们使用一个公共的 MQTT Broker —— iot.eclipse.org 做演示,同时也会学习如何搭建一个 MQTT Broker。

1.4 MQTT 协议数据包

MQTT 协议的数据包格式非常简单,一个 MQTT 协议数据包由下面三个部分组成:

固定头(Fixed header):存在于所有的 MQTT 数据包中,用于表示数据包类型及对应标识,表明数据包大小;可变头(Variable header):存在于部分类型的 MQTT 数据包中,具体内容由相应类型的数据包决定;消息体(Payload):存在于部分 MQTT 数据包中,存储消息的具体数据。

接下来看一下固定头的格式,可变头和消息体我们将在讲解各种具体类型的 MQTT 协议数据包的时候 case by case 地讨论。

固定头格式:

Bit76543210字节 1MQTT 数据包类型MQTT 数据包 Flag, 内容由数据包类型指定字节 2……数据包剩余长度

固定头的第一个字节的高 4 位 bit 用于指定该数据包的类型,MQTT 的数据包有以下一些类型:

名称值方向描述Reserved0不可用保留位CONNECT1Client 到 BrokerClient 请求连接到 BrokerCONNACK2Broker 到 Client连接确认PUBLISH3双向发布消息PUBACK4双向发布确认PUBREC5双向发布收到PUBREL6双向发布释放PUBCOMP7双向发布完成SUBSCRIBE8Client 到 BrokerClient 请求订阅SUBACK9Broker 到 Client订阅确认UNSUBSCRIBE10Client 到 BrokerClient 请求取消订阅UNSUBACK11Broker 到 Client取消订阅确认PINGREQ12Client 到 BrokerPING 请求PINGRESP13Broker 到 ClientPING 应答DISCONNECT14Client 到 BrokerClient 主动中断连接Reserved15不可用保留位

固定头的低 4 位 bit 用于指定数据包的 Flag,不同的数据包类型,其 Flag 的定义是不一样的,每种数据包对应的 Flag 如下:

数据包标识位Bit 3Bit 2Bit 1Bit 0CONNECT保留位0000CONNACK保留位0000PUBLISHMQTT 3.1.1 使用DUPQoSQoSRETAINPUBACK保留位0000PUBREC保留位0000PUBREL保留位0000PUBCOMP保留位0000SUBSCRIBE保留位0000SUBACK保留位0000UNSUBSCRIBE保留位0000UNSUBACK保留位0000PINGREQ保留位0000PINGRESP保留位0000DISCONNECT保留位0000

注意:DUP、QOS、RETAIN 标识的使用将在后续的课程中详细讲解。

从固定头的第 2 字节开始是用于标识 MQTT 数据包长度的字段,最少一个字节,最大四个字节,每一个字节的低 7 位用于标识值,范围为 0~127。最高位的 1 位是标识位,用来说明是否有后续字节来标识长度。例如:标识为 0,代表为没有后续字节;标识为 1,代表后续还有一个字节用于标识包长度。MQTT 协议规定最多可以用四个字节来标识包长度。

所以这四个字节最多可以标识的包长度为:(0xFF, 0xFF, 0xFF, 0x7F) = 268435455 字节,约 256M,这个是 MQTT 协议中数据包的最大长度。

注意:Remain Length 的值不包含固定头的大小,包括第 1 字节和 Remain Length 字段。

1.5 小结

我们在这一课中学习了 MQTT 的通信模型,以及 Client 和 Broker 的概念,同时也学习了 MQTT 数据包的格式。接下来我们开始收发数据的第一步:从 Client 连接到 Broker。

相关资料:

MQTT Client 库在多种语言中的库实现

点击了解更多《MQTT 协议快速入门》

第02课:建立到 MQTT Broker 的连接(一)第03课:建立到 MQTT Broker 的连接(二)第04课:订阅与发布(一)第05课:订阅与发布(二)第06课:QoS0 和 QoS1第07课:QoS2 和 QoS 的最佳实践第08课:Retained 消息和 LWT第09课:Keep Alive 和连接保活第10课:实战 IoT+AI(一)第11课:实战 IoT+AI(二)第12课:搭建 MQTT Broker 和安全实践第13课:MQTT 5.0 协议新特性附录:常见问题解答

阅读全文: http://gitbook.cn/gitchat/column/5be4f4df2c33167c317beb8c

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。