李 莉,殷志強2,張錫嶺
(1.中國石油大學(華東)計算機與通信工程學院,山東 東營 257061;2.勝利油田物探研究院,山東 東營 257000)
在油田勘探和開發過程中,每天都會產生大量的生產動態原始數據,如鉆井進尺數據、鉆井液數據、試油測試情況等。這類數據是油田生產現狀的最直接反映和第一手資料,需要及時上報管理部門,以便指導下一步工作,同時,油田還有多套勘探開發專業軟件需要應用這些生產數據,并通過與地質、工區、井等模型的綜合分析,建立該地區詳細全面的生產管理決策數據庫、模型庫[1];因此,數據采集是油田生產信息化管理的基礎,沒有充足的數據作支撐,再強大的生產管理軟件也起不到應有的作用。由于油田施工現場覆蓋面廣,大多施工單位在偏遠的地區,如山區、沙漠等,而且施工地點不固定;因此,一般需要通過無線網絡進行數據的上報。然而,無線網絡受天氣、環境的影響較大,很多情況下網絡無法連通,或者時斷時續,無法順利地通過在線系統進行實時的數據采集。另一方面,部分重要的科研成果資料、油田儲量信息等保密級別很高的材料,按有關規定不允許通過網絡上報,只能在特定的機器上完成采集后,通過移動存儲設備加載到中心服務器。上述所有情況都需要考慮通過離線采集技術實現數據采集。
本文首先總結當前離線采集系統存在的問題,然后針對這些問題提出基于Javascript的DOM解析以及XML文件本地存儲和傳輸的設計思路,并對其關鍵技術進行詳細分析論述,最后對系統實際應用情況進行總結和說明。
目前,常見的數據離線采集系統是一套單獨開發的與在線系統功能和數據庫結構都相同的系統。它是將本地數據手動導入到服務器數據庫中[2]。這種方案完全照搬現有系統的功能模塊和數據庫,雖然具有系統開發簡單、周期較短、數據導入不需要進行復雜的數據映射對應等優點,但缺點也很突出,主要體現在以下幾個方面。1)系統維護工作量大。當在線系統發生任何變化,如數據庫增加或減少1個字段,離線系統也必須進行相應的更新,并且整個系統需要重新部署,代價較大。2)通用性差。一套在線系統就要單獨開發一套對應的離線系統,而油田生產應用的采集系統目前一般都有多套,如物探、鉆井、錄井、測井、試油等各個專業都有相應的在線數據采集系統[3],相應的開發工作量和成本以及日后維護的工作量都巨大。3)離線數據上報不夠及時。采集的離線數據一般通過郵件或者人工報送的方式上報到中心服務器,實時性較差,不能夠充分利用網絡條件好的時候進行數據上報。
針對油田生產的實際情況和目前離線系統存在的問題,離線采集系統的設計應重點包括以下方面。1)通用性。離線系統應能夠采集存儲現用系統的所有常見頁面輸入項,而不是僅針對特定系統的特定頁面模塊。離線數據體的結構和保存也應具有通用性,能夠適應不同的采集模塊。2)采集頁面數據項與中心服務器數據庫結構的松耦合。當數據庫結構發生變化導致在線系統采集元素變化時,能夠方便地定義離線數據與數據庫結構的對應關系,而不必修改離線數據體的結構。3)離線數據體的自動傳輸。系統應能夠自動檢測網絡情況,自動傳輸離線數據體[4]。4)數據自動校驗入庫。系統應能夠按照要求的數據規范自動導入到中心服務器。
經過研究分析可知,實現較為通用的離線數據采集應該包括以下幾個模塊。1)本地采集存儲工具。本地客戶端采集頁面和數據存儲模塊,可以自動分析頁面元素,將數據保存到本地。2)數據加密傳輸。對采集的數據進行打包加密,通過FTP等方式傳輸到服務器。3)數據校驗入庫模塊。根據定制的數據包與服務器數據庫的映射關系,自動完成離線數據的入庫。4)日志管理模塊。在上述各個主要環節,如本地采集存儲、壓縮加密、傳輸、入庫等環節均有相應的保存成功及失敗的日志記錄,便于分析原因。
系統工作流程如圖1所示。首先,在客戶端加載離線采集頁面,通過頁面分析組件和頁面存儲組件實現采集數據的通用離線存儲,并以XML文件的形式保存在客戶端;然后,通過數據加密傳輸服務,對客戶端文件進行加密壓縮,根據網絡情況自動傳輸或者手動傳輸到指定服務器;最后,服務器接收到數據包,根據入庫映射配置,解析XML文件,并根據校驗規則進行入庫校驗,校驗成功的數據自動入庫。所有操作都通過日志文件進行記錄。

