時榕茂
(上海船舶運輸科學研究所,上海 200120)
船舶監(jiān)測系統(tǒng)主要用于對全船各機電設(shè)備實現(xiàn)各種重要參數(shù)的測量和超限報警等,同時具有對各種重要設(shè)備進行遠程集中控制、區(qū)域監(jiān)控,對空壓冷水機等進行健康管理及數(shù)據(jù)采集處理等功能,是一個控制測量、安全保護以及管理一體化的系統(tǒng),主要安裝在集控臺。在實際生產(chǎn)運行過程中由于計算機臺數(shù)比較多且比較分散,當系統(tǒng)需要升級時,需要船上工作人員花費大量的時間在不同的地點、不同的計算機設(shè)備上進行逐個手工升級操作,這大大降低了工作效率。
隨著計算機技術(shù)的不斷發(fā)展,對于軟件系統(tǒng)交付給客戶之后的維護升級工作,也是一項非常重要的環(huán)節(jié),功能需求的變化或提升往往需要對系統(tǒng)進行升級維護。當前船舶監(jiān)測系統(tǒng)主要采用C/S架構(gòu),隨著軟件的推廣和用戶的增多,此架構(gòu)的軟件系統(tǒng)升級維護工作一直是困擾工作人員的主要難點。以往的升級維護操作手段通常采用人工手動升級,由工作人員將需要更新的文件放入移動硬盤中,通過手工復(fù)制到運行文件夾中進行升級操作。由于電腦比較分散,工作人員需要對多臺電腦在不同地點進行重復(fù)安裝。這種操作方法,在實際應(yīng)用中不僅需要耗費大量的精力和時間,而且容易造成在升級過程中的一些操作不當引起的功能不全或其他錯誤,對客戶的使用安全造成不利的影響,存在安全隱患。
軟件維護是軟件整個生命周期的不可或缺的重要環(huán)節(jié)[1]?;趥鹘y(tǒng)的人工手動升級操作方式的自動化效率太低,為了改善應(yīng)用軟件的可靠性和可適應(yīng)性,實現(xiàn)軟件系統(tǒng)的自動升級就顯得尤為必要。為解決此問題在實際生產(chǎn)中帶來的困擾,本文主要闡述實現(xiàn)船舶監(jiān)測系統(tǒng)的自動更新方法和實現(xiàn)過程,并在實際生產(chǎn)中取得了非常好的使用效果。
軟件自動升級的原理,主要涉及兩個程序,一個是主程序(即船舶監(jiān)測系統(tǒng),簡稱F22P.exe),一個是升級程序(主要用于軟件自動升級,簡稱update.exe)。所有的版本更新升級均由升級程序完成。首先計算機開機后,升級程序自動啟動,升級程序啟動后通過協(xié)議讀取服務(wù)器中update.xml配置文件中的版本號,然后與客戶端的程序版本號信息進行比較,如果版本號一致或客戶端版本號大于服務(wù)器中的文件版本號不需要進行自動升級,反之,則需要對程序進行更新,圖1為船舶監(jiān)測系統(tǒng)自動升級的流程圖。
圖1 船舶監(jiān)測系統(tǒng)自動升級流程
如果客戶端程序需要更新,對其進行更新的詳細步驟如下:
(1)從服務(wù)端通過動態(tài)鏈接庫中的動態(tài)數(shù)組獲取需要下載更新的文件列表,下載文件列表到客戶端指定的臨時文件夾;
(2)檢查臨時文件夾中下載的文件是否為客戶端主程序更新所需的文件;
(3)檢查主程序是否啟動運行,如果運行則關(guān)閉主程序,或者主程序未運行但是主程序進程在運行,則關(guān)閉進程;
(4)備份主程序中的文件,將臨時文件夾中的所有文件替換到指定主程序的文件夾位置,覆蓋替換更新主程序文件;
(5)更新客戶端主程序文件中的版本號信息(主程序文件記錄在Version.txt中);
(6)關(guān)閉升級程序,完成升級;
(7)重新啟動主程序。
在服務(wù)器上創(chuàng)建FTP服務(wù)站點,打開FTP服務(wù)的端口號,采用FTP傳輸協(xié)議,客戶端向服務(wù)器端發(fā)送連接,通過同時打開并監(jiān)聽同一打開的端口號建立數(shù)據(jù)連接,采用socket通信原理完成服務(wù)端和客戶端的通信,服務(wù)端的功能主要包含:軟件自動升級檢測系統(tǒng)的更新文件包、自動升級程序客戶端管理,其中更新軟件包中包含update.xml配置文件和需要更新升級的所有文件;自動升級程序客戶端管理主要記錄客戶端已經(jīng)升級的電腦和應(yīng)該升級而暫未升級的電腦,對于應(yīng)該升級而未升級的客戶端則不斷提示需要升級。
用戶在客戶端安裝船舶監(jiān)測系統(tǒng)軟件后,在主程序安裝目錄下包含:主程序.exe、Version.txt(主要記錄版本信息)、lib文件夾(靜態(tài)庫,動態(tài)庫dll文件)、DATA文件夾(數(shù)據(jù)庫、各種圖元信息)、record文件夾(記錄日志文件)。
文件下載主要通過FTP文件傳輸協(xié)議,每次客戶端升級程序提出一個請求,服務(wù)器與客戶端通過控制連接相同的端口號建立一個數(shù)據(jù)連接,通過Socket實現(xiàn)文件的下載功能,通過downLoad?File()方法下載文件,下面是此方法的部分代碼。
FileStream output=new FileStream(‘本地文件名’,FileMode.Open);
Socket csocket=createDataSocket();//數(shù)據(jù)連接Socket
long offset=0;
offset=output.Length;
if(offset>0)
{
sendCommand("REST"+offset);
}
long npos=output.Seek(offset,SeekOrigin.Begin);
sendCommand("RETR"+remFileName);
while(true)
{
bytes=csocket.Receive(buffer,buffer.Length,0);
//接收指定的字節(jié)數(shù)存入緩沖區(qū)的位置
output.Write(buffer,0,bytes);//輸出內(nèi)容
if(bytes<=0)
{
break;
}
}
output.Close();
if(csocket.Connected)
{
csocket.Close(); //關(guān)閉數(shù)據(jù)連接
}
將升級文件替換到主程序文件之前,需要先將主程序文件備份到一個指定文件夾,可以更好地進行系統(tǒng)版本的管理。對主程序進行備份的主要步驟,首先遍歷主程序文件中所有的文件,把遍歷的文件存放在一個數(shù)組中,然后把所有的文件復(fù)制到備份文件中。
文件下載完畢后,自動升級文件需要更新替換主程序文件,如果主程序文件正在運行,則不能進行替換,必須先關(guān)閉主程序,升級程序首先遍歷找到該主程序進程,然后強制關(guān)閉該進程,主程序退出。
升級文件完成對主程序文件的更新替換后,需要對主程序進行重新啟動,這些操作需要升級程序執(zhí)行外部程序,本升級系統(tǒng)主要通過函數(shù)調(diào)用的方式打開主程序,可供參考的此類函數(shù)有很多個,本系統(tǒng)主要采用process.start()方式。
服務(wù)器端軟件配置文件update.xml,主要用來記錄程序的版本信息、軟件名稱、文件的更新日期、是否需要重新啟動應(yīng)用系統(tǒng)程序和需要重新啟動的主程序名稱。升級程序通過FTP協(xié)議從服務(wù)端獲取文件的最新的版本信息,與當下客戶端主程序的版本信息進行比較,若客戶端的當前應(yīng)用版本號小于服務(wù)端版本號,則系統(tǒng)彈出提示框提示用戶軟件需要升級(圖2),點擊確定按鈕,則軟件升級程序根據(jù)協(xié)議,對服務(wù)器端的更新文件全部下載,下載更新后,重新啟動主程序。以下是服務(wù)端update.xml配置文件的配置信息。
圖2 系統(tǒng)更新提示
//需要升級的文件更新日期
//需要升級的程序版本號
//需要重新啟動的程序名稱
通過方法讀取服務(wù)端的版本信息和客戶端的版本信息,以下是讀取服務(wù)端的版本信息代碼。
//獲取服務(wù)器端程序的版本號
WebClient wc=new WebClient();
Stream stream=wc.OpenRead(updateUrl);
XmlDocument xmlDoc=new XmlDocument();
xml Doc.Load(stream);//讀取XML配置文件
XmlNode list=xmlDoc.SelectSingleNode("Update");
foreach(XmlNode node in list)
{
if(node.Name=="Soft"&&node.Attributes["Name"].Value.ToLower()==SoftName.ToLower())
{
foreach(XmlNode xml in node)
{
if(xml.Name=="Verson")
newVerson=xml.InnerText;//讀取版本號
else
download=xml.InnerText;
}
}
}
以下是讀取客戶端的版本信息,讀取客戶端程序的版本號,客戶端版本號記錄在Version.txt文檔中,通過StreamReader讀取文檔中的版本號信息。
StreamReader sr=new StreamReader(path,Encoding.Default);
stringver=sr.ReadLine();//讀取文檔中的版本號
//檢查是否需要更新
int tm=verso.CompareTo(newVerson);
//比較客戶端版本號和服務(wù)器文件版本號
if(tm>=0)
isUpdate=false;
else
isUpdate=true;//執(zhí)行更新程序
對客戶端和服務(wù)端的版本信息進行比較,如果客戶端版本信息大于服務(wù)端版本信息,則不進行更新,反之則在客戶端界面彈出提示框,提醒用戶有新的版本信息需要進行更新,點擊確定按鈕,更新程序利用FTP傳輸協(xié)議將需要更新的文件從服務(wù)器下載到本地指定的臨時文件夾下,然后,更新程序?qū)σ呀?jīng)下載的文件進行檢驗,確保所下載文件屬于主程序升級所需要文件;最后完成文件替換,首先將待更新文件打包備份到指定文件位置,然后將臨時文件夾中的文件移動到主程序所在目錄下覆蓋更新,同時更新客戶端的主程序版本信息與服務(wù)器中的版本信息一致,重新啟動主程序即完成升級工作。
本文根據(jù)網(wǎng)絡(luò)協(xié)議、配置文件、C/S架構(gòu)等技術(shù),通過比較客戶端系統(tǒng)版本號和服務(wù)端文件版本號,實現(xiàn)船舶監(jiān)測系統(tǒng)的自動升級工作。自動升級系統(tǒng)的使用既節(jié)約大量的人員,也減少了船上工作人員的工作量,提高了工作效率,目前取得了較好的使用效果。與傳統(tǒng)的系統(tǒng)升級技術(shù)相比,本文所描述的自動升級系統(tǒng)具有成本低廉、出錯率低、效率高等特點,具有很高的生產(chǎn)使用價值,并且對系統(tǒng)采用版本控制的集中管理方式,使系統(tǒng)具有更好的可維護性,為研究其他船舶軟件的升級維護提供參考價值。