Sparkplug规范-8.Sparkplug MQTT会话管理和消息流

基于MQTT的SCADA系统独特之处在于不负责与设备建立和保持连接,而这是多数现有传统请求-响应设备协议需要做的。在MQTT系统中,应用、设备都与MQTT服务器建立MQTT会话,从而解除了应用与设备之间的耦合。其他的MQTT客户端可以连接和订阅任何实时数据,而不影响核心SCADA主机应用。

鉴于实时SCADA方案特点,核心SCADA主机和所有连接的MQTT 边缘节点互相掌握对方的MQTT会话状态信息非常重要。为达到这个目的,Sparkplug主题名定义了上线/下线消息和负载,为SCADA主应用MQTT客户端和关联节点MQTT客户端提供状态和上下文。在大多数情况下,这样“设计”核心SCADA主机主要有两个原因:

  1. 只允许主应用向终端设备发送命令;
  2. 在高可用性和冗余场景中会使用多个MQTT服务器,MQTT 边缘节点需要获悉主应用是否连接了每个MQTT服务器。如果主应用状态表明边缘节点连接的MQTT服务器主应用没有连接,那么边缘节点应该转到下一台MQTT服务器,那里主应用的状态为“ONLINE”。

    8.1 主应用会话建立

主应用在启动或重连时,会马上尝试与MQTT服务器建立MQTT主机会话。须知,主机会话与其他MQTT客户端会话不是同时建立的,如果边缘节点已经连接MQTT服务器,主应用会与它们同步,否则,主应用会在收到它们上线消息时注册它们。

                                                                   图 3 主机会话建立

如图 3 主机会话建立为非常简单的单MQTT服务器拓扑,会话图中的步骤如下:

  1. 主应用尝试使用MQTT CONNECT包(参见MQTT V3.1规范3.1节)创建MQTT会话。CONNECT控制包的遗嘱主题和遗嘱负载保存下线信息,遗嘱QoS为1,遗嘱Retain为真。MQTT CONNECT包由一个有效的CONNACT包确认成功,此后一旦主应用MQTT客户端与MQTT服务器连接丢失,MQTT服务器就分发主机下线消息。
  2. MQTT会话建立后,主应用发布一条新状态消息,即7.5.1节定义的SCADA/IIoT上线消息。此时,主应用可以更新主应用中的MQTT客户端测点当前状态为在线。
  3. MQTT会话建立后,主应用上线状态已发布,主应用发起对预定义Sparkplug主题名的订阅,至此,主应用已准备好接收连接的边缘节点发布的MQTT消息。由于主应用也依赖与MQTT服务器的MQTT会话,服务器可用性也作为主应用的MQTT客户端度量点进行监视。
  4. 如果主应用与MQTT服务器失去连接,服务器的在线状态立刻反应到主应用MQTT客户端测点上,所有与该MQTT服务器连接的边缘节点关联的测点,其数据质量更新为“STALE”。

   8.2 边缘节点会话建立

边缘节点在提供连接设备的信息之前,必须先建立MQTT会话。大部分实时SCADA的MQTT 边缘节点会保存与MQTT服务器的持久MQTT会话,但也有MQTT会话不需要持久化的情况。无论如何,边缘节点任何时候都可以建立MQTT会话,与其他MQTT客户端完全异步,唯一的例外是当有多个MQTT服务器和一个核心主机应用时。

                                                            图 4 边缘节点MQTT会话建立

