陳容華 李方方
摘 要:文章提出了在計算機系統(tǒng)工程中廣泛應用的集網(wǎng)絡通信與RS232串口通信等綜合信道通信管理器的功能需求,敘述了該通信管理器既可以作為通信服務器,又可以作為局域網(wǎng)前端通信控制器的具體工作模式,給出了該通信管理器的設計思路和具體實現(xiàn)方法,并描述了個部分的執(zhí)行流程。
關(guān)鍵詞:多線程;網(wǎng)絡通信;串口通信;.Net;C#
隨著互聯(lián)網(wǎng)與物聯(lián)網(wǎng)技術(shù)的應用,各種與之相應的新技術(shù)和新應用層出不窮。但歸根到底,所有的應用都是基于對相關(guān)設備的運行和狀態(tài)信息進行采集、存儲及在網(wǎng)絡上進行傳輸。在當前的實際工程項目中,需要有這樣一類通信前置服務器,即可以與后臺客戶端進行通信,充當前端通信服務器,接收并處理來自這些客戶端的各類請求。另一方面,這種通信服務器又需要作為客戶端,與作為服務器端的現(xiàn)場設備進行相連,這類通信管理器廣泛應用于工業(yè)現(xiàn)場的數(shù)據(jù)采集和信息傳輸系統(tǒng)中。目前工程上開發(fā)的這類通信管理器都與具體的項目直接關(guān)聯(lián),也就是與具體系統(tǒng)的數(shù)據(jù)傳輸規(guī)約直接關(guān)聯(lián),這一類系統(tǒng)應用較好的通信控制器往往不能方便地移植到其他系統(tǒng),嚴重制約了其推廣應用[1]。本文敘述設計和實現(xiàn)一種通用型的通信管理器的思路和方法,這種通信管理器將具體的數(shù)據(jù)通信規(guī)約與通信服務進行徹底分離,確保開發(fā)出的通信管理器更加具有通用性。涉及實現(xiàn)的通信服務器可接入不同類型的客戶端,盡管這些客戶端采用不同的通信技術(shù),本通信服務器都能夠為這些不同類型的客戶端提供數(shù)據(jù)服務。
該通信管理器系統(tǒng)基于TCP/IP通信協(xié)議,使用較為成熟的開發(fā)平臺Visual studio IDE。圍繞提供了多種屬性和操作函數(shù)的Microsoft WinSocket控件及串口空間來編寫代碼,同時考慮系統(tǒng)通信的實時性,運用了多線程技術(shù)。
1 功能需求
前置通信服務器功能要求如下:(1)接收來自經(jīng)授權(quán)的客戶端的連接請求,與客戶端建立TCP連接。(2)接收來自客戶端的數(shù)據(jù)報文,存儲、顯示并實時處理這些報文。(3)將這些報文通過各類接口(串口或Can總線等)轉(zhuǎn)發(fā)給有關(guān)現(xiàn)場設備。(4)接收現(xiàn)場運行的有關(guān)設備的上傳的各類報文信息,并將此報文信息進行存儲處理,同時回傳給客戶端[2]。
2 設計與實現(xiàn)
2.1 RS232通信實現(xiàn)
通信管理器的RS232通信部分使用了C#提供的SerialPort控件來實現(xiàn)對串口通信過程進行控制。該控件的命名空間為System.IO.Ports。
實際編程實現(xiàn)時,除需要設置這些屬性參數(shù)外,還需要調(diào)用SerialPort控件的常用函數(shù)。
SerialPort控件的常用事件為DataReceived,用該函數(shù)直接處理SerialPort 對象的數(shù)據(jù)接收事件。
系統(tǒng)啟動后,將首先初始化串口,設置串口號(支持多個串口同時通信)、通信波特率、數(shù)據(jù)位、校驗位、停止位。然后調(diào)用open函數(shù)打開串口。當串口SerialPort控件偵聽到有數(shù)據(jù)時,觸發(fā)DataReceived事件,啟動數(shù)據(jù)接收函數(shù),將緩沖區(qū)的數(shù)據(jù)字節(jié)都入到一個數(shù)組中,然后通過該其他通信方式轉(zhuǎn)發(fā)到后臺客戶機中,并將這些通信報文存儲在本地日志文件中。
2.2 Socket控件類
本系統(tǒng)的網(wǎng)絡通信基于TCP/IP協(xié)議,一般此類協(xié)議實現(xiàn)的基本流程為:首先在服務器端新建一個通信套接字,服務器處于等待監(jiān)聽狀態(tài),但服務器端serverSocket并不定位具體的客戶端socket,而是實時監(jiān)控網(wǎng)絡的狀態(tài)。當客戶端的某個連接套接字clientSocket向服務器發(fā)送連接請求(其目標是服務器的serverSocket)時,clientSocket必須知道serverSocket的地址和端口號,發(fā)出連接請求。當服務器socket監(jiān)聽到或者是收到客戶端socket的連接請求時,服務器就立即響應客戶端的請求(有時可根據(jù)安全需要,拒絕客戶端的連接請求),建立一個新的Socket,把服務器Socket發(fā)送給客戶端,一旦客戶端確認連接,則連接建立。上述流程的實現(xiàn)都通過事件觸發(fā)產(chǎn)生。
由于前置通信服務器既需要為后臺客戶端提供接入服務,同時需要請求連接現(xiàn)場的監(jiān)控設備,因此,本系統(tǒng)同時具備服務器和客戶機雙重通信功能,無疑增加了系統(tǒng)的復雜性。因此,本系統(tǒng)設計主要思想為:利用C#控件為服務器端實現(xiàn)與后臺客戶機進行通信,而通過創(chuàng)建若干個Socket對象來與現(xiàn)場監(jiān)控設備(作為服務端,處在偵聽狀態(tài),IP地址與端口號已知)進行連接。
為此,在通信服務器上,設置一個定時器,如50 ms,定時監(jiān)測現(xiàn)場設備是否上線,當現(xiàn)場設備上線后,由于這些設備IP地址是固定的,通信服務器將循環(huán)掃描每個設備的上線狀態(tài),并對未連接成功的遠端發(fā)起連接,如果檢測到連接成功狀態(tài),將這些套接字放入一個Socket隊列中[3]。
程序執(zhí)行中,當某一Socket有數(shù)據(jù)輸入時,啟動觸發(fā)事件,在DataArrival函數(shù)中讀入網(wǎng)絡中遠端的數(shù)據(jù),放入某一隊列,由其他進程進行處理。
2.3 Tcplistener類與多線程
通信服務器需要對后臺管理機進行通信,此時,又要將它設置成服務模式,為此,需采用多線程技術(shù)。正好在C#中,針對網(wǎng)絡通信,提供了一個專門的類Tcplistener,這個類是對Socket Tcp協(xié)議封裝的接口,更便于用戶的開發(fā)。利用Tcplistenner類的各類函數(shù),編程要點描述如下。
(1)建立Tcp監(jiān)聽器TcpListener對象。
TcpListener serverListenner = new TcpListener (IPAddress.Any, IPAddr,Port);
其中IPAddress.Any是固定參數(shù),IPAddr為本服務器的IP地址,Port為端口號。
(2)調(diào)用serverListenner對象的Start函數(shù)啟動偵聽。此時,新建一個新的線程tNetClient,定義為客戶端連接線程,并且啟動該線程。具體代碼如下。
listener.Start();
tNetClient = new Thread(AcceptClient);
tNetClient.IsBackground = true;
tNetClient.Start();
(3)當有客戶端連接進來,執(zhí)行客戶端連接線程,具體代碼如下。
private void AcceptClient(){
while (true)
{
TcpClient thisClient = listener.AcceptTcpClient();
winSocketClients.Add(thisClient);
}
}
(4)通過Socket的Receive方法獲取客戶端發(fā)送的數(shù)據(jù)
byte [] resData = new byte[2048];
int kLen = s.Receive(resData);
(5)通過Socket的Send方法向客戶端發(fā)送數(shù)據(jù)
byte[] sendData=System.Text.Encoding.Default.GetBytes(“text”);
mySocket .Send(sendData);
程序?qū)⒍〞r掃描各個連接套接字,如有遠程端點發(fā)過來的數(shù)據(jù),則啟動接受程序,讀入數(shù)據(jù),并存入緩存中,待其他線程處理。
3 結(jié)語
本文針對既需要為多個后臺工作站提供通信服務,又要同時接入多個遠程服務器的需求,設計出符合功能需求的綜合通信管理器,系統(tǒng)設計運用了各類控件技術(shù)和多線程編程技術(shù)。并用C#編程語言,實現(xiàn)了最終的系統(tǒng)。經(jīng)實際運行測試,系統(tǒng)穩(wěn)定可靠。
[參考文獻]
[1]詹姆斯·庫羅斯.計算機網(wǎng)絡:自頂向下方法[M].7版.北京:機械工業(yè)出版社,2018.
[2]尹圣雨.TCP/IP網(wǎng)絡編程[M].北京:人民郵電出版社,2014.
[3]邢彥辰.數(shù)據(jù)通信與計算機網(wǎng)絡[M].北京:人民郵電出版社,2011.
[4]Chenjx2014.RS-232通信程序設計[EB/OL].(2017-03-09)[2018-12-24].https://blog.csdn.net/haitaolang/article/details/60956456.