?

基于VPN的遠程糧情檢測系統通訊軟件研究

2014-10-14 09:28陳中孝孫世明劉盼盼
計算機與現代化 2014年9期
關鍵詞:糧情客戶端遠程

陳中孝,孫世明,劉盼盼

(西安工業大學電子信息工程學院,陜西 西安 710021)

0 引言

糧食是國民經濟發展的基礎,也是戰略儲備物資的重要組成部分,糧食的數量與安全直接關系到我國國民經濟的發展和社會的穩定。我國目前大部分糧庫依然采用原始的方式進行儲存,造成大量的糧食損耗[2]。針對這種情況我國投資建設了一批現代化糧庫,新型糧庫規模大、容量大,但不易實時監測與集中管理。這種形勢下,各類糧情遠程檢測系統就應運而生。

本文介紹的基于VPN遠程糧情檢測系統通過VPN服務器建立虛擬專用網絡,系統中數據在VPN這種安全可靠的虛擬隧道中實現遠程傳輸,同時由于VPN利用公用網絡建設專用網絡,可以在保證數據安全傳輸的情況下避免高昂的網絡通訊和維護的費用[3]。本系統的通訊軟件通過使用Winsock技術訪問TCP/IP網絡,使得開發人員不必深入了解路由選擇、流量控制、擁塞控制、分段組裝、檢錯糾錯和QoS協商等底層協議細節[1],只需要調用 Winsock,由Winsock尋找并利用已經安裝好的底層協議自動進行復雜的數據傳輸工作,進而大幅降低了網絡通信軟件開發的時間和經費投入。

1 系統總體設計

本系統主要由5個部分組成:遠程客戶端、VPN服務器、糧庫現場工作站、通訊主機與糧倉下位機及傳感器,系統結構設計如圖1所示。遠程客戶端與現場工作站通過VPN服務器構建的VPN網絡連接在一起,遠程客戶端發送測控指令與數據獲取指令到糧庫現場工作站,糧庫現場工作站根據具體的測控指令通過串行總線將命令傳送至糧庫下位機,通過傳感器獲取采集值,現場工作站通過VPN將采集數據或歷史數據傳輸回遠程客戶端。

圖1 系統結構設計圖

2 系統VPN服務器搭建

2.1 VPN 技術

虛擬專用網絡(Virtual Private Network,VPN)是Internet技術迅速發展的產物,它可以實現不同網絡的組件和資源之間的相互連接[8]。VPN是通過公用網絡建立一個臨時、安全的連接,也就是說VPN利用公共互聯網的設備搭建虛擬專用的隧道。VPN技術主要采用隧道技術、加解密技術、密鑰管理技術和使用身份認證技術[6],通過使用這些技術保證信息傳輸過程中不被竊取、篡改和刪除。

VPN技術的發展是建立在“隧道”技術基礎上的,隧道技術是一種通過使用互聯網絡的基礎設施在網絡之間傳遞數據的方式[14]。常見的隧道技術有點對點隧道協議PPTP、第二層隧道協議L2TP和安全套接字隧道協議SSTP等,它們都是通過將PPP幀封裝在IP數據包中,在IP數據包前面加入指定協議然后進行傳輸。本系統采用PPTP隧道協議,PPTP相較于SSTP支持Windows Vista以下的低版本Windows操作系統[10],同時PPTP允許多協議通信進行加密,然后封裝在IP標頭,在身份驗證的過程中PPTP可使用MS-CHAP v2和EAP-TLS進程中生成的加密秘鑰,使用Microsoft點對點加密對PPP幀進行加密[11]。而相較于其他協議,基于PPTP的VPN連接可以保證數據在傳輸的過程中未更改,并且可以保證數據是由經過授權的用戶發送的。

2.2 VPN服務器搭建

在本系統中使用Windows Server 2008 R2 64bit操作系統進行VPN網絡的組建,組建設備為1臺CPU為Core i5-4430的計算機,同時該計算機攜帶2塊網卡,保證服務器的工作性能。搭建VPN服務器分為2部分:

