应用层是指OSI Level 5、6、7,是TCP-IP模型中的应用层。在物联网架构中,这一层位于服务发现层之上。它是从客户端延伸的体系结构中的最高层。它是终端设备和网络之间的接口。该层通过设备端的专用应用程序实现。与计算机一样,应用层由浏览器实现。浏览器实现了HTTP、HTTPS、SMTP、FTP等应用层协议。同样,也有在物联网上下文中指定的应用层协议。
该层负责数据格式化和表示。Internet 中的应用层通常基于 HTTP 协议。但是,HTTP 不适合资源受限的环境,因为它非常重量级,因此会产生很大的解析开销。因此,已经为物联网环境开发了许多替代协议。一些流行的物联网应用层协议如下 -
• MQTT
• SMQTT
• CoAP
• DDS
• XMPP
• AMQP
• RESTful HTTP
• MQTT-SN
• STOMP
• SMCP
• LLAP
• SSI
• LWM2M
• M3DA
• XMPP-IOT
• ONS 2.0
• SOAP
• Websocket
• Reactive Streams
• HTTP/2
• JavaScript IOT
MQTT – 消息队列遥测传输是一种轻量级消息传递协议。它使用发布-订阅通信方式,这就是它用于 M2M(机器对机器)通信的原因。它基于 TCP-IP 协议,设计用于在有限的带宽内运行。在协议术语中,有限的网络带宽被称为“小代码足迹”。但是,规范中并没有明确限制网络带宽的确切含义。
该协议专为传感器网络和无线传感器网络而设计。MQTT 允许设备向服务器发送或发布关于给定主题的数据信息。发布者和订阅者之间有一个 MQTT 代理(Broker-Mosquitto)。经纪人然后将信息传输给先前订阅的客户。
传感器与代理接口,代理是读取和发布传感器数据的物联网设备或服务器。订阅和请求传感器数据的其他设备称为客户端。传感器本身在网络中被称为发布者。客户端可以是笔记本电脑、智能手机、平板电脑或其他移动设备。客户端设备需要订阅网络中的代理才能接收传感器数据。为了接收数据,订阅的客户端设备必须与代理建立连接并请求数据。代理从发布者(无线传感器)获取数据并将其发送给请求它的客户端。即使在发出请求后与客户端设备的连接断开,代理也会将数据保存在缓存中,以便当客户端设备与代理重新连接时,它可以接收请求的传感器数据。类似地,如果发布者和代理之间的连接在发出请求后断开,则代理转发发布者发送的适当指令,以便客户端设备可以重新连接并接收请求的数据。
因此,即使由于网络带宽有限,代理与发布者或代理与客户端之间的连接中断,MQTT 也能正常运行。这种处理网络延迟或等待时间的能力使该协议非常适合无线网络。
91874897f00a450b824f1e4dc846f23e~noop.image?_iz=58558&from=article.jpg

