基于QT的智能转发器在浮标观测系统的研究与应用
2021-06-28董国法李文庆宋苗苗苗斌王文彦
董国法,李文庆,宋苗苗,苗斌,王文彦
(山东省科学院海洋仪器仪表研究所,山东青岛,266001)
0 引言
Qt是一个跨平台的C++图形用户界面应用程序框架,它为应用程序开发者提供建立艺术级图形用户界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程,优势包括优良的跨平台特性、面向对象、丰富的API、国际化等[1]。
传统工具包使用一种被称作回调的通讯方式,首先它们不是类型安全的,不能确定处理函数使用了正确的参数来回调,因此容易造成进程崩溃。另外一个问题是,回调这种方式紧紧地绑定了图形用户接口的功能元素,因而很难把开发进行独立的分类。Qt提供了信号与槽机制,它是一种类型安全的高级接口,应用于对象之间的通信。
图1 通讯过程示意图
串口和网络通信又是开发的主要内容之一,本文基于win7 64 + Qt Creator5.5 + MinGW4.9.2开发环境,采用面向对象编程(object oriented programming,OOP)思想,对如何开发TCP网络程序和串口通信进行了研究,监视协议交互数据,一方面是数据内容,另一方面是协议交互。
1 工作原理及关键技术分析
1.1 网络通信
TCP协议能够为应用程序提供可靠的通信连接,使发出的字节流无差错地送达网络上的计算机。Qt QNetwork模块提供的类允许编写TCP/IP Clients和Servers以及FTP和HTTP协 议,而QTcpSocket和QTcpServer类则是实现TCP客户端和服务器用的,网络通讯流程如图2所示。
图2 服务端和客户端的交互时序
采用两套socket套接字,一套连接基于GPRS数据通信网络的DTU无线数据终端,发送到服务端;另一套连接到服务端,将回执发送回DTU无线数据终端,可以根据实际需求控制回执信息是否转发[8]。消息通信采用JSON数据格式,QJsonValue类为TCP通信的参数传递类,方便封装和解析消息。创建转发任务,不同于以往的大部分都是点对点的一对一传输,本模式支持自定义,一对一、一对多、多对多模式,多端口同时在线,有效的处理复杂的数据量。为支持7*24小时无人值守,采用定时器定时重连,掉线时发出disconnect()信号,1分钟重连一次,直到连接上为止,socket转发原理结构如图3所示。
图3 socket转发原理结构示意图
1.2 北斗通讯
北斗卫星导航系统是中国自行研制的全球卫星定位与通信系统(CNSS),是相继于美国的GPS和俄罗斯的GLONASS之后第三个具有成熟运营能力的通讯卫星导航系统,北斗卫星通讯是特有的短报文模式,通信的可靠性较高[10]。根据北斗终端接口协议,除去包头和包尾校验,民用的北斗每次可载数据量最多为78个字节,并且同一终端发送两条数据包之间必须相隔一分钟[3]。海洋监测数据包含气压、气温、湿度、雨量、辐射、能见度等气象要素,波浪高度、波浪周期、波向的海浪要素,多层流速、流向的海流要素,风速和风向要素,水温、盐度、电导率等水质要素,设备传感器报警状态,压缩到78字节非常困难,所以对采集数据进行了压缩编码并分包发出[6]。串口通信是9针RS-232接口,应用QSerialPort模块,封装串口有关的操作,自动检测计算机串口号,波特率默认19200bps,8bit数据位,1bit停止位,无校验位,具备串口助手功能。在实际调试中遇到了一条数据分多次抛出,尤其在北斗通讯机数量多,发送时间频率高导致数据量特大的时候会出现接收数据不完整现象,这是因为串口是异步收发,而默认情况下QSerialPort没有对串口收进行阻塞,解决方法是在接收槽开一个定时器,增加延时接收功能,把多次读取的数据增加到缓冲区,一般设置为最大1024字节,延时结束,一次性读取,保证了每次收到的数据都是完整数据,而不是脱节的,最后调用北斗转网络发送函数,遍历存储去向IP和端口的QMap
1.3 FTP传输及文件操作
相比与其他协议如HTTP协议,FTP协议要复杂一些。与一般的C/S应用不同点在于一般的C/S应用程序只会建立一个Socket连接,这个连接同时处理服务器和客户端的连接命令和数据传输,而FTP中将命令与数据分开传送的方法提高了效率。FTP是TCP/IP网络上两台计算机传送文件的协议,工作在OSI模型的第七层,TCP模型的第四层,即应用层,其连接是可靠的,传输是面向连接的,所以能为数据传输提供可靠地保障。FTP服务使用两个端口21(命令端口)和20(数据端口),端口20用于在客户端和服务端之间传输数据流,而端口21用于传输控制流。
以国家海洋局、中国气象局为应用主体的往往都有自身的信息系统监测平台,上级数据中心将资源整合,进行数据的系统分析和利用,而数据落地后如何把XML文件、文本文件自动的上传到服务端[7],真正有效的实现自动无人监管和智能化,成为了必须要解决的问题,而本通信协议传输正可以满足实际需求。首先是连接服务器,设置参数包括服务器IP地址,用户名和密码开始连接,端口默认为21,连接流程图如图4所示。
图4 连接流程图
其中网络请求由QNetworkRequest类来表示,作为与请求有关的信息的统一容器,在创建请求对象时指定的URL决定了请求使用的协议;QNetworkAccessManager用于协调网络操作,每当一个请求创建后,用来调度它,并发送信号来报告进度;而对于网络请求的应答则使用QNetworkReply,它会在请求被完成调度时创建。由此便可实现指定路径特定文件的上传。
观测数据平均每10min向接收岸站发送一次,7*24小时不间断运行,文本流QTextStream提供了方便的接口来读写文本文件,显示和保存收到的原始报文数据,能够获取来源IP地址、日期时间和报文长度,按天模式写入txt文本,保证了原始报文存储。特殊情况下,工具栏上的文件按钮,可选中所需的文本文件来动态监视,QFileSystemWatcher类是一个文件监视器,提供用于监控文件和目录进行修改的接口,当监视的文件被修改时,发出信号,同时记录偏移量currentPos位置,即可通过配置的访问ip地址、端口号的网络方式将最新数据包发送到服务端。数据采集控制器每十分钟统计一组各参数的平均值自容存储在主存储器CF卡和备存储器优盘内,存储器中的数据文件为一个月一个文件,文件监视器会按照回车换行为分隔符将报文一行一行的分隔开,然后每秒一次将报文转发到服务端,便于部门数据恢复及数据处理。
除此以外还具备历史数据列表查询、数据导出Excel报表功能,数据操作方面的技术采用多线程并行运行的设计思想,使用QEventLoop创建子事件循环,在子事件循环中父事件循环仍然可以执行,提高了程序的运行效率,同时也避免了程序在处理数据时阻塞线程,大量占用CPU[12]。
1.4 SQL Server数据库存储及同步
根据数据库大小可分为大型和小型数据库,在Windows平台下,兼容好并且开发程度高就属微软旗下的两款数据库系统Microsoft SQL Server和ACCESS。但ACCESS是一种小型数据库,适合存储较少的数据量,理论上在几百兆左右,如果数据量再变大可能会出现反应迟钝现象,并且没有自带的日志系统,不能记录针对数据库的所有操作。
Microsoft SQL Server 2008是一种关系型数据库系统。作为新一代的数据平台产品,不仅延续现有数据数据平台的强大能力,全面支持云技术与平台,并且能够快速构建相应的解决方案,实现私有云与公有云之间数据的扩展与应用的迁移[2]。
Qt建立了不同的数据库驱动,这些驱动会调用相应DBMS的编程接口对数据库进行操作。在使用QODBC的时候有两种连接方式,手动设置ODBC数据源和DSN字符串,需要注意的是对于express版本数据库,需加\sqlexpress后缀,最后通过SQL Server的结构化查询语言完成对数据库的访问和操作。
早期的业务系统繁多,存在一定的数据信息孤岛现象,无论在技术上还是人力上均给运维管理人员带来较大挑战。随着数据库同步现象越来越普遍,研究数据库同步在理论和实际应用上都有非常重要的意义,是分布式环境中的一项关键技术[9]。
(1)直接同步
SQL Server数据库同步是项目中常用到的环节,致力于解决异构数据库间复杂的交互操作,若一个项目中的数据同时存在于不同的数据库服务器中,而这些数据库需要被多个不同的网域调用时,配置发布/订阅是一个比较好的解决方案,具体实施步骤如下:
发布:找到数据库服务下的【复制】--【本地发布】,选择【新建发布】;选择待发布的数据库,选择发布类型,这里选择的默认类型【快照发布】,设置快照代理,设置代理安全性,填写发布名称,完成发布。
订阅:找到数据库服务器下的【复制】--【本地订阅】,选择【新建订阅】,选择订阅的发布,选择分发代理的位置,选择订阅服务器上的存放同步过来的数据的一个或者多个目标数据库,设置分发代理的安全性,设置同步计划,完成订阅。
在实际应用中,从专业的角度分析,发布/订阅技术存在一定的缺陷,同步双方的表结构不能更改,并且表结构必须一致,一旦发布方数据库表结构发生更改需要重新生成数据库快照。对于大数据量的同步缺乏可靠的保证,其中主要原因是大数据量的数据同步过程不具备可靠的通信链路,造成订阅数据库与源数据库之间数据传输延时问题[5]。
(2)间接同步
利用第三方伟思信安数据库同步系统,调试日志实时输出,着重研究网络之间安全接入、安全隔离、安全交换技术,配置管理简单、运行可靠,保证数据时效性和一致性,是一款可信边界安全数据交换平台[4],本系统已应用在移动互联网的项目体系当中,运行过程良好,是其他业务系统的底层支撑,如图5所示。
图5 数据库实时同步
2 系统测试
2019年6月1日-2020年9月26日,在福建附近港口码头进行实验,数据每10分钟传送一次,取三个10米大浮标的实验数据。如表1所示,1号大标接收率为98%,2号大标接收率为97.1%,3号大标接收率为97.2%,考虑到设备实际接收率一般要求达到95%,如结果所示,本系统完全能够满足数据接收率的要求。
表1 数据处理实验结果
3 总结和展望
本系统可以进行十六进制和ASCII数据收发,具备定时器定时重连,支持一对一、一对多、多对多连接并发,采用FTP传输,读写文本文件及磁盘处理,利用分布式SQL Server数据库操作,同时支持在局域网、广域网、互联网访问。
软件遵循模块化来设计,对系统的升级和二次开发是有利的,后期可根据实际需求增加实用功能,如曲线分析、GIS海图定位绘制、InterView框架等等,提高软件存活周期。
保持网络定时重连的方法,并使用跨平台QT C++程序框架实现,使得本应用可用于所有操作系统平台下,不仅提高了网络的可靠性,更大大提高了程序扩展性,是服务器与客户端之间通信的优秀解决方案。保证数据能够长期、稳定、连续的接收,传输处理更加及时,并且具备智能管理功能,比如信息帧长度可变、远程站点的优先级控制等等[11],提高强化观测能力,推动海洋行业应用的发展和基础研究水平。