1)VPN服務器的創建部分。首先進入系統后,進入“服務器管理器”窗口,在“角色”中添加服務器角色“網絡策略和訪問服務”,在其中勾選“遠程訪問服務”進行安裝。安裝成功后,在“服務器管理器”窗口中右鍵“路由和遠程訪問”,配置并啟用路由和遠程訪問,在其中依次勾選“遠程訪問”與“VPN”,在“VPN連接”對話框中選中連接Internet的網卡,指定VPN向客戶端成員分配的IP地址的范圍,根據糧情檢測系統的客戶人群數量,本系統將地址定為192.168.0.1 到 192.168.0.255。由于 PPTP 身份驗證是由操作系統中的進程實現的,在本系統中不使用路由和遠程訪問來實現身份驗證,點擊完成實現創建基于PPTP的VPN服務器。

2)創建新用戶,并賦予用戶遠程撥入的權限[4]。進入“服務器管理器”窗口,在“本地用戶和組”中選擇用戶,進入后輸入用戶名創建用戶,創建成功后右鍵新用戶名,在屬性對戶框中選擇“撥入”,網絡訪問權限中選擇“允許訪問”,回撥選項中選擇“不回撥”,在分配靜態IP 中輸入固定 IP 地址,如192.168.0.10,最終點擊確定完成創建用戶,這樣就實現了系統中的用戶均能獲取一個虛擬的固定IP。

2.3 VPN客戶端常見問題解決方案

初次設置完VPN客戶端后,遠程客戶端登錄VPN服務器成功,客戶端可能會網速變慢甚至無法訪問Internet,若客戶端使用無線網卡則直接掉線。這是由VPN默認路由設置不當帶來的問題,在正常過程中當VPN客戶端與服務器建立連接后,VPN客戶端路由表中產生2條默認路由,其中一條默認路由記錄對應的客戶端系統原先的默認網關地址[7],本系統中是127.0.0.1;另一條則指向客戶端與VPN服務器自動生成的網關地址,本系統中是 192.168.0.20。在默認狀態下,VPN服務器自動生成的默認網關地址優先級,要比客戶端系統原先使用的默認網關地址優先級要高[13]。當客戶端訪問Internet時需要先通過VPN服務器,客戶端上網的情況就會受到VPN服務器的帶寬和穩定性的影響。在本系統中解決此問題通過取消使用默認網關,客戶端設置的VPN屬性中“網絡”項中的“Internet協議版本”,雙擊進入后進入“高級”,將“在遠程網絡上使用默認網關”取消。VPN網絡連接后,仍然通過本地路由訪問Internet網絡,那么網絡訪問速度也就恢復正常了。

3 系統通訊軟件設計

本系統遠程通訊軟件的主要功能由以下2個部分實現:現場工作站和遠程客戶端?,F場工作站執行遠程客戶端的檢測命令,并將數據發送至遠程客戶端。在進入現場工作站遠程被控界面后,系統進入等待連接狀態。因為現場工作站要盡量實現無人化操作,則要求通訊軟件能夠實現對當前網絡狀態的檢測,并能夠實現自動斷網重連等網絡恢復功能。

3.1 套接字及客戶端/服務器模型

3.1.1 Winsock 技術

本系統通訊軟件使用MFC中Winsock程序開發工具。Winsock建立在TCP/IP協議棧之上,提供面向連接的網絡服務,可以大大降低程序開發工作量,它包含了一組針對Windows的擴展庫函數,便于程序員利用Windows消息驅動機制進行編程。Windows Sockets規范定義并記錄了如何使用API與Internet協議族連接,所有的Windows Sockets實現都支持流套接口和數據報套接口[1]。

3.1.2 套接字

套接字(Socket)是支持TCP/IP協議網絡通信的基本操作單元,它是不同主機之間的進程進行雙向通信的端點,套接口存在于通信域中[4],通常和同一域中的套接口交換數據。根據網絡通信的特性,套接字可分為3類:流套接字(SOCK_STREAM)、數據報套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW)[5]。因為本系統對采集數據的遠程傳輸的穩定性和完整性有較高的要求,而流套接字可以提供雙向的、有序的、無重復并無記錄編輯的數據流服務,故在本系統中使用流套接字。

