基于Socket網(wǎng)絡(luò)編程的遠(yuǎn)程物流防偽系統(tǒng)的設(shè)計
隨著電子及自動化的飛速發(fā)展,擁有GPRS無線采集模塊功能的智能采集器已隨處可見,很多用戶已經(jīng)開始陸續(xù)使用智能采集器收集產(chǎn)品條碼信息。雖然智能采集終端本身有自帶的GPRS無線傳輸系統(tǒng),但這些系統(tǒng)只是提供實際用戶一個功能的擴展,其功能不夠完善,并不能滿足所有用戶的實際需要,這使得智能采集終端不能充分發(fā)揮其智能化。因此筆者提出了利用socket網(wǎng)絡(luò)編程來實現(xiàn)遠(yuǎn)程物流真?zhèn)尾樵兿到y(tǒng)。
筆者充分針對用戶需求,利用socket網(wǎng)絡(luò)編程和智能采集終端的GPRS無線傳輸功能,開發(fā)出滿足用戶需要的遠(yuǎn)程物流防偽系統(tǒng)。用戶只需要下載該系統(tǒng),通過簡便、美觀的操作界面,便可實現(xiàn)智能采集終端的即時查詢功能,有效地實現(xiàn)了商品信息的防偽查詢以及即時跟蹤物流信息等功能。
1 總體設(shè)計
該遠(yuǎn)程物流查詢系統(tǒng)流程圖如圖1所示。當(dāng)移動終端采集器掃描完產(chǎn)品上附帶的編碼信息后,通過socket套接字所指定服務(wù)器的IP及端口和GPRS無線網(wǎng)絡(luò)將采集的編碼信息發(fā)送給遠(yuǎn)程的服務(wù)器端。遠(yuǎn)程服務(wù)器端通過檢索其數(shù)據(jù)庫,將該商品相應(yīng)的查詢相關(guān)信息返回給采集終端。最終在采集終端將該商品的相應(yīng)信息顯示出來,這樣便實現(xiàn)了采集終端對商品的即時查詢功能。
2 系統(tǒng)環(huán)境
2.1 軟件開發(fā)環(huán)境
本系統(tǒng)是在Visual Studio 2010結(jié)合SQL Server 2008的環(huán)境下開發(fā)而成,所選用的開發(fā)語言是由微軟公司開發(fā)的visual basic語言以及功能強大的SQL語言。
通過Visual Studio 2010框架,能夠提供對SQL Server2008的高效訪問,從而為數(shù)據(jù)庫應(yīng)用開發(fā)提供支撐。Microsoft Visual Studio 2010通過整合的開發(fā)環(huán)境,讓軟件開發(fā)人員以熟悉技術(shù)及工具一致的開發(fā)方式,創(chuàng)建各個應(yīng)用平臺。從模型及構(gòu)架設(shè)計、程序的撰寫及管理、查錯、測試到部署,所有的工作一氣呵成,這些工作都在Visual studio 2010中完成。
2.2 智能采集器的GPRS無線采集模塊
目前市場上大多數(shù)采集器都已具備了GPRS無線采集模塊的功能。該系統(tǒng)所采用的采集器為新大陸科技集團生產(chǎn)的PT980系列產(chǎn)品,其GPRS無線采集模塊如圖2所示。該模塊支持TCP/UDP兩種通信協(xié)議;具有RS485和RS232的通信功能,通過485接口或232接口能方便地采集總線上掛接的各種儀器數(shù)據(jù);具有4路開關(guān)量輸入和4路開關(guān)量輸出功能;擁有IM字節(jié)不掉電數(shù)據(jù)保存空間,主要用于存儲采集到的模擬量和開關(guān)量數(shù)據(jù);擁有高精度的模擬量采集;具有通過移動電話(手機)短信下載通信參數(shù)功能,例如通信中用到的IP地址等等;具有透明數(shù)據(jù)傳輸功能;具有支持動態(tài)域名解析功能,節(jié)約了采用固定IP所帶來的昂貴費用;具有商店自動重新連接功能,適合遠(yuǎn)距離無人值守環(huán)境。
2.3 網(wǎng)絡(luò)環(huán)境
本系統(tǒng)所采用的網(wǎng)絡(luò)環(huán)境為GPRS無線網(wǎng)絡(luò)。GPRS是一種采用分組交換模式傳輸數(shù)據(jù)及信令的高效率方式。它克服了電路交換型數(shù)據(jù)傳輸速率低、資源利用率差的缺陷。利用GPRS進行數(shù)據(jù)傳輸具有資源共享、頻率利用率高、數(shù)據(jù)雙向通信傳輸率高、接入時間短、永遠(yuǎn)在線等優(yōu)點。智能采集器可通過GPRS無線網(wǎng)絡(luò)將商品條碼信息發(fā)送給遠(yuǎn)程服務(wù)器。在本系統(tǒng)中,遠(yuǎn)程服務(wù)器可同時監(jiān)聽處理多臺智能采集器終端同時發(fā)送產(chǎn)品編碼信息。
3 Socket網(wǎng)絡(luò)編程
Socket是TCP/IP的編程接口,提供了大量的系統(tǒng)調(diào)用構(gòu)成了網(wǎng)絡(luò)程序的主體,是標(biāo)準(zhǔn)的C/S模式編程。在操作系統(tǒng)中,它屬于文件系統(tǒng)的一部分,網(wǎng)絡(luò)通信可以被看作是對文件的讀取,使得我們對網(wǎng)絡(luò)的控制和對文件的控制一樣方便。ServerSocket用于服務(wù)器端,而Soc ket是建立網(wǎng)絡(luò)連接時使用的。在連接成功時,應(yīng)用程序兩端都會產(chǎn)生一個Socket實例,通過操作這個實例,完成所需的會話。對于一個網(wǎng)絡(luò)連接來說,套接字是平等的,并沒有差別,不因為在服務(wù)器端或在客戶端而產(chǎn)生不同級別。不管是Socket還是Serversecket,它們的工作都是通過SecketImpl類及其子類完成。
Socket提供了兩種數(shù)據(jù)傳輸?shù)膮f(xié)議,分別為TCP和UDP協(xié)議;TCP(傳輸控制協(xié)議)提供的是面向連接、可靠的字節(jié)流服務(wù)。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數(shù)據(jù)。TCP提供超時重發(fā),丟棄重復(fù)數(shù)據(jù),檢驗數(shù)據(jù),流量控制等功
能,保證數(shù)據(jù)能從一端傳到另一端;UDP(用戶數(shù)據(jù)報協(xié)議)是一個簡單的面向數(shù)據(jù)報的運輸層協(xié)議。UDP不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報發(fā)送出去,但是并不能保證它們能到達目的地。由于UDP在傳輸數(shù)據(jù)報前不用在客戶和服務(wù)器之間建立一個連接,且沒有超時重發(fā)等機制,故而傳輸速度很快。因為TCP協(xié)議不但能保證數(shù)據(jù)的正確性而且保證數(shù)據(jù)順序正確,而UDP協(xié)議不能保證,所以TCP協(xié)議更符合本系統(tǒng)中傳輸采集終端所采集的編碼的要求,因此本系統(tǒng)采用TCP協(xié)議。基于TCP協(xié)議的通信流程圖如圖3所示。
在該流程圖中,Socket()用于建立流式套接字;Bind()將套接字與本地地址相連;Listen()通知TCP,使服務(wù)器準(zhǔn)備好接受連接;Accept()用于接收連接;Read()、Write()這兩個函數(shù)分別用于套接字上讀、寫數(shù)據(jù),直到數(shù)據(jù)交換完;Close()用來關(guān)閉套接字;Connect()用于將套接字與遠(yuǎn)地主機連接。其中,Connect()、Accept()、Read()、Write()函數(shù)等都有可能造成阻塞,阻塞模式是Socket的缺省方式。客戶端和服務(wù)器的連接有一個3次握手機制,即服務(wù)器調(diào)用Socket()、Bind()、Listen()完成初始化后,調(diào)用Accept()阻塞等待,處于監(jiān)聽端口的狀態(tài)。而客戶端調(diào)用Socket()初始化后,調(diào)用Connect()發(fā)出SYN段并阻塞等待服務(wù)器的應(yīng)答,服務(wù)器應(yīng)答一個SYN—ACK段,客戶端收到后從Con nect()返回,同時應(yīng)答一個ACK段,服務(wù)器收到后從Accept()返回。
4 代碼的設(shè)計
4.1 服務(wù)端
在本系統(tǒng)中,一個服務(wù)端可能不只為一個智能采集終端提供服務(wù)。當(dāng)N(N為正整數(shù))臺智能采集終端發(fā)送請求時,服務(wù)端必須做出異步響應(yīng),因此,一般在處理服務(wù)端的監(jiān)聽時會使用多線程的方法。正因使用了多線程的方法,控制顯示控件將接受到的字符顯示就必須使用委托的方法;而當(dāng)程序無法得知從另外一個線程來控制其他線程的合法性,會認(rèn)為程序有錯誤,故系統(tǒng)中采用了Delegate類,該類用于派生委托類型,派生前需要明確派生的委托和需要委托的函數(shù)輸入值相匹配。
該系統(tǒng)可監(jiān)聽最多100個同時的客戶端,通過與SQL查詢語句,可查詢出該產(chǎn)品的編碼、倉庫等信息。Socket套接字在筆者自定義的wait data()函數(shù)中實現(xiàn),下面即給出了waitdata()函數(shù)的代碼,來講解整個Socket編程,其中部分代碼后面有詳細(xì)的注釋。查詢信息的代碼在筆者自己命名的Getdata()函數(shù)中實現(xiàn),分別通過對數(shù)據(jù)庫中的防偽編碼表,產(chǎn)品信息表,倉庫信息表,入庫信息表,發(fā)貨信息表,供銷商信息表的綜合查詢,將查詢信息發(fā)送給采集終端,由于字?jǐn)?shù)的限制,文中沒有給出Getdata()函數(shù)的代碼。
評論