圖1 離線采集主要環節
通用存儲工具是本系統的核心模塊,主要負責本地數據的采集和存儲。
目前,油田常用的在線采集系統一般為B/S系統。為減少二次開發的工作量,可以將現用的在線采集系統的頁面進行簡單改造,去掉后臺儲存到數據庫的部分和權限部分,僅保留實際采集項,仍然以B/S的方式在客戶端運行。當在線系統發生變化或者增加新的離線系統時,仍然可以按照此種方式快速生成新的離線采集頁面,從而大大縮短開發周期和節省成本。
為實現上述設計思路,采集頁面應該具有高度的靈活性,支持常見的頁面控件格式,如單行、多行文本框,隱藏控件、復選框、下拉框、單選框等等,并且與存儲部分盡量松耦合[5];因此,采集頁面中應包含通用的頁面分析組件和數據存儲組件2部分。頁面分析組件能夠自動對采集頁面進行分析,以組件的ID為單位(組件ID在頁面中是唯一的),從而獲取頁面的采集元素及所錄入的值。與此相對應的,數據存儲組件中存儲數據內容應該隨著頁面采集元素的變化而變化。
1)頁面分析組件。對頁面元素的分析,必須依賴于DOM(Document Object Model, 文檔對象模型)。DOM是W3C國際組織的一套Web標準,一種用于HTML和XML文檔的編程接口,為文檔提供一種結構化的表現方式。網頁上的標簽是樹狀結構,每個頁面元素都可以被確切的定位,各種編程語言都可以通過DOM來訪問頁面。頁面分析組件是通過JavaScript對DOM的操作來實現的[6]。在本文中,主要應用DOM對象的Document接口通過JavaScript循環遍歷,從而獲得所需要的組件ID和值。獲取所有控件,對不同頁面控件的處理腳本如下:
function queryElementsInput(){
var aryInput=document.body.getElementsByTagName("*");
for (var i=0; i < aryInput.length; i++) {
saveField(aryInput[i].type);
…
}
}
function saveField(obj) {
var flashObject=getObject();
if (flashObject==null) return;
var type=obj.type;
switch (type) {
case′text′: case ′textarea′: case ′select-one′:case ′hidden′:
flashObject.savetext (obj.id, obj.value);
….
case ′checkbox′:
flashObject.savechecked(obj.id, obj.checked);
….
case ′radio′:
…
case ′file′:
….;
}
}
函數queryElementsInput通過Document接口的getElementsByTagName方法獲取頁面上的所有頁面控件集合并賦值給aryInput集合,通過for循環獲得每個控件類型。由于不同的頁面控件ID及錄入值的處理方式不同,需要根據控件類型分別處理。根據不同的類型,調用saveField函數,獲得不同控件的值,并調用數據存儲組件保存到XML文件中。
2)數據存儲組件。由于不同的采集系統采集的內容不同,且同一個頁面采集內容也有可能發生變化,同時,通過頁面分析組件獲取的實際采集數據的結構也是動態的;因此,采用常規的固定數據庫結構,不能很好地響應頁面變化。由于不同的系統采用的數據庫類型不盡相同,如油田系統中常見的就有Oracle、SqlServer等,因此異構是不可避免的[7]。基于此,在存儲部分,采用XML文件的方式保存一個具體頁面采集的內容[8]。XML文件的結構很簡單,僅包括頁面組件ID和與之一一對應的數據值以及是否需要通過網絡發送的屬性。這屬性是為了判斷采集的數據在網絡正常時是否通過網絡自動發送到服務器。XML文件格式如下:
....
通過上述設計,頁面分析組件和數據本地存儲組件都是通用的頁面組件,以.NET組件的形式進行封裝,可以加載到任意需要采集的頁面中,而采集頁面僅僅是一個外殼,在原有系統的基礎上稍加改動,保留原有的采集元素和頁面校驗邏輯即可。當離線采集數據采集完成后,所采集的數據以XML文件的形式保存到本地。
為便于數據傳輸,同時保證傳輸過程中的安全,需要自動對離線數據提供Zip格式打包壓縮加密,同時,屬性為可以通過網絡傳輸的數據,當網絡恢復正常時,應能夠自動傳輸到服務器;因此,應開發壓縮加密和自動傳輸組件,以Windows服務的形式運行在客戶端,自動定時掃描指定目錄。當數據存儲組件把XML文件存儲到本機指定目錄下之后,Windows服務自動進行文件的壓縮和加密,并保存到傳輸隊列[9]。傳輸隊列仍然采用XML文件的方式保存在本機。服務根據設置的時間間隔,自動檢測網絡環境,當網絡環境正常時,通過FTP協議自動傳輸到服務器指定位置,如果傳輸失敗,則自動進入傳輸隊列,等待下一次調用[10]。整個過程由數據加密傳輸組件獨立完成,通過接口與數據存儲組件進行交互,如圖2所示。