3.1.3 客戶端/服務器模型

客戶端/服務器模型(C/S模型)是網絡程序設計的基本模型,也是建立分布式應用時的典型結構之一[17]。在C/S模型中,服務器適中處于監聽狀態,當被監聽的服務端口有服務請求時,立即響應客戶的服務請求??蛻舳嗽诎l出服務請求信號前,必須指定服務器地址和端口號才能獲得相應的服務。具體模型如圖2所示。

圖2 客戶端/服務器模型

3.2 系統通訊程序的實現

本系統中現場工作站和遠程客戶端通訊軟件程序均是基于Winsock的C/S結構的程序,程序中既要作為服務器端回應來自遠程客戶端的糧情測控請求和采集數據發送請求,同時還需要作為客戶端發送請求獲取遠程客戶端對現場糧情測控的配置,如定時檢測的檢測間隔時間等[9]。本系統中使用的套接字為阻塞模式,然而阻塞模式下Winsock程序未執行完時不交出主線程的控制權,系統在傳輸過程中執行其他動作[16],為了解決這個問題,本系統中創建了接收線程,專門用來處理Winsock接收數據過程中的線程占用問題。系統Winsock程序運行時序圖如圖3所示。

圖3 系統Winsock程序運行時序圖

3.2.1 啟動 Winsock

由于Winsock的服務是以動態鏈接庫Winsock DLL形式實現的,因此必須先調用WSAStartup函數對Winsock DLL進行初始化[12],獲取Winsock的版本支持,并分配必要的資源。程序編寫需要包含頭文件:Winsock2.h;需要包含庫文件:ws2_32.lib。具體實現代碼如下所示:

本程序關閉前,調用WSACleanup函數中止對Winsock DLL的使用,釋放資源以備下次使用。

3.2.2 套接字程序設計

1)創建套接字。本系統初始化Winsock的動態鏈接庫后,需要在服務器端建立一個監聽的套接字,服務進程調用socket()函數建立監聽的套接字listen-Socket,并定義此套接字所使用的通信協議。socket()函數原型如下:

SOCKET socket(int af,int type,int protocol)

其中type為表示套接字的類型,af設定為AF_INET代表套接字在Internet域中進行通訊,本系統中的代碼如下:

SOCKETlistenSocket;

//聲明套接字

listenSocket=socket(AF_INET,SOCK_STREAM,0);

//建立面向連接的套接字

2)給listenSocket綁定一個地址及監聽使用的端口,可以確定客戶端在連接服務器時使用的端口號。為此要使用bind()函數,bind()函數原型如下:

int bind(SOCKET s,const Struct sockaddr FAR*name,int namelen)

其中s代表未綁定套接字的對象名,name代表套接字的地址值,它是由struct sockaddr結構表示,TCP/IP環境下可以將sockaddr_in結構強制轉化為sockaddr機構,sockaddr_in原模型如下:

Struct socketaddr_in

{

Short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero(8);

}

本系統中的代碼如下:

本系統中客戶端和服務器端在進行交互的過程中,都是先訪問VPN服務器再將數據傳送給對方,故端口確定為VPN服務器對外開放端口之一的8888。

3)使用listen()函數將listenSocket置入監聽模式并準備連接請求,通知協議內核用戶進程準備接受連接請求,同時指定了listenSocket等待的連接數限制值。Listen()函數原型如下:

int listen(SOCKET s,int backlog)

其中backlog是待處理的連接隊列的最大長度,最大不可以超過5。本系統中代碼如下:

4)由于listenSocket為阻塞模式,創建接收線程,完成服務器編程中最重要的一步等待并接受用戶的連接,accept()函數完成了這個功能,它從內核中取出已經建立的客戶端連接,然后把這個已經建立的連接返回給服務器程序,就可以利用這個連接進行數據傳輸了。其函數原型如下:

int accept(SOCKET s,struct sockaddr FAR*addr,int FAR*addrlen)

