陳庭峰
摘要:為了方便管理與維修臨床信息設(shè)備,該文設(shè)計(jì)出一套用于臨床信息設(shè)備監(jiān)控的軟件。通過運(yùn)用C#編程技術(shù)和Sockets通信技術(shù),采用Client/Server的通訊模型,實(shí)現(xiàn)了監(jiān)控方法。通過實(shí)踐驗(yàn)證,該臨床設(shè)備監(jiān)控軟件不僅適用而且方便、高效。
關(guān)鍵詞:設(shè)備監(jiān)控;Sockets;Server;Client
中圖分類號:TP311 ? ? ? ?文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)28-0056-02
Abstract:in order to facilitate the management and maintenance of clinical information equipment, a set of software for clinical information equipment monitoring is designed. By using the C # programming technology and sockets communication technology, using the communication model of client/server, the monitoring method is realized. Through the practice verification, the clinical equipment monitoring software is not only applicable, but also convenient and efficient.
Key words: equipment monitoring; Sockets;Server;Client
近幾年,醫(yī)院基本實(shí)現(xiàn)病歷電子化的看病模式,就診、用藥記錄等信息都存檔于計(jì)算機(jī)。信息化發(fā)展帶來了諸多便利,但是問題是信息設(shè)備宕機(jī),損壞等情況不可避免,為了能實(shí)時(shí)了解設(shè)備使用狀況,設(shè)計(jì)出能夠動態(tài)觀察臨床設(shè)備的運(yùn)行狀況軟件就必不可少。本文主要介紹對于計(jì)算機(jī)和打印機(jī)的監(jiān)控。
1 Socket技術(shù)特點(diǎn)
所謂Socket通常也稱作“套接字”,實(shí)現(xiàn)服務(wù)器和客戶端之間的物理連接,并進(jìn)行數(shù)據(jù)傳輸,主要有UDP和TCP兩個(gè)協(xié)議[1]。Socket處于網(wǎng)絡(luò)協(xié)議的傳輸層。
UDP協(xié)議:廣播式數(shù)據(jù)傳輸,不進(jìn)行數(shù)據(jù)驗(yàn)證。
TCP協(xié)議:傳輸控制協(xié)議,一種面向連接的協(xié)議,給用戶進(jìn)程提供可靠的全雙工的字節(jié)流。優(yōu)點(diǎn)很多:(1)數(shù)據(jù)量小;(2)傳輸數(shù)據(jù)時(shí)間短、性能高;(3)適合于客戶端和服務(wù)器端之間信息實(shí)時(shí)交互;(4)可以加密且數(shù)據(jù)安全性強(qiáng)。
2 Windows下Socket的設(shè)計(jì)模式
臨床護(hù)理設(shè)備監(jiān)控主要采用Client/Server的通訊模型[2],設(shè)置服務(wù)器端和客戶端兩部分,數(shù)據(jù)結(jié)構(gòu)設(shè)置主機(jī)信息模塊和打印機(jī)信息模塊兩部分,通過Socket實(shí)現(xiàn)實(shí)時(shí)傳輸。
服務(wù)器和客戶端的通訊的前提是唯一標(biāo)志的進(jìn)程,由于IP層的IP地址可以唯一標(biāo)志主機(jī),TCP層協(xié)議和端口可以唯一標(biāo)志主機(jī)的一個(gè)進(jìn)程,就可以利用IP地址加協(xié)議加端口號唯一標(biāo)志網(wǎng)絡(luò)中的進(jìn)程[3]。所以本軟件通過基于5588端口加IP地址和使用Socket通信協(xié)議來設(shè)計(jì)實(shí)現(xiàn)。
3具體設(shè)計(jì)實(shí)現(xiàn)
3.1服務(wù)器端設(shè)計(jì)
服務(wù)器端的接收數(shù)據(jù)模式如下[4]:(1)服務(wù)器監(jiān)聽并讀取來自客戶端的Xml數(shù)據(jù)包;(2)接收數(shù)據(jù)(如接受不成功則斷開socket連接,繼續(xù)監(jiān)聽);(3)分析提取數(shù)據(jù),數(shù)據(jù)異常推送報(bào)警;(4)數(shù)據(jù)分別存入主機(jī)信息Xml數(shù)據(jù)庫和打印機(jī)信息Xml數(shù)據(jù)庫中。
3.2服務(wù)器端實(shí)現(xiàn)
第一步:創(chuàng)建一個(gè)用于監(jiān)聽連接的Socket對象;
private Socket serverSocket;
第二步:用指定的5588端口號和服務(wù)器的ip建立一個(gè)對象;
private static String IP = “192.0.0.202”;
private static int Port = 5588;
第三步:用socket對象的Bind()方法綁定對象;
serverSocket.Bind(new serverSocket(IPAddress.Parse(IP), Port));
第四步:用Socket對象的Listen()方法開始監(jiān)聽;
serverSocket.Listen(0);
第五步:接收到客戶端的連接,用Socket對象的Accept()方法創(chuàng)建一個(gè)新的用于和客戶端進(jìn)行通信的Socket對象;
Socket NewClientSocket = serverSocket.Accept();
第六步:接受來自客戶端的Xml數(shù)據(jù),存入并提取服務(wù)器端的ClientXml和PrintXml數(shù)據(jù)庫。提取數(shù)據(jù),以ClientXml數(shù)據(jù)庫為例代碼如下:
FileStream fs = new FileStream("C:/ClientXml.xml", FileMode.Create, FileAccess.Write);
fs.Write(msgByte, 0, msgByte.Length);
fs.Close();
ClientData data;
XmlSerializer serializer = new XmlSerializer(typeof(ClientData));
using (StreamReaderstreamReader = File.OpenText("C:/ClientXml.xml"))
{
data = serializer.Deserialize(streamReader) as ClientData;
}
ClientDate.ClientIP= data.ClientIP;
ClientDate.ClientName= data.ClientName;
ClientDate.CPUTempState = data.CPUTempState;
第七步:通信結(jié)束關(guān)閉socket。
3.3服務(wù)器端界面設(shè)計(jì)
設(shè)計(jì)界面分為歷史數(shù)據(jù)圖、主機(jī)列表圖和報(bào)警界面三部分。
3.3.1展示數(shù)據(jù)
圖表分為歷史曲線圖表和主機(jī)列表圖兩大塊,對比之前的歷史數(shù)據(jù)實(shí)時(shí)刷新,動態(tài)展示數(shù)據(jù)信息。
3.3.2報(bào)警機(jī)制
提取異常數(shù)據(jù),推送至報(bào)警界面,當(dāng)數(shù)據(jù)正常后取消報(bào)警。
3.4客戶端設(shè)計(jì)
客戶端數(shù)據(jù)模塊分為主機(jī)信息模塊和打印機(jī)信息模塊兩部分,利用多線程傳輸數(shù)據(jù)。
具體設(shè)計(jì)流程:(1)監(jiān)測獲取主機(jī)和設(shè)備數(shù)據(jù);(2)封裝數(shù)據(jù)存入Xml數(shù)據(jù)庫;(3)實(shí)時(shí)發(fā)送Xml數(shù)據(jù)包給服務(wù)器。
3.4.1主機(jī)信息模塊
主機(jī)信息模塊數(shù)據(jù)包格式主要分為Time、客戶機(jī)標(biāo)識、CPU狀態(tài)和內(nèi)存狀態(tài)四部分。Time表示時(shí)間,客戶機(jī)標(biāo)識表示包括IP地址和主機(jī)名兩部分,CPU狀態(tài)包括CPU溫度和CPU使用率兩部分,內(nèi)存狀態(tài)包括內(nèi)存使用率和內(nèi)存進(jìn)程數(shù)兩部分,具體數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)采用封裝類的方式,定義ClientDate類,設(shè)置Client對象,包含Time、ClientIP、ClientName、CPUState和MemoryState等字段,具體代碼如下:
public class ClientDate
{
public string Time{ get; set; }
public string ClientIP{ get; set; }
public string ClientName{ get; set; }
public string CPUTempState{ get; set; }
public string MemoryState{ get; set; }
public string CPUUsage{ get; set; }
public string MemoryUsage{ get; set; }
}
CPU運(yùn)行狀態(tài)標(biāo)識:1表示溫度正常,0表示溫度異常;內(nèi)存運(yùn)行狀態(tài)標(biāo)識:1表示正常,0表示異常。
3.4.2打印機(jī)信息模塊
打印機(jī)信息模塊數(shù)據(jù)包格式主要分為Time、客戶機(jī)標(biāo)識、打印機(jī)狀態(tài)三部分。Time表示時(shí)間,客戶機(jī)標(biāo)識包括IP地址和主機(jī)名兩部分,打印機(jī)狀態(tài)包括卡紙、缺紙、正常和脫機(jī)四部分,具體數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)也是采用封裝類的方式,定義PrintDate類,設(shè)置Print對象,包括Time,ClientIP、ClientName和PrintState等字段,具體代碼如下:
public class PrintDate
{
public string Time{ get; set; }
public string ClientIP{ get; set; }
public string ClientName{ get; set; }
public string PrintState{ get; set; }
}
打印機(jī)狀態(tài)標(biāo)識:0表示正常,1表示脫機(jī),2表示卡紙,3表示缺紙[5]。
3.5客戶端實(shí)現(xiàn)
在發(fā)送數(shù)據(jù)給服務(wù)器之前,客戶端每10秒鐘更新獲取一次連接主機(jī)信息和打印機(jī)信息,分別更新存入ClientXml和PrintXml數(shù)據(jù)庫中并且發(fā)送數(shù)據(jù)至服務(wù)器。發(fā)送數(shù)據(jù)流程如下所示[6]:
第一步:建立一個(gè)Socket對象;
public Socket clientSocket;
第二步:用指定的5588端口號和服務(wù)器的ip建立一個(gè)clientSocke對象;
private static String IP = "192.0.0.202";private static int Port = 5588;
第三步:用Socket對象的Connect()方法以上面建立的clientSocke對象作為參數(shù),向服務(wù)器發(fā)出連接請求;
clientSocket.Connect(ip,port);
第四步:如果連接成功,就用Socket對象的Send()方法向服務(wù)器發(fā)送Xml信息。以發(fā)送主機(jī)信息數(shù)據(jù)ClientXml為例,代碼如下:
try
{
clientSocket.Send(FileTOByte(ClientXml));
}
catch
{
MessageBox.Show("發(fā)送數(shù)據(jù)失敗");
}
第六步:通信結(jié)束關(guān)閉Socket。
4 結(jié)束語
本文設(shè)計(jì)并且實(shí)現(xiàn)了臨床護(hù)理設(shè)備監(jiān)控系統(tǒng)。該軟件使用效果俱佳,受到了臨床工作人員的一致好評。由于該軟件是基于Sockets通信技術(shù)下實(shí)現(xiàn),所以無法監(jiān)控單機(jī)設(shè)備,就需要定期查看和維護(hù)單機(jī)設(shè)備。在今后的設(shè)計(jì)研究中,將重點(diǎn)解決一下問題:實(shí)現(xiàn)消息機(jī)制和廣播機(jī)制,滿足更多設(shè)備監(jiān)控需求。
參考文獻(xiàn):
[1] 王廣偉,李維釗,曲銘海.Windows Sockets網(wǎng)絡(luò)編程[J].計(jì)算機(jī)應(yīng)用研究,2000,17(8):51-54.
[2] 周廣全,楊學(xué)良,張姝,等.基于SOCKETS的EDI通信平臺的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)研究與發(fā)展,1998,35(10):3-5.
[3] 何進(jìn),謝松巍.基于Socket的TCP/IP網(wǎng)絡(luò)通訊模式研究[J].計(jì)算機(jī)應(yīng)用研究,2001,18(8):134-135.
[4] 黃顯信.利用SOCKET通信進(jìn)程實(shí)現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)的同步[J].計(jì)算機(jī)與數(shù)字工程,2003,31(5):28-30,57.
[5] 原小艷,朱強(qiáng).基于Sockets通信的實(shí)時(shí)設(shè)備監(jiān)控系統(tǒng)[J].電腦知識與技術(shù),2005,1(30):58-59.
[6] 羅亞非.基于TCP的Socket多線程通信[J].電腦知識與技術(shù),2009,5(3):563-565,598.
【通聯(lián)編輯:代影】