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