基于MQTT协议的分布式标准光组件智能试验系统
2018-09-20吴上泉高涛陈军
吴上泉, 高涛, 陈军
(工业和信息化部电子第五研究所,广东 广州 510610)
0 引 言
近年来,随着国内供给侧改革的深入与检测机构服务型职能的转变,检测认证的市场化程度有了明显的提高,认证行业的细分程度和领域也日益明显,与此同时,为了满足各地不同企业差异化需求,检测机构纷纷建设异地实验室,为了保证检测数据的有效和权威性,样品流转的记录、测试数据的实时监控、测试记录的一致性溯源就显得尤为关键[1]。
同时随着移动互联网领域的兴起,检测工程师不再满足于传统的基于PC端的数据浏览和监控,特别是对于测试周期长、无需人工干预的各种环境试验、耐久试验等,再者由于标准光组件检测实验室具有设备多样、样品轻便和位置随机等特点[2],工程师们迫切希望通过移动互联终端对测试数据进行筛选,对样品的位置进行跟踪和追溯,这一切需求的前提都是移动互联网消息推送方案的实现[3]。
目前主要的推送方案包括XMPP(The Extensible Messaging and Presence Protocol)、GCM(Google Cloud Messaging)、HTTP(Hyper Text Transfer Protocol)以及MQTT(Message Queuing Telemetry Transport)协议,但是由于XMPP协议都是基于消息体进行寻址的消息通信协议,消息体中包含了消息发送者、接受者以及用于消息路由的会话标识等众多头域,因此存在协议复杂且占用资源较多等缺陷,而GCM服务则受限于Android版本(2.2版本以上),并且该服务器在国内不够稳定,此外IOS上的APNS也仅适用于IOS,无法跨平台使用[4]。相比于以上的其他消息推送协议,MQTT协议具有低硬件限制、低带宽、低延时、跨平台和高推送速度等优点[5]。
因此,为了满足便捷化和智能化应用场景,实现多地光组件实验室的数据统一监控和样品流程追踪,进而为实现数据一致性比对和结果追溯提供保障,本文针对两地的标准光组件检测实验室搭建基于MQTT(消息队列遥测传输)协议的智能化试验系统。
1 系统架构
本智能化试验系统针对广州和佛山两地的标准光组件实验室进行改造,其中广州实验室主要包括环境与寿命实验设备、功率采集设备和温度采集设备,而佛山实验室主要包括空间光谱测量仪、高精度快速光辐射计以及其他的热色光电机性能测试设备。
本系统采用分布式网络化控制系统,其架构和通信协议如图1所示。
图1 系统架构图
其中MQTT服务器为整个架构的中转和核心[6],MQTT服务器部署在公网,通过公网IP或域名进行访问连接,其主要负责客户端管理和消息中转,不对数据进行任何的处理。其他数据来源和数据目的设备包括移动客户端、广州实验室上位机和佛山实验室服务器等都属于MQTT的客户端,为了便于描述,前者本文简称为客户端,后两者都称为实验室。MQTT客户端设置MQTT服务器的IP地址(或域名)、端口号还有客户端ID,对MQTT服务器进行连接。
佛山实验室服务器主要负责佛山实验室内仪器测试数据的存储与中转,而佛山实验室上位机主要通过现场总线比如RS485、RS232以及以太网等对底层的试验仪器进行数据采集与控制,通信协议需要根据仪器的不同进行定制化开发。
广州实验室上位机主要通过RS485以及WIFI对包括高低温试验箱、快速温变试验箱、功率采集仪在内的试验设备进行数据同步采集和集中管理,并通过MQTT消息更新的方式将数据同步到MQTT服务器。
PC客户端或者移动客户端,主要用于数据查询、人机交互等。其中在移动端部署了基于Android操作系统的监视软件,并安装MQTT客户服务,根据用户的操作分类订阅不同实验室设备的相关数据,并更新显示列表,同时还可以对实验设备的历史数据进行查询。
本文的主体程序架构包括佛山实验室服务器程序架构、广州实验室上位机程序架构、佛山实验室上位机程序架构以及移动客户端程序架构等,本章主要介绍MQTT的协议架构。
本项目中实验室与客户端的数据同步通过发布和订阅主题的方法实现。根据数据流逻辑可以把主题分为三种:请求主题、响应主题以及更新主题。各主题描述如表 1所示。
(1)请求主题:客户端向实验室主动请求数据访问发布的主题。
(2)响应主题:实验室接收到客户端的请求主题后,向客户端返回响应的发布的主题。与(1)组合实现客户端请求和实验室响应的查询方式,用于实验室设备运行状态查询和历史数据查询。
(3)更新主题:实验室周期地向MQTT代理服务器发布更新数据的主题,主要实现实时数据在客户端的显示。
表1 消息主题类型
当客户端需要主动获取实验室的数据时,数据流程如图2所示,客户端需要事先订阅该数据的响应主题,然后发布该数据的请求主题,而实验室则需要在事先已订阅该客户端的请求主题,此后移动客户端向MQTT代理服务器发送数据请求主题后,MQTT代理服务器直接向订阅了该请求主题的实验室进行消息推送,继而实验室在收到该消息后,解析消息并发布相应的数据响应主题。同样MQTT代理服务器会将该消息推送给订阅了该响应主题的移动客户端,最终移动客户端再进行消息解析,得到检测数据。
图2 请求响应数据流示意图
而当客户端需要获取实验室周期更新的数据时,数据流程如图3所示,客户端需要事先订阅该数据的更新主题。与请求响应数据流不同的是,更新主题的请求发布以后,实验室间隔一定的周期不停发送数据包,直到相应的设备停止或者移动客户端发布停止命令,该主题用于设备实时数据更新。
图3 更新主题数据流示意图
下面针对实验室提供的数据接口进行说明,如表2所示。
其中:消息主体(Body)中,“[]”为列表信息,消息主体里的设备状态模型和数据模型按表3中的定义。
对于历史数据查询,首先某客户端(通过客户端ID区分)发布广州或者佛山实验室(用实验室ID区分)的请求访问主题,在消息主体中,用mMachID字段对对应的设备进行检索,在列表中可以访问多台试验设备的历史数据,当相应实验室端接受到该请求主题后,用符合表3的字段进行解析,并将相关设备的历史数据通过表3的字段并采用Json格式,发布响应主题的格式发送到MQTT代理服务器进行转发。实时数据更新数据流也类似,不予赘述。
表2 实验室接口的消息主题定义
2 程序设计
前一章中已经详细介绍了系统架构和各模块程序的功能,本章主要介绍佛山实验室上位机基于Json数据格式的MQTT通信程序设计思路,并与移动客户端通过MQTT代理服务器通信,最终在移动端显示通信效果。
实验室上位机采用JAVA编程语言,程序设计思路如图4所示。
其中:将数据库中的数据转化为Json数据格式,采用如下代码:
StringBuilder jsonString = new StringBuilder();
jsonString.Append("[");
while (dataReader.Read())
{jsonString.Append("{");
for (inti= 0;i< dataReader.FieldCount;i++)
{Type type = dataReader.GetFieldType(i);
string strKey = dataReader.GetName(i);
string strValue = dataReader[i].ToString();
jsonString.Append(""" + strKey + "":");
strValue =String.Format(strValue, type);
…}
jsonString.Append(strValue);}
jsonString.Append("}");
jsonString.Append("]");
其中,strKey为Json数据格式的名称,strValue为值,构成“名称/值”对。
当接受到信息后,根据主题包含的关键字,进行不同方式的响应,同时连接数据库,对数据库内容进行读取后,进行主题和消息发布,部分代码如下:
if [name.Equals("richTextBox_haas2000")] { Client.Publish("/user/cafe@/saibao/led/powerstate/response@/user/HAAs-2000", MysqlToJson(datareader), QoS.AcknowledgeDelivery, false); DisplayInfo(MysqlToJson(datareader), name); }
表3 消息主体定义
图4 上位机程序框图
图5 移动端数据显示界面
同时移动端调试完毕后,界面显示如图5所示。
3 结束语
本文针对异地标准光组件实验室搭建了一套基于MQTT协议的智能测试系统,并采用了一套轻量级的数据格式——Jason数据格式,实现了各地实验室数据的集中监控,可以在移动互联网端对各地实验室不同设备的运行状态、测试实时数据和测试历史数据进行查询、控制等,这些都为各地实验室的数据一致性比对提供了支撑保障。试验结果证明,该系统功能齐全,运行稳定,操作方便,有很大的实用和推广价值。