圖2 加密傳輸
密級要求很高的數據,則根據XML中的屬性,不進行網絡傳輸,由人工通過移動存儲介質報送。
數據包傳輸到中心服務器之后,需要經過解壓、校驗、入庫等一系列操作,因此仍然采用Windows服務。由于各個采集點傳輸到服務器的離線包的內容遵循統一的標準,具備了準確讀取離線包數據的基本條件,因此可以在完成必要的校驗之后離線自動入庫。以移動介質上報的數據,則可以通過手動添加入庫平臺進行分析和入庫。
由于離線數據文件中只保存了字段名和采集的數據,而且在服務器的數據庫中,這些字段和值可能保存在不同的表中;因此,需要事先定義和維護所有具體采集模塊的字段和數據庫表之間的映射關系[11],如復雜的數據庫結構、主鍵/外鍵的對應關系、主鍵的生成方式、字段的類型等等。映射文件結構如圖3所示。

圖3 數據結構映射關系
考慮到實際應用中數據庫結構的復雜性,映射文件包含2個大的節點MasterTable(主表)和SubTables(子表集合)。SubTables節點下可以有多個Subtable(子表),可根據實際情況進行擴充。主表和子表下又包括Fields(字段集合)。通過Field(字段)描述具體字段的屬性以及與離線數據體中數據的對應關系。
根據上述映射關系,生成某個采集模塊對應的映射文件,其具體內容如下:
.....
....
文件中首先定義主表Jxbxxb,主鍵JH,具體字段JH、JS等。其中,“JH”數據類型是string類型,對應離線數據體中fromControlid是“JH”。其他字段的定義與此相同。
此映射文件包含一個子表“CSSJ”。其中,主鍵是“SYJH”和“CW”,外鍵是“JH”,其他字段定義與主表的定義方式相同。根據實際的應用情況,還可以繼續擴充多個子表。
此映射關系通過配置文件的形式保存在服務器,由入庫模塊對每個離線的數據文件按照此映射關系進行分析[12],分析完成之后,執行入庫校驗,如:常見的是否為空;邏輯校驗等等。符合校驗條件的則數據自動入庫,不符合條件的記錄通過事務機制回退,相關記錄均不能入庫。所有操作均記錄在獨立的系統日志模塊中。
本系統客戶端的通用存儲部分采用Javascript開發,由封裝好的組件調用,可在任何網頁引用。客戶端數據的加密傳輸服務和服務器端的數據校驗入庫服務則采用了.NetFramework 4.0,C#語言開發。整個系統的解決方案采用了微軟的Enterprise Library(企業庫)實現緩存、加密等公用模塊配置和開發。各部分包括:1)采用.NET框架的ServiceProcess命名空間中的ServiceBase和ServiceController類開發Windows服務程序;2)采用XML 文件作為數據映射和配置信息的載體,并調用XmlSerializer類實現XML的序列化與反序列化;3)引用ICSharpCode類庫實現多個文件的壓縮;4)使用FtpWebRequest 和 FtpWebResponse 類、FTP類開發文件傳輸的FTP類庫,實現基于FTP協議的遠程連接、文件傳輸、狀態響應等功能,并采用Thread類實現文件傳輸的多線程操作;5)引用Enterprise Library的LogEntry類,實現系統的日志管理部分。
針對組件的通用性、數據采集的完整性,對文件傳輸及入庫準確性和效率等方面進行了系統測試。通過某油田多個采油隊、鉆井隊的不同網絡環境下進行的測試結果表明,數據采集的準確性比原系統平均提高約19.5%,數據傳輸效率平均提高約27.5%,均達到系統的預期效果。
該系統與原有離線采集系統相比,在以下方面具有顯著優勢。
1)系統開發周期短。原采集系統需要把B/S系統轉為C/S系統,所有功能模塊重寫,可重用的部分較少,開發周期長。現系統開發時,只需要去掉原采集系統的B/S頁面中的頁面存儲和權限校驗部分,定義數據存儲映射文件,原系統的大部分內容可重用,而且原系統底層及公用組件可直接重用,開發周期可縮短近50%。圖4是本系統與原錄井離線采集系統和原試油離線采集系統的開發周期對比圖。當系統需要修改或者擴展時,所需的工作量也與系統開發周期的對比情況基本類似。

