王龙龙,周志峰
(上海工程技术大学 机械工程学院,上海 201600)
近年来,随着全球卫星导航系统(global navigation satellite system,GNSS)技术在各个领域的深入应用,我国不断完善连续运行卫星定位综合服务系统的建设,许多城市建成了连续运行参考站(continuously operating reference stations,CORS)系统[1-2],CORS系统是由多个建立在地球上固定位置上的连续运行的卫星基准站利用数据处理单元、控制器、计算机、数据通信与数据传输技术组成网络,能够根据不同用户、不同行业提供实施不同精度的定位导航技术等空间服务的综合系统[3],涉及到全球卫星导航定位、测绘与地理信息、气象、地质勘探等多个领域。CORS参考站是若干具有已知坐标的GNSS卫星数据观测站构成的数据接收部分,其主要功能是对连续运行的卫星进行定位跟踪、采集、记录各种数据等,并且将数据的传输到数据管理中心;每个参考站由GNSS接收机、天线、不间断电源、网络传输设备等构成,所以接收机的稳定运行对于卫星的连续定位以及整个CORS系统起着至关重要的作用[4]。
在多基站的连续运行的卫星定位系统中,基站站点的布置位置分散,国内外接收机开发商目前难以实现对所有参考站卫星接收机的一次性升级:若要对接收机的固件、板卡或者前面板升级,只能逐台接收机现场维护;虽然通过登录网络客户端操作较为方便,但仍避免不了逐台操作的局限性。这无疑增加了参考站的维护成本,降低了参考站后期的工作效率。本文研究开发参考站基站接收机批量维护升级工具,以期实现同时对多台接收机通过文件传输协议(file transfer protocol,FTP)统一升级。
QT作为一种基于C++的跨平台图形用户界面(graphical user interface,GUI)系统,能够提供给用户构造图形用户界面的较强功能,满足用户构造复杂图形界面系统的需求[5]。作为目前主流的嵌入式GUI设计工具,为不影响界面的响应速度,引入了多线程技术,还有其多种线程的通信机制[6],给软件开发带来了很大优势。
首先和多进程相比较,多线程具有开销小、切换快的优点,同时,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他线程所用,这样线程之间通信也就更加方便快捷;但是数据的共享也带来一些问题,有些数据不能被同时修改。
其次,多线程能有效提高应用程序的响应速度,这对图形界面的程序具有重要意义。当完成操作耗时比较长的任务时,传统程序不会响应键盘、鼠标、菜单的操作;而使用多线程技术将耗时长的操作(time consuming)置于一个新的线程,则可以避免这种尴尬的情况,特别是在并行操作时,多线程能够响应不同的操作请求,不至于出现操作堵塞。随着多核多线程技术[7]的发展,对于多中央处理器(central processing unit,CPU)的系统,不同线程会在不同的CPU中运行,操作系统则会控制当前的线程数不大于CPU的数目,这样也提高了CPU的运行效率。
QT中的线程主要分为用户界面主线程和后台的工作线程:主线程担负着响应用户输入信息以及处理绘制图形事件和消息的任务,在程序中,QWidget对象的创建意味着一个用户界面主线程启动,程序运行结束,也就线程终止;而后台的工作线程也就是执行客户所需求的任务线程,如相关计算、串口的读写等功能。它们二者最大的区别是主线程不是由QThread继承而来,其最重要的是实现工作线程任务控制函数。工作线程和用户界面主线程启动时充分利用C++多态的特性,实现相同函数的不同版本。
QT中提供了4种多线程实现的方法,分别是继承QThread、继承QRunnable、使用moveToThrough将实现的目标代码转到新线程中运行,以及使用QTConcurrent:run启动新的线程。在接收机批量升级工具的开发中使用了moveToThrough这种方法来实现多线程,可以将每一台接收机的升级任务放到一个单独的线程来完成,实现线程的并发效果。
通过FTP推送文件是因为FTP屏蔽了各计算机系统的细节,因而适合在异构网络中任意计算机之间传送文件。FTP只提供文件传送的一些基本服务,使用传输控制协议(transmission control protocol,TCP),主要功能是减小或消除在不同系统下处理文件的不兼容性。FTP使用客户端/服务器模型[8],一个FTP服务器进程可以为多个客户进程提供服务。FTP服务器由2大部分组成:一个主进程,负责接受新的请求;若干从属进程,负责处理单个请求。
卫星接收机是基于Linux系统运行的,在其内部构建了FTP服务器端,将系统升级文件、固件升级文件,以及前面板升级文件保存在指定的文件目录下。FTP客户端将文件直接推送到指定的目录下,然后接收机可以自动解析解压,完成升级任务。
需要特别说明的是在QT4中去掉了FTP的实现类QFtp,为了文件上传的方便,并且让系统运行稳定,在软件设计的时候选用了官方原来的QFtp源码,再重新编译,构造FTP客户端,完成连接(ConnecToHost)、设置用户名和密码、登录(login)、上传(put)等操作。
由于文件传输频繁,数据在传送的过程中可能会因为网络中断或者断电而中断文件传输,为了应对这些突发事件,开发支持了文件上传的断点续传[9]和多线程上传等功能。
软件设计基于C/S构架,实现接收机系统中服务器端对应的客户端[10],客户端通过Socket建立一个或者多个连接,通过传输控制/网络通讯协议(transmission control protocol/internet protocol,TCP/IP)进行数据交互。软件平台的主要功能如下:
1)通过检查Socket是否连接成功,以及FTP是否连接成功来测试接收机是否连接成功,并且获得连接成功和失败的连接数;
2)重启功能,连接失败时,可以重启连接,FTP上传文件失败,实现断点续传的功能;
3)获取接收机的系统版本、固件版本以及接收机的序列号,实时显示每台接收机推送文件的进度和总的文件进度;
4)动态加载IP地址,根据不同接收机的不同IP地址进行Socket连接。
客户端/服务器模式下基于TCP/IP协议通信的多线程实现[11]保证了客户端与服务器同步,接收数据稳定可靠。
首先将所有接收机的IP地址写入文件,然后通过QFile继承类打开文件,读取IP地址,显示在软件的表格中(QTableWidget继承类),并且检验IP地址的正确性,再进行Socket连接,并由客户端向服务器发送连接请求报文,如果报文结构正确且Socket连接成功,则接收到接收机发来的报文信息,通过解析,可以获得报文的内容为接收机的序列号(SN)、固件版本号(Firm Version)、系统前面板版本号(OEMFirmVersion)。此时,将客户端与服务器的连接状态显示到软件界面。程序设计流程如图1所示。
图1 软件流程
程序设计经过多文件编译,分功能实现,保证软件能够流畅运行,与服务器通信稳定,响应迅速,通过自实现FTP客户端类与报文解析类,使得程序可读性高,构架上更为方便日后的升级维护。头文件介绍:cbu.h实现主界面编辑功能;kfifo.h实现报文解析;qftp.h设计了FTP客户端操作方法;所有的升级过程任务在workthread.h中设计;然后通过创建新线程,在新线程中运行。如图2所示。
图2 程序实现文件
连接成功之后开始通过FTP向服务器推送文件,根据写入字节数计算推送进度,显示到软件表格的progress中,QFtp继承类提供了FTP的连接、登录、用户名密码设置、文件上传、下载、推送进度等方法直接调用,推送文件的同时,向服务器发送升级类型报文,包括3个类型:前面板升级、系统固件升级以及板卡固件升级。服务器端检测文件成功后,开始升级,并且将升级进度以报文的形式发送给客户端,升级进度从0x02到0x64,将升级进度显示在软件的进度条上。
报文的格式由28个字节的报文头(header)、可变长报文内容(content)和4个字节的校验位构成。其中header包含了3个字节的同步头和25个字节的报文信息,而报文信息 主要有报文ID(MessageID)、报文长度(MessageLength)等。
将构造的报文通过QByteArray继承类的FromRawDate转换为字节数组,发送给服务器端,这样保证数据不丢失。而客户端接收的报文,同样转化成字节数组的形式,然后根据报文头信息获取需要的报文内容,填入软件构造的表中。
QT在主线程中完成界面的创建,通过信号和槽机制将事件连接起来;在构造函数中完成初始化。由于在QT其他的自定义类中无法对主界面类的控件进行操作,在设计的过程中,也采用了自定义信号,通过槽函数连接,实现自定义线程类对主界面控件的操作,这样主要是为了方便进度条显示每个线程升级的进度。多线程实现思路如图3所示。
图3 多线程升级流程
程序根据读取IP地址的个数来确定创建的线程(thread)数目,在每个线程中除了不同的IP地址之外,其他完成的任务都一样,所以在线程的构造当中传入IP地址参数,线程任务由一个单独的类实现。所有线程获取报文内容建立统一的容器存储(QList),为防止多个线程同时修改共享数据,直接使用QT中提供的线程同步类(QMutex和QMutexLocker)对线程的共享数据加锁,在函数的入口处加入同步类对象,对象的局部变量在函数使用结束后自动销毁,共享数据也就解锁成功,保证线程的并发不会出错。
通过连接上海司南公司研发的M300pro接收机进行软件测试验证,运行结果如图4所示。为了验证效果,最后一个IP为错误地址。
本文通过QT平台利用C++编程完成了多线程接收机批量升级工具。在局域网络系统中,将接收机和PC机通过网络接口连接,客户端和服务器端连接成功,使用FTP上传所需要的升级文件。经测试验证,各线程独立运行,达到并发效果,升级过程不相互影响,连接接收机稳定;同时读取不同接收机的报文信息,报文解析正确,软件能够同时快速上传文件至各个接收机指定文件目录中,并且能够根据不同的报文信息及时将升级状态显示到计算机界面;对批量的接收机升级进行可视化管理,改善了以往的单台升级模式,并且可以实现远程网络传输控制,有效提高了接收机的升级效率,降低了卫星基地增强系统的维护成本。
图4 软件运行效果
由于实验条件限制,实验只针对了司南一个品牌的接收机测试,对于不同厂商的接收机,还需要进行软件升级,修改报文解析方法即可。
[1] 李晓亮.CORS系统的构建与应用[D].北京:中国地质大学,2014.
[2] 汪伟,史廷玉,张志全.CORS系统的应用发展及展望[J].城市勘测,2010(3):45-47.
[3] 王向东,于晓伟.城市连续运行参考站(CORS)系统建设浅析[J].大众科技,2012(1):30-31.
[4] 黄斌,王勇红,姜来想.GNSS兼容接收机及其在CORS中的应用[J].测绘通报,2007(1):29-32.
[5] BLANCHETTE J,SUMMERFIELD M.C++ GUI Qt4编程[M].闫锋欣,曾泉人,张志强,译.2版.北京:电子工业出版社,2008.
[6] 黄宇东,胡跃明,陈安.基于Qt的多线程技术应用与研究[J].软件导刊,2009(10):40-42.
[7] 眭俊华,刘慧娜,王建鑫,等.多核多线程技术综述[J].计算机应用,2013(增刊1):239-242.
[8] 顾彤辰.FTP客户端及服务器系统的设计与实现[D].南京:南京邮电大学,2016.
[9] 郑营营.基于HTTP/FTP协议的断点续传多线程下载组件[D].济南:济南大学,2012.
[10] 龚俐,毛晓蛟.基于C#的FTP客户端的实现[J].电脑编程技巧与维护,2010(24):94-95.
[11] 刘爽,史国友,张远强.基于TCP/IP协议和多线程的通信软件的设计与实现[J].计算机工程与设计,2010(7):1417-1420.