該函數返回一個新的套接字acceptSocket,該套接字可以用來與對方進行通信,而原先listenSocket還是處于監聽狀態。本系統中部分代碼如下:

在實際系統中程序使用的接收線程中的變量及聲明的套接字都是使用指針后實現的。

5)建立客戶端套接字clientSocket。

6)客戶進程調用socket創建客戶端套接字clientSocket,隨后其向服務器發送連接請求,軟件通過connect()函數完成面向連接協議的連接過程,connect()函數原型如下:

int connect(SOCKET s,const struct sockaddr FAR*name,int namelen)

本系統中代碼如下:

SOCKETclientSocket;

struct sockaddr_inout_serv;

out_serv.sin_family=AF_INET;

out_serv.sin_port=htons(8888);

out_serv.sin_addr.s_addr=inet_addr(ip_x);

clientSocket=socket(AF_INET,SOCK_STREAM,0);

7)當連接請求到達服務器端時,被阻塞的接收進程中的accept()函數產生一個新的連接套接字acceptSocket與clientSocket建立連接,并向客戶端返回接收信號。

8)數據發送。在面向連接的套接字中,不論是客戶端還是服務器端應用都使用send()函數發送數據,其函數原型如下:

int send(SOCKET s,const char sockaddr FAR*buf,int len,int flags)

其中buf表示要發送的緩沖數據,len表示緩沖區的長度,flag賦值0代表無特殊行為。本系統中代碼如下:

char send_buf[1600];

send_count=1350;

send(clientSocket,send_buf,send_count,0);

9)數據接收??蛻舳撕头掌鲬贸绦蚓峭ㄟ^recv()函數接收數據,本系統中的接收部分在接收線程中實現,其函數原型如下:

int recv(SOCKET s,char sockaddr FAR*buf,int len,int flags)

當協議數據接收完畢,recv()把acceptSocket接收緩沖區中的數據拷貝到buf中,其返回值是拷貝數據的字節數,本系統中代碼如下:

int ret=recv(acceptSocket,receive_buf,1350,0);

10)關閉套接字,使用closesocket()關閉連接,釋放套接字所占的資源。

3.3 系統通訊軟件可靠性設計

3.3.1 系統關鍵數據發送

隨著以IM與P2P類軟件為代表的高帶寬占用率類軟件的大量出現與普及,但此類軟件的濫用占用了大量的網絡帶寬,形成了持續的高突發流量,嚴重影響了網絡的整體性能與QoS[15]。系統通訊軟件需要設計針對不同的帶寬和網絡傳輸速度情況下的關鍵數據傳輸策略,在窄帶寬和傳輸速率較慢的情況下,通訊軟件將中止大量數據發送業務,如:檢測界面和糧情歷史數據庫數據,系統優先保證遠程測控的功能。在本系統中通過設置定時器線程OnTimer(UINT nIDEvent),在進行大數據發送的過程中,接收線程中的recv()函數的返回值為接收的數據量,累加1分鐘后計算當前網速,若低于30kb/s,中止當前發送任務,進入等待檢測狀態。系統使用網絡速度監測分析與保證機制,可以提升網絡傳輸中關鍵業務數據的效率,有效改善了糧情遠程網絡的粗放式管理模式。

3.3.2 本地斷網重連

網絡狀態異常對于無人監控狀態下的糧情檢測系統的穩定性影響很大,就需要在網絡中斷的情況下,要有重連機制來保證能續發未傳輸的數據。本系統將斷網狀況分為2種:一種是物理斷網,如網線脫落或網線斷裂等;另一種是非物理斷網,如局域網內管理員未授予上網權限,網絡運營商提供網絡出現故障等。在本軟件中判斷物理斷網使用函數InternetGetConnectedState()進行檢測,需要包含頭文件:Wininet.h,需要包含庫文件:Wininet.dll其函數原型為:

BOOL InternetGetConnectedState(LPDWORD lpdwFlags,DWORD dwReserved)

當函數返回值為TURE時本地網絡連接正常,反之不正常。其中lpdwFlags返回值的不同代表了不同的網絡連接狀態,其中0x01代表通過調制調解器連接Internet,0x02表示通過局域網連接 Internet,0x04使用代理服務器登錄Internet,0x08使用無線網卡連接Internet。不同的網絡連接方式代表不同的網絡重連的策略,是建立多網重連機制的重要參考。