圖4 現離線采集系統與原離線采集系統開發周期對比
2)系統在擴展性、通用性、可維護性等方面與原系統相比也具有極大優勢,具體情況的對比分析如表1所示。

表1 應用對比
目前,該系統已在油田的多個單位得到了應用,如表2所示。下一步還計劃在油田內部更多的生產單位推廣應用,其應用范圍正在不斷擴大。

表2 應用范圍
本文在總結油田生產數據采集現狀以及現有離線采集系統存在問題的基礎上,提出了一種通用離線采集系統的設計思路和實現方式。該系統采用基于組件的開發方式和XML文件的數據存儲和映射,通過數據自動加密傳輸,最后經過數據校驗自動入庫。該系統全面提高了離線采集系統的通用性、準確性和擴展性,經過實際應用,取得了較好的效果,具有廣泛的應用前景。在今后的研究中,將結合近期應用廣泛的HTML5在離線應用方面的新技術[13],對獲取頁面動態生成的控件ID和值、復雜的表格、錄入過程中需要上傳大數據體等較為復雜的情況繼續深入研究,進一步提高系統的通用性和穩定性。
[1]張益政.油田勘探生產管理及井位導航系統設計與實現[D].大連:大連理工大學,2005.
[2]周晴紅,陳中育,李平,等. 一種離線數據采集技術的研究與應用[J]. 計算機與現代化,2006(10):70-71.
[3]張華義,何東溯,汪福勇,等.西南勘探與生產技術數據管理系統實施與總結[J]. 石油工業計算機應用, 2009(3):2-4.
[4]張華義,何東溯,汪福勇,等.勘探開發數據整理平臺開發與應用[J].天然氣勘探與開發,2009(4):69-74.
[5]Robert C Martin,Micah Martin. 敏捷軟件開發:原則、模式與實踐[M]. 鄧輝,孫鳴,譯.C#版.北京:人民郵電出版社,2012:104-105.
[6]Nicholas C Zakas. JavaScript高級程序設計 [M]. 李松峰,曹力,譯. 3版.北京:人民郵電出版社,2012:277-279.
[7]薛堯予,王建林,趙利強.分布式過程實時數據集成方法及其實現 [J]. 計算機工程,2010,36(3):55-57.
[8]趙芳云. 基于XML的異構數據源查詢系統設計[J]. 計算機應用與軟件,2009,26(8):185-188.
[9]Christian Nagel,Bill Evjen,Jay Glynn. C#高級編程 [M]. 李銘,譯. 7版.北京:清華大學出版社,2010:692-694.
[10]巫鐘興. 數據加密傳輸系統的研究與應用[D]. 北京:北京化工大學,2010.
[11]Hector Garcia-Molina,Jeffrey D Ullman,Jennifer Widom. 數據庫系統實現 [M]. 楊冬青,徐其鈞,唐世渭,譯. 2版.北京:機械工業出版社,2010:424-426.
[12]彭新一,黃競斌,黃志煒.一種面向大規模分布式數據采集的標準化方法[C]//The 3rd International Conference on Computational Intelligence and Industrial Application (PACIIA2010) .武漢:[出版者不詳],2010:217-222.
[13]陸凌牛. HTML5與CSS3權威指南[M]. 北京:機械工業出版社,2012:151-158.