大型电机远程监测系统云服务器数据接口设计
2021-07-01徐志祥李春秋曹冰冰牛小刚
徐志祥,李春秋,曹冰冰,牛小刚
(大连理工大学 机械工程学院,辽宁 大连 116024)
0 引 言
大型电机是能源、国防、采掘等行业关键装备的驱动部件,其安全运行不仅事关电机本身的安全,更关乎整个生产链的安全。因此,如何提高大型电机的安全性和可靠性,及时准确地发现电机故障或诊断出潜在故障,保障关键装备安全运行,一直受到广泛的关注和重视。物联网和云计算技术的出现,为大型电机的在线状态监测提供了全新的技术手段。利用物联网技术,通过将电机的运行状态数据发送到云服务器,检测人员能够通过远程终端如手机APP或电脑网页查看电机的运行状态,从而极大地提高电机状态监测的实时性,便于相关人员及时处置出现的问题,延长电机的使用寿命,降低生产链风险。
在基于物联网的大型电机远程监测系统中,需要采集大量电机参数上传到云端,在云服务器中对这些数据进行存储、转发和计算,给云服务器系统造成了很大负担。本文针对这一问题创新性地设计了云服务器上的数据库通信接口以及数据接收和发送接口。针对传统模式中使用Socket连接和HTTP协议实现数据接收和发送时造成的云服务器系统CPU与内存资源浪费,将数据接收与发送接口的性能进行了优化,降低了云服务器系统资源的消耗。
本文使用PyMySQL库进行与MySQL数据库通信模块的编写。使用Tornado库中的TCPServer与协程方式编写数据接收接口,基于WebSocket协议使用Tornado库中的WebSocketHandler实现用户终端的数据发送。相比传统模式,在相同条件下此举能够大幅降低云服务器的CPU资源消耗和内存占用,使物联网大型电机监测系统中云服务器的性能得到提升[1-3]。
1 云服务器整体框架
在大型电机远程监测系统中,云服务器需要接收硬件采集设备得到的数据,将其存储在数据库中,并在需要时将数据库中的指定数据发送到远程终端,供检测人员查看,其整体功能框架如图1所示。为实现以上功能,本文基于Python编程语言,按照模块化的编程思想,针对数据库通信模块、数据接收接口和数据发送接口进行设计,搭建了可用的大型电机远程监测云服务器[4]。
图1 云服务器整体框架
2 数据库通信模块设计
在云服务器中,无论是电机监测数据的接收还是发送,都需要与数据库通信。本文所设计的云服务器使用开源的MySQL数据库,并通过Python的PyMySQL扩展库实现数据的写入和读取[5]。
2.1 数据存储方式
MySQL是关系型数据库,数据按照“database-tablecolumn”的形式存储。对于电机而言,主要的监测参数可以分为电气参数、环境参数和状态参数。为每种参数分别创建单独的表,并统一放在名为“motor”的数据库中。
每个表都包含id、create_time和value。id对应每条数据的唯一索引;create_time表示数据上传的时间;value表示数据的值。表的结构见表1所列。
表1 数据库中表的结构
2.2 数据读写方式
对数据库进行的操作主要可分为两类:写入和读取。在MySQL中,数据的写入通过“插入(INSERT)”语句实现,读取通过“查询(SELECT)”语句实现。
数据库读写逻辑如图2所示。当接收到硬件采集的数据时,首先为每一个参数生成对应的数据库表名,再按照表中的结构将数据格式化,然后通过PyMySQL库创建与数据库的连接,借助INSERT语句将数据写入数据库,最后关闭与数据库的连接。当收到用户端发送的请求时,首先从请求中解析出数据所在的表,然后创建与数据库的连接,通过SELECT语句查询数据,随后关闭与数据库的连接,最后将读取的数据返回用户端。
图2 数据库读写逻辑
3 数据接收接口设计
数据接收接口是和硬件采集端对接的重要部分,它有2个任务:接收电机监测数据和将数据写入数据库。
为了接收硬件采集的数据,云服务器需要与硬件端的控制器建立网络通信。基于TCP/IP协议建立Socket连接是一种可靠的方法。但使用普通的Socket连接在面临大量数据传入的场景时,需要通过多线程来提高并发能力,线程之间的频繁调度将消耗大量系统资源[6-7]。
Python支持“协程”机制,与多线程类似,它也支持非阻塞异步并发操作。协程的工作方式如图3所示,当一组数量大的数据到来时,由程序将其分成若干数据片,每个数据片使用一个协程处理,所有协程可以运行在同一个线程中。使用协程节省了线程调度的开销,因此工作效率高而消耗低。
图3 协程的工作方式
Tornado库是Python的Web服务器扩展库,它提供了方便的调用协程的方式:通过gen.coroutine装饰器装饰包含yield表达式的异步生成器,此时handle_stream函数就是一个协程。handle_stream函数定义在继承了TCP Server的子类中,通过TCP Server端口可以等待硬件端发起连接。
数据接收接口的关键代码如下所示:
read_l是上传数据的前4个字节,包含数据长度信息,也可作为安全验证。根据数据长度读取上传字节流中的所有数据,并以字典形式存储于data_dict中,完成数据接收操作。
根据模块化编程思想将数据库的写入与读取功能封装在函数中,并保存为Python文件,在需要时可以直接调用。into_db.insert_data函数就是封装好的数据库写入函数,将data_dict作为参数传入就可以实现数据写入功能。
4 数据发送接口设计
为方便测试人员实时查看数据,需要将数据显示在手机或个人电脑上。这就要求云服务器能够将数据发送至远程终端。数据发送接口主要有2个任务:从数据库读取出电机的数据并发送给指定用户。
在电脑端,比较常用的数据显示方式是通过浏览器获取Web网页。在手机端,随着微信的广泛应用,微信小程序是一种便捷、可靠的选择。Web网页和微信小程序都可以使用WebSocket协议通信。WebSocket是一种建立在TCP上的全双工长连接应用层协议,相比传统的HTTP协议,建立了一次连接即可保持长久的双向传输机制,减少了不必要的请求头部信息的发送,所以内存占用较小,能够显著降低系统负担。
基于WebSocket协议的数据发送接口同样通过Tornado库实现,关键代码如下所示:
EchoWebSocket是 一 个 继 承 了Tornado中WebsocketHandler类的子类,定义on_message方法,在方法中传入的参数message即用户端发送的请求数据,约定包含用户信息以及所请求的参数类型。将用户请求发送到JSON字符串转换成字典的形式并传递给封装好的MySQL数据库读取函数,再将取出的数据通过write_message方法以JSON字符串的形式返回给用户端。在主函数中将EchoWebSocket类传给Application方法,再通过IOLoop.current().start()方法监听指定端口,等待用户发起请求。
5 云服务器系统测试
5.1 功能实现
为验证所设计云服务器数据接口功能的实用性,使用阿里云服务器在CentOS7系统上搭建服务器系统,并与硬件采集端、电脑网页端和手机端联合测试。
图4所示为Web浏览器端对于电机前端轴承振动图像的显示结果。图5所示为微信小程序端的显示界面。
图4 Web网页端数据显示
图5 微信小程序数据显示
5.2 性能优化测试
为测试数据接收接口的性能,分别使用传统的Socket方式和Tornado协程方式编写数据接收接口,通过20个测试用户端同时上传数据,每个用户传入相同的数据,对比2种设计模式下操作系统的CPU占用率、内存使用率以及数据写入操作完成时间,在多次测试后取平均值,得到的数据接口性能对比结果见表2所列。
表2 两种数据接收接口性能对比
为测试数据发送接口的性能,分别基于HTTP协议和WebSocket协议编写数据发送接口,使用20个测试用户端,每个用户同时请求相同数据,对比2种设计模式下操作系统的CPU占用率、内存使用率以及数据读取操作完成时间,在多次测试后取平均值,得到的对比结果见表3所列。
表3 两种数据发送接口性能对比
通过对比可以看出,在相同条件下,使用Tornado协程方式与Socket方式相比,内存使用率以及完成时间几乎相同,但Socket方式下的CPU占用率为37.3%,Tornado协程方式下的CPU占用率为27.3%,只使用Socket方式的CPU占用率为73.2%。而使用WebSocket协议与HTTP协议相比,两者的CPU占用率与完成时间几乎相同,但HTTP方式的内存使用率为4.1%,WebSocket方式的内存使用率为3.5%,只使用HTTP方式的内存使用率为85.4%。所以通过Tornado协程方式的数据接收模块和基于WebSocket协议的数据发送模块能够大幅提高系统性能。
6 结 语
本文使用Python编程语言设计了大型电机监测系统中云服务器的数据库通信接口、数据接收接口和数据发送接口。针对云服务器处理大量测量数据时系统负担加剧的问题,将数据接收接口和数据发送接口进行性能优化,降低云服务器的系统资源消耗。
(1)基于协程方式,通过Tornado库中的TCPServer方法对数据接收模块的性能进行优化。相比Socket多线程方法,在相同条件下能够将CPU占用率降低为之前的73.2%。
(2)基于WebSocket协议,通过Tornado库中的WebSocketHandler方法对数据发送模块的性能进行优化,相比基于HTTP协议的方法,在相同条件下能够将内存占用率降低为之前的85.4%。