本系統對于檢測物理性斷網使用IsNetworkAlive()函數,需要包含頭文件:Sensapi.h,需要包含庫文件:Sensapi.dll。其函數原型為:

BOOL IsNetworkAlive(DWORD dw)

當函數返回FALSE時,則代表當前出現物理性斷網。IsNetworkAlive()函數相比于InternetGetConnectedState()函數反應網絡狀況更加及時,但InternetGetConnectedState()函數能夠實現對多種網絡連接狀態檢測,這二者結合使用,同時識別斷線,然后進行網絡連接的初始化,可以提高系統使用的穩定性和可靠性。

4 結束語

基于VPN連接的遠程檢測可以提供更高效、更安全、更便捷的糧情檢測系統,同時使用網絡狀態自檢與流量控制等技術提高了系統在自動檢測狀態下的適應能力。隨著越來越多的網絡技術融入工業檢測系統,以及政府對企業網絡信息化的大力推進,安全穩定的VPN遠程連接和可靠糧情檢測的融合,也將成為糧情檢測系統的重要發展方向之一。

[1]劉赟.Winsock技術在網絡通信系統中的應用[J].西南科技大學學報,2013,28(2):88-91.

[2]梁居寶,杜克明,孫忠富.基于3G與VPN的溫室遠程監控系統的設計與實現[J].中國農學通報,2011,27(29):139-144.

[3]孟博,王丹華,王雪,等.基于 PPTP-SSH隧道網關的VPN系統研究與實現[J].廣西大學學報(自然科學版),2011,36(1):127-130.

[4]徐春華,王曉寧.智能化糧情監控系統的設計與研究[J].安徽農業科學,2012,40(23):11913-11916.

[5]肖美華,余立全,肖攀.Socket通信程序模型抽取及可靠性驗證[J].計算機科學,2012,39(11):102-107.

[6]過林吉,沈淺.VPN隧道協議的研究與探討[J].電腦知識與技術,2010(3):609-611.

[7]李戍,馮振聲,陳建輝.基于VPN的遠程故障診斷系統[J].火力與指揮控制,2005,30(1):185-186.

[8]閻琦,陳建.關于VPN技術的探討[J].渤海大學學報(自然科學版),2011,32(2):172-175.

[9]王朋濤,張元.基于ARM9的糧情監測子系統設計[J].計算機與數字工程,2010,38(2):39-41.

[10]梅松,李之棠.一種新的高性能VPN系統的模型分析[J].小型微型計算機系統,2006,27(5):793-797.

[11]曲毅民.C/S模式軟件開發與VP N技術應用[J].信息技術,2005(5):70-72.

[12]高應波,蔣朝惠.基于分布式構架的VPN系統的方案設計[J].微計算機信息,2009,25(2):108-110.

[13]王春海,宋濤.VPN網絡組建案例實錄[M].北京:科學出版社,2011.

[14]王占京,張麗諾,雷波.VPN網絡技術與業務應用[M].北京:國防工業出版社,2011.

[15]劉曉輝.網絡服務器待見與管理[M].北京:電子工業出版社,2012.

[16]劉曉陽.嵌入式糧情檢測系統的研究與應用[D].長沙:湖南大學,2010.

[17]東莉莉.糧情遠程監控系統的設計與實現[D].西安:西安工業大學,2010.

猜你喜歡
糧情客戶端遠程
讓人膽寒的“遠程殺手”:彈道導彈
遠程工作狂綜合征
糧庫糧情智能監測系統的設計與實現
立足贛州糧情實際 確保區域糧食安全
遠程詐騙
縣級臺在突發事件報道中如何應用手機客戶端
孵化垂直頻道:新聞客戶端新策略
基于Vanconnect的智能家居瘦客戶端的設計與實現
CGSR-GDCSIV型糧情測控系統通過中國糧油學會組織的科技成果評價
糧情監測技術的現狀與展望
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合