MQTT 会话可以分为四个阶段 –
1)连接
2)认证
3)沟通
4) 终止
连接和身份验证——在此阶段,客户端(如移动设备或笔记本电脑)使用标准端口或网络运营商定义的端口启动与代理(服务器)的 TCP-IP 连接。标准端口通常是 1883 用于非加密通信,8883 用于通过 SSL 或 TLS 进行加密通信。在加密通信中,服务器向客户端发送服务器证书来验证自己,客户端也可以向服务器发送证书来验证自己。尽管即使在加密通信中,客户端身份验证也不是规范的一部分,也不常见。尽管如此,通常,客户端身份验证是通过客户端将用户名和密码传递给代理(服务器)来完成的。
通信——传感器数据使用小代码足迹传送给客户端。虽然术语“小代码足迹”并未在协议中明确指定,但它通常包含 2 字节长的标头、一个可选的可变长度标头、作为消息有效负载的传感器数据(大小限制为 250 Mb)和服务质量级别指示。可以存在三个服务质量 (QoS) 级别 - 未确认服务(QoS 级别 0)、确认服务(QoS 级别 1)和保证服务(QoS 级别 2)。每个超过 QoS 级别都需要更多的网络带宽和对延迟的容忍度。
客户端可以执行四种类型的操作——发布、订阅、取消订阅和 ping。客户端可以订阅网络中的特定主题,就像移动设备可以订阅经纪人以读取城市的当前温度一样。对于订阅,客户端需要向代理发送一个 SUBSCRIBE/SUBACK 数据包对。同样,为了取消订阅(从主题),客户端需要向服务器发送 UBSUBSCRIBE/UNSUBACK 数据包对。客户端设备可以执行 ping 操作以检查与代理的实时连接。在发布操作中,数据在代理和客户端之间就特定主题进行通信。
4) 终止——发布者或客户端可以通过向代理发送 DISCONNECT 消息来终止连接,之后 TCP-IP 连接将关闭。如果连接在没有终止请求的情况下突然断开(由于网络带宽有限),代理会将缓存的消息从发布者发送到客户端。
SMQTT – 基于 MQTT,安全消息队列遥测传输 (SMQTT) 协议是一种基于加密的轻量级消息传递协议。与 MQTT 会话相比,SMQTT 会话有四个阶段——设置、加密、发布和解密。它具有类似于 MQTT 的基于代理的架构,但是,在此协议中,订阅者和发布者都需要使用秘密主密钥向代理注册。数据在发布者发布之前也被加密,然后在订阅者端解密。开发者可以使用任何加密算法。
CoAP – 受限应用程序协议专为受限(受限)硬件而设计。不支持 HTTP 或 TCP/IP 的硬件可以使用 CoAP 协议。因此,该协议的设计者基本上是受 HTTP 的启发,使用 UDP 和 IP 协议设计了 CoAP 协议。它是一种轻量级协议,需要低功耗物联网应用,例如电池供电的物联网设备之间的通信。与 HTTP 一样,它也遵循客户端-服务器模型。客户端可以通过网络获取、放置、删除或发布信息资源。
CoAP 使用两种消息类型——请求和响应。消息包含一个基本标头,后跟消息体,其长度由数据报指定。消息或数据包的尺寸很小,因此它们可以在约束设备之间通信而不会丢失数据。消息可以是可确认的或不可确认的。对于可确认消息,客户端需要在收到数据包后以确认响应。请求消息可以包含查询字符串以实现其他功能,如搜索、排序或分页。
为了安全起见,该协议使用基于 UDP 的数据报传输层安全性 (DTLS)。在 HTTP 中,了解变量的新状态非常复杂。在 HTTP 中,客户端必须一次又一次地进行轮询,这意味着客户端必须每秒每一次都询问是否有任何新的变量状态正在观察。在 CoAP 中,CoAP 服务尝试通过创建观察标志来解决问题,因此如果原始设备使用 GET 命令发送观察标志,则每次服务器或其他设备看到变量状态发生变化时服务器或设备会将推送通知发送给实际找到观察者标志的原始设备。
该协议还为客户端设备的资源发现提供了一种额外的机制。服务器必须提供资源列表以及可以作为链接或应用程序媒体类型访问的元数据。通过浏览列表,客户端可以找到可用的资源(信息或数据)并发现他们的媒体类型。
网络中的传感器节点本身充当服务器而不是客户端。传感器可直接路由,数据通信在传感器和客户端设备之间是一对一的。为了实施此协议,传感器必须能够接收数据包并能够对其做出响应。
DDS – 由对象管理组 (OMG) 设计,数据分发服务是用于实时系统的 M2M 应用层协议。基于像 MQTT 这样的发布 - 订阅模式,协议架构具有配置为发布者、订阅者或两者的节点。该协议不需要任何网络中间件,因此发布者可以发布有关特定主题的信息(例如温度传感器可以发布某个位置的当前温度)并且协议本身设法将其传递给订阅者(例如显示当前温度的移动设备)一个位置)。该协议的实施不需要任何网络编程,因为该协议不需要验证节点的存在或位置,也不需要确认消息传递。
XMPP – 可扩展消息传递和状态协议 (XMPP) 是一种基于 XML 的消息传递协议。XML 是一种标记语言,用于对人类可读和机器可读的文档进行编码。XML 演变为扩展 HTML 并允许向 Web 添加自定义标签和元素。作为 HTML 的扩展,它允许数据结构化和扩展性。传统上,XMPP 已用于实时通信,如即时消息、在线状态、多方聊天、语音和视频通话、协作、内容联合等。
将 XMPP 用于 IOT 允许在设备或事物之间建立实时和可扩展的网络。事物(设备)有一个或多个节点,每个节点有几个(信息)字段。每个字段都包含一个可读和可写的值。节点需要通过发送和接受好友请求来相互加好友。一旦一个节点的好友请求被另一个节点接受,它就可以从另一个节点接收更新。如果其他节点也需要从第一个节点获取更新,它也需要发送好友请求并需要确认。如果两个节点都通过网络成为朋友,则称为双订阅,否则称为单边订阅。数据在节点之间以一对一的方式进行通信,其中一个节点可以读取或写入另一个节点中的字段值。
AMQP – 与 XMPP 一样,高级消息队列协议 (AMQP) 也是面向消息的中间件的开放标准应用层协议。它用于在应用程序或组织之间传递业务消息。它连接系统,为业务流程提供所需的信息,并可靠地传输实现其目标的指令。
这是一个可互操作的跨平台消息传递标准。在协议体系结构中,消息连同标头由客户端传递给代理或交易所。因此,只有一个队列,生产者将消息传递到该队列。消息可以从交换器或代理传递到一个或多个队列。标头包含有关消息每个字节的信息。它还包含路由信息。经纪人或交易所仍然负责读取标头并接收、路由和传递消息到客户端应用程序。该协议中的通信在两个节点之间保持一对一。
RESTful HTTP – 表述性状态传输 (REST) 或 RESTful 是一种无状态且可互操作的通信协议。该协议允许通过唯一的 URL 识别 Web 资源(信息资源),并将它们作为 HTTP、JSON 或 XML 文件传送。资源作为目录结构 URI 公开。客户端可以访问资源以获取、放置、删除或发布消息到表示,其中表示是数据对象及其 HTML、XML 或 JSON 格式的属性。GET、PUT、DELETE、POST都是接收、修改、发送数据的HTTP请求方法。作为无状态通信,不会发送或接收确认消息传递的确认。然而,HTTP 请求可以通过指示成功、重定向、信息、客户端错误或服务器错误的状态代码来响应。
MQTT-SN – MQTT-Sensor Network 是一种开放且轻量级的发布/订阅协议,专为受限设备(即无线传感器网络 (WSN))设计。像基于 Zigbee 的无线传感器网络或基于蓝牙的 WSN 等顶部没有 TCP/IP 堆栈的无线传感器网络,它们可以使用 MQTT-SN 协议将数据发送到互联网。
MQTT-SN 的设计尽可能接近 MQTT,但适应了无线通信环境的特殊性,如低带宽、高链路故障、短消息长度等。它还针对低端实现进行了优化。处理和存储资源有限的电池供电设备。
与 MQTT 相比,MQTT-SN 引入了以下变化:
• 主题名称由主题ID 代替,这减少了传输的开销。
• 主题不需要注册,因为它们是预注册的。
• 消息也被拆分,以便只发送必要的信息。
• 为了省电,对于处于睡眠状态的客户端,有一个离线程序。消息可以被缓冲并在客户端醒来时读取。
• 客户端通过位于传感器网络内并连接到代理的网关设备连接到代理。
在 MQTT-SN 的架构中,存在三种 MQTT-SN 组件——MQTT-SN 客户端、MQTT-SN 网关 (GW) 和 MQTT-SN 转发器。MQTT-SN 客户端使用 MQTT-SN 协议通过 MQTT-SN GW 将自己连接到 MQTT 服务器。MQTT-SN GW 可能会或可能不会与 MQTT 服务器集成。在独立 GW 的情况下,MQTT 协议用于 MQTT 服务器和 MQTT-SN GW 之间。它的主要功能是MQTT和MQTT-SN之间的翻译。
34c2c1c927c7455e9e0dbf6a75f1218a~noop.image?_iz=58558&from=article.jpg
MQTT-SN协议架构

