摘 要:數(shù)據(jù)采集是監(jiān)測類信息化項(xiàng)目的基本功能。實(shí)現(xiàn)該功能的方法有多種,而最常用的是借助GPRS技術(shù)利用TCP協(xié)議進(jìn)行采集后數(shù)據(jù)傳輸?shù)姆椒ā1疚慕ㄔO(shè)的基于TCP協(xié)議的多線程數(shù)據(jù)采集系統(tǒng)利用C#編程技術(shù)實(shí)現(xiàn),考慮到多終端同時(shí)發(fā)送數(shù)據(jù)的實(shí)際情況,采集處理用到了多線程技術(shù)。
關(guān)鍵詞:數(shù)據(jù)采集;GPRS;TCP;C#;多線程
中圖分類號(hào):TP311.52 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2018)07-0022-03
Abstract:Data acquisition is the basic function of monitoring information projects. There are many ways to achieve this function,and the most commonly used method is to use GPRS technology to use TCP protocol to collect data after transmission. The multi thread data acquisition system based on TCP protocol in this paper is realized by C# programming technology. Considering the actual situation of multi terminal data transmission at the same time,multi thread technology is used in the acquisition and processing.
Keywords:data acquisition;GPRS;TCP;C#;multithreading
0 引 言
隨著信息化水平的不斷發(fā)展和提升,信息技術(shù)在各行各業(yè)的應(yīng)用逐漸擴(kuò)展,并為他們帶來了實(shí)際的效益。尤其近幾年來,國家水利、水資源監(jiān)控項(xiàng)目集中部署,信息技術(shù)為該行業(yè)的項(xiàng)目建設(shè)提供了強(qiáng)有力的技術(shù)支撐,并為國家地下水監(jiān)測、水資源監(jiān)控能力監(jiān)測打造了智能化、高效化、網(wǎng)絡(luò)化、實(shí)用性很高的成功案例。
1 關(guān)鍵技術(shù)
1.1 GPRS技術(shù)
GPRS技術(shù)(General Packet Radio Service)是一種移動(dòng)數(shù)據(jù)業(yè)務(wù),以數(shù)據(jù)包(Packet)的方式傳輸。它通過GSM網(wǎng)絡(luò)中未被使用的TDMA信道,提供中速的數(shù)據(jù)傳遞,傳輸速率可提升至56kb/s甚至達(dá)到114kb/s。本項(xiàng)目中的監(jiān)測終端就是利用GPRS模塊與公網(wǎng)(專網(wǎng))指定的地址建立TCP連接,并將數(shù)據(jù)傳送出去。
1.2 TCP協(xié)議
TCP(Transmission Control Protocol)是一種基于字節(jié)流的點(diǎn)對(duì)點(diǎn)的傳輸控制協(xié)議,TCP用一個(gè)校驗(yàn)和函數(shù)來檢驗(yàn)數(shù)據(jù)是否存在錯(cuò)誤,在發(fā)送和接收時(shí)都要計(jì)算、校驗(yàn),從而提高了數(shù)據(jù)傳輸?shù)目煽啃浴1疚闹械腡CP客戶端為大量的現(xiàn)場監(jiān)測終端,TCP服務(wù)端為中心數(shù)據(jù)采集系統(tǒng)。
1.3 多線程編程
多線程(Multithreading)編程,是指在軟件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù)。程序中獨(dú)立運(yùn)行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理(Multithreading)”。具有多線程處理能力的程序,會(huì)有效避免短時(shí)間內(nèi)的數(shù)據(jù)擁堵。本文因業(yè)務(wù)需要采集終端數(shù)據(jù)上傳時(shí)間為同一時(shí)刻,為避免數(shù)據(jù)收發(fā)確認(rèn)延時(shí)和處理異常,系統(tǒng)采用了多線程編程技術(shù)。
2 系統(tǒng)實(shí)現(xiàn)
2.1 系統(tǒng)概述
現(xiàn)場用水戶或地下水位監(jiān)測點(diǎn),通過安裝監(jiān)測設(shè)備(如水位計(jì)、流量計(jì)等)來獲取監(jiān)測數(shù)據(jù),為了將監(jiān)測數(shù)據(jù)可以按時(shí)發(fā)送至指定服務(wù)中心,在安裝的監(jiān)測設(shè)備上連接帶有GPRS數(shù)據(jù)采集發(fā)送功能的采集終端,終端按照設(shè)置好的收發(fā)規(guī)則進(jìn)行數(shù)據(jù)收發(fā)。圖1為數(shù)據(jù)處理原理圖。
2.2 主要設(shè)備
系統(tǒng)主要的設(shè)備如表1所示。
2.3 數(shù)據(jù)采集系統(tǒng)
(1)系統(tǒng)環(huán)境。開發(fā)平臺(tái):Microsoft Visual Studio 2010。開發(fā)語言:實(shí)現(xiàn)語言C#。數(shù)據(jù)庫:Microsoft SQL Server 2008。服務(wù)器操作系統(tǒng):Windows Advanced Server2008。(2)系統(tǒng)架構(gòu)。數(shù)據(jù)采集系統(tǒng)采用三層架構(gòu)設(shè)計(jì)模式,使系統(tǒng)開發(fā)達(dá)到高內(nèi)聚低耦合的目標(biāo),為未來可能的系統(tǒng)擴(kuò)展和系統(tǒng)移植打下了堅(jiān)實(shí)的基礎(chǔ)。同時(shí),該架構(gòu)的應(yīng)用為系統(tǒng)向產(chǎn)品化、標(biāo)準(zhǔn)化發(fā)展提供了技術(shù)上的可能,也大大提高了系統(tǒng)的開發(fā)效率。(3)GPRS數(shù)據(jù)采集、發(fā)送服務(wù)。系統(tǒng)借助.Net 2010開發(fā)平臺(tái),利用C#編程,實(shí)現(xiàn)了數(shù)據(jù)的采集收發(fā)功能,數(shù)據(jù)采集終端通過GPRS網(wǎng)絡(luò)與服務(wù)中心建立TCP連接,通過固化的上傳機(jī)制將當(dāng)前需要上傳的數(shù)據(jù)分包發(fā)送至指定中心地址,數(shù)據(jù)中心采集系統(tǒng)軟件在正確解析數(shù)據(jù)后發(fā)送響應(yīng)包至采集終端,待采集系統(tǒng)發(fā)送結(jié)束包至終端,終端回應(yīng)結(jié)束包,本次上傳結(jié)束。數(shù)據(jù)采集收發(fā)機(jī)制如圖2所示。
2.3.4 多線程編程
為滿足接收多終端(一般項(xiàng)目終端數(shù)量在千臺(tái)左右),同時(shí)發(fā)送的數(shù)據(jù)的需求,在編程時(shí)采用了多線程編程技術(shù)。為達(dá)到更好的數(shù)據(jù)處理效果,要求數(shù)據(jù)中心配置企業(yè)級(jí)服務(wù)器,內(nèi)存不低于16G。實(shí)例代碼如下:
Thread threadWatchTcp=1;//負(fù)責(zé)監(jiān)聽客戶端連接請(qǐng)求的線程
Dictionary
Dictionary
TcpListener TcpListener;//監(jiān)聽
///
///監(jiān)聽客戶端請(qǐng)求的方法
///
void start_Tcpserver()
{
while (true)//持續(xù)監(jiān)聽客戶端連接請(qǐng)求
{
try
{
//監(jiān)聽到客戶端請(qǐng)求,就返回一個(gè)與該客戶端通信的套接字
Socket sokConnection=TcpListener.AcceptSocket();
//將與客戶端連接的套接字對(duì)象添加到集合
dictSocketTcp.Add(sokConnection.RemoteEndPoint.ToString(),sokConnection);
//創(chuàng)建新處理線程
Thread threadTcp=new Thread(RecMsg);
threadTcp.IsBackground=true;
threadTcp.Start(sokConnection);
//將新建的線程添加到線程集合
dictThreadTcp.Add(sokConnection.RemoteEndPoint.ToString(),threadTcp);
}
catch (Exception ex)
{
//異常處理;
}
}
}
///
///接收信息
///
///
void RecMsg(object sokConnectionparn)
{
Socket sokClient=sokConnectionparn as Socket;
while (true)
{
//定義一個(gè)緩存區(qū)
byte[] arrMsgRec=new byte[1024 * 1024 * 2];
//將接到的數(shù)據(jù)存入到輸入arrMsgRec中
int length=-1;
//接收數(shù)據(jù),并返回?cái)?shù)據(jù)的長度
length = sokClient.Receive(arrMsgRec);
if(length<=0)
{
//從通信套接字集合中刪除被中斷連接的通信套接字;
dictSocketTcp.Remove(sokClient.RemoteEndPoint.ToString());
//掛起線程
dictThreadTcp[sokClient.RemoteEndPoint.ToString()].Suspend();
//從通信線程集合中刪除被中斷連接的通信線程對(duì)象
dictThreadTcp.Remove(sokClient.RemoteEndPoint.ToString());
break;
}
byte[] recData=new byte[length];
Buffer.BlockCopy(arrMsgRec,0,recData,0,length);
//此處編寫數(shù)據(jù)解析及處理方法
}
}
4 數(shù)據(jù)采集系統(tǒng)其他主要功能
(1)基礎(chǔ)數(shù)據(jù)管理。系統(tǒng)實(shí)現(xiàn)對(duì)區(qū)域、站點(diǎn)、單位、終端等基礎(chǔ)數(shù)據(jù)的管理,以及系統(tǒng)基本的權(quán)限數(shù)據(jù)管理等。(2)數(shù)據(jù)解析、存儲(chǔ)。系統(tǒng)對(duì)接收的數(shù)據(jù)進(jìn)行準(zhǔn)確的解析,并對(duì)解析結(jié)果進(jìn)行校核,校核無誤后生成回應(yīng)指令并保存解析的采集數(shù)據(jù)。(3)數(shù)據(jù)緩存處理。對(duì)于短時(shí)間大數(shù)據(jù)量接收的系統(tǒng)來說,數(shù)據(jù)緩存技術(shù)的運(yùn)用是必須。緩存的目的是錯(cuò)時(shí)處理非關(guān)鍵數(shù)據(jù),保障關(guān)鍵數(shù)據(jù)處理的通暢。針對(duì)本功能該文暫不做詳細(xì)描述。(4)日志管理。主要記錄系統(tǒng)處理日志,內(nèi)容包括異常日志、可疑日志、臨時(shí)數(shù)據(jù)日志等數(shù)據(jù)處理相關(guān)日志內(nèi)容。(5)報(bào)警管理。對(duì)于異常或可疑的情況系統(tǒng)通過報(bào)警系統(tǒng)及時(shí)將信息發(fā)送給指定管理人員,發(fā)送形式可以是短信、App、郵箱等多種形式。
5 結(jié) 論
基于TCP的多線程數(shù)據(jù)采集處理系統(tǒng)在我單位的項(xiàng)目中應(yīng)用廣泛,目前在天津地下水位監(jiān)測、天津水資源能力監(jiān)測、天津基坑計(jì)量控制沉降等項(xiàng)目中均有應(yīng)用。系統(tǒng)嚴(yán)格按照軟件開發(fā)行業(yè)標(biāo)準(zhǔn)規(guī)范執(zhí)行,穩(wěn)健、可靠,切實(shí)為用戶提供了方便。
參考文獻(xiàn):
[1] [美]萊特,史蒂文斯.TCP/IP詳解(卷2:實(shí)現(xiàn)) [M].陸雪瑩,等,譯.北京:機(jī)械工業(yè)出版社,2008.
[2] 易飛.GPRS網(wǎng)絡(luò)信令實(shí)例詳解 [M].北京:人民郵電出版社,2013.
[3] [英]Jayaram Krishnaswamy. Learning SQL Server 20 08 Reporting Services [M].英國:Packt Publishing,2009.
[4] [美]EugeneAgafonov. C#多線程編程實(shí)戰(zhàn) [M].黃博文,黃輝蘭,等,譯.北京:機(jī)械工業(yè)出版社,2015.
作者簡介:孟祥杰(1980-),男,山東齊河人,工程師,工學(xué)學(xué)士。從事行業(yè)軟件系統(tǒng)應(yīng)用開發(fā)及項(xiàng)目管理工作。