如图 4 边缘节点MQTT会话建立 为非常简单的单MQTT服务器拓扑,会话图中的步骤如下:

  1. 边缘节点MQTT客户端尝试使用MQTT CONNECT包(参见MQTT V3.1规范3.1节)创建与MQTT服务器的MQTT会话,CONNECT包的遗嘱主题和遗嘱负载保存下线信息,格式定义在7.1边缘节点下线(NDEATH)。MQTT CONNECT包由一个有效的CONNACT包确认成功,此后一旦MQTT客户端与MQTT服务器连接丢失,MQTT服务器就分发边缘节点下线消息给订阅者。
  2. 对NCMD主题的订阅确保从主应用到边缘节点的消息能够分发,对DCMD的订阅确保从核心主机应用到设备的消息能够分发。在多MQTT服务器和指定主应用的场景中,对状态的订阅通知边缘节点核心SCADA/IIoT主机的当前状态,这样,边缘节点就圆满完成了与主应用建立有效MQTT会话的步骤。
  3. MQTT会话建立后,边缘节点MQTT客户端发布应用级NBIRTH消息,定义在7.1.2边缘节点上线(NBIRTH)。此时,主应用有了建立边缘节点测点树的全部信息,将边缘节点显示为“在线”状态。
  4. 如果边缘节点MQTT客户端与MQTT服务器失去连接,MQTT服务器发布该边缘节点的下线消息,收到该消息后,主应用设置该边缘节点为“离线”状态,更新连接的时间戳,相关测点数据质量设置为“STALE”。

    8.3 MQTT设备会话建立

Sparkplug规范用来从测量、监视和控制物理过程的现存和新的终端设备中,获得实时过程变量信息给MQTT消息中间件和主应用工业物联网平台。本文中的MQTT设备代表从传统请求-响应驱动的PLC、RTU、HART智能变送器等,到内置标准MQTT客户端的新一代自动化和仪表设备。

前面章节详述了主应用如何与MQTT服务器,以及MQTT服务器如何与MQTT 边缘节点交互。不过,这些技术需求很大程度上已经由MQTT提供了,应用层面的主要精力会放在本地设备与边缘节点API之间的Sparkplug规范实现上。

为了从智能设备获取和发布测点,以下简化流程图概述了需求:

 

                                                                       图 5 MQTT设备会话建立

如图 5 MQTT设备会话建立的会话流程图,显示了一个由主应用、MQTT服务器、MQTT 边缘节点等Sparkplug要素构成的简单拓扑。会话流程图中的步骤定义如下:

  1. 假设存在MQTT 服务器。
  2. 假设主应用与MQTT服务器建立了MQTT会话。
  3. MQTT 边缘节点的会话建立见8.2边缘节点会话建立,本流程图假设边缘节点与主应用之间的会话已经建立。根据目标平台,边缘节点可能是物理“网络边缘”网关设备,通过Modbus、AB、DNP0、HART等协议轮询传统设备,自带MQTT功能的传感器或设备,也可能是运行Eclipse Tahu 边缘节点原型实现的树莓派。不管哪种类型,设备接口都要提供状态和相关测点用来做MQTT发布。
  4. 流程图中状态#4表示,设备已经准备好向MQTT 边缘节点报告该设备的、Sparkplug定义的全部测点信息,边缘节点负责将此信息作为7.3.1设备上线(DBIRTH)消息的负载后发布,收到设备上线消息后,主应用能够构造出测点树。
  5. 根据章节7.4设备数据(DDATA),后续测点数据都是基于变化通知(RBE)用DDATA消息格式发布给主应用的。
  6. 一旦设备不能提供实时信息,MQTT 边缘节点规范要求发布DDEATH,通知主应用所有测点数据质量置为“STALE”。

    8.4 一般MQTT应用和非主应用

如前所述,系统中主应用实例有权向节点和设备发送命令,所有边缘节点需要与主应用连接到相同MQTT服务器,否则节点就要转向另一服务器,这两项是任务关键型SCADA系统的已知需求。

但不同于传统SCADA系统实现,通过MQTT网络发布的实时过程变量信息,其他MQTT客户端也可以全部或按需获取。

主应用MQTT客户端和其他客户端唯一区别是非主客户端发布上线/下线消息。

 

链接:

0. 目录

7. ​​​​​Sparkplug MQTT消息类型

9. Sparkplug MQTT数据和命令消息

猜你喜欢

转载自blog.csdn.net/xhydongda/article/details/114263742
今日推荐