如果 GW 没有直接连接到他们的网络,MQTT-SN 客户端也可以通过转发器访问 GW。转发器只是将无线端收到的MQTT-SN帧封装起来,原封不动地转发给GW;在相反的方向上,它释放从网关接收的帧并将它们发送给客户端,同样保持不变。
STOMP – 简单或流式文本导向消息传递协议 (STOMP) 是面向消息中间件的基于文本的协议。它基于 TCP 并使用类似 HTTP 的命令。它旨在提供平台、语言和经纪人之间的互操作性。数据在包含命令、标头和内容的多行帧中在客户端和代理之间进行通信。命令可以是 CONNECT、DISCONNECT、ACK、NACK、SUBSCRIBE、UNSUBSCRIBE、SEND、BEGIN、COMMIT 或 ABORT。
SMCP – 简单媒体控制协议 (SMCP) 是用于嵌入式设备的 CoAP 协议栈。它使用 C 语言开发,可用于发送和接收异步 CoAP 响应。
LLAP – 轻量级本地自动化协议是一种简单而短的消息传递协议,可以在任何通信介质上运行。该协议专为独立于设备使用的低级物理层协议的嵌入式设备之间的直接消息传递而设计。
SSI – 简单传感器接口 (SSI) 是一种应用层协议,专为计算机和传感器之间的通信而设计。该协议基于 UART,允许轮询传感器和流式传输传感器数据。数据由传感器以较小的代码占用空间传送至计算机。在协议中,传感器和计算机之间的消息包含一个 2 字节的标头和消息有效负载。报头包含一个单字节地址和一个单字节命令或消息类型。
LWM2M – 轻量级 M2M (LWM2M) 是一种用于传感器网络的设备管理协议。开放移动联盟 (OMA) 开发了此协议来管理各种网络上的轻型和低功耗设备。协议栈基于 REST 和 CoAP。
M3DA ——M3DA 是一个协议栈,用于在 M2M 服务器和嵌入式网关上运行的应用程序之间进行二进制数据通信。它专为设备和资产管理而设计,以便以最佳方式最好地使用网络带宽。
XMPP-IOT – 与 XMPP 用于互操作通信一样,XMPP-IOT 是用于机器独立 M2M 通信的协议栈。
ONS 2.0 – 对象名称服务 (ONS) 是一个协议栈,用于通过给定的 GS1 标识密钥定位元数据和服务。GS1 是用于供应链中业务交易自动化的电子商务消息传递标准。
SOAP – 简单对象访问协议 (SOAP) 是一种基于 XML 的协议栈,用于通过 Internet 实现 Web 服务。它使用 HTTP 请求方法通过网络在客户端之间进行消息传递。
Websocket – WebSocket JavaScript 接口定义了一个全双工单套接字连接,通过它可以在客户端和服务器之间发送消息。该标准简化了双向网络通信和连接管理的复杂性。
Reactive Streams – Reactive Streams 是一种用于异步流处理的协议栈,具有非阻塞背压。它是一种可以在 Java 或 JavaScript 上实现的规范。它用于处理容量未知的实时数据流。
HTTP/2 ——HTTP 版本 2 将是 HTTP 协议的下一个版本。它将使用标头字段压缩来减少延迟,并允许在同一连接上进行多个并发交换。
JavaScript IOT——这不是任何标准或协议。它指的是使用 JavaScript,特别是 Node.js(一种服务器端 JavaScript)和 IOT 板用于各种应用程序。一些基于 JavaScript 的物联网项目包括 NodeMCU、Jerryscript、Socket.IO、Ruff、NodeRed、KinomaJS、CHIRIMEN、Mosca、Nodebots、heimcontrol.js、Resin、UPM、i2C、node-http2、onoff、node-serialport、mdns、 IoT.js、Favor、Serverless、noduino、duino、Pijs.io 等。