引言 隨著(zhù)3G網(wǎng)絡(luò )技術(shù)、市場(chǎng)和政策的不斷成熟,移動(dòng)終端設備的使用量在急速增加,廣泛應用各個(gè)領(lǐng)域。Windows Mobile是微軟為智能移動(dòng)終端設備開(kāi)發(fā)的操作系統,Windows Mobile將用戶(hù)熟悉的桌面Windows體驗擴展到了移動(dòng)設備上。Windows Mobile為移動(dòng)終端設備之間的數據交換和信息共享提供了簡(jiǎn)單、安全的解決方案。在Windows Mobile平臺上的數據通信技術(shù)有Socket、Web Service、MSMQ(微軟消息隊列技術(shù))。Socket傳送數據會(huì )自定義傳送數據格式并且服務(wù)端要使用到多線(xiàn)程接收客戶(hù)端信息,編程復雜且不好控制;Web Service編程簡(jiǎn)單易控制,但是只可能調用服務(wù)端的函數不能實(shí)現服務(wù)端和客戶(hù)端相互通信;MSMQ是微軟提供的一種可以遠程訪(fǎng)問(wèn)的異步通訊方式,支持轉發(fā),支持延時(shí)發(fā)送,并且具有較高安全性,是當前Windows Mobile平臺上最可靠的數據通信方法。 MSMQ技術(shù) Message Queue(微軟消息隊列)是在多個(gè)不同應用程序(終端或服務(wù))之間實(shí)現相互通信的一種異步傳輸模式,相互通信的應用程序可以分布于同一臺機器上,也可以分布于相連的網(wǎng)絡(luò )空間中的任一終端。消息是通信的雙方所需要傳遞的信息,它可以是各種對象,如文本、聲音和圖像等。消息最終的實(shí)現方式是由消息傳遞的雙方共同制定的協(xié)議來(lái)規定,這樣做的好處,既對數據進(jìn)行了簡(jiǎn)單的加密,也可以減輕系統通信的負擔。其實(shí)現原理是消息的發(fā)送者把自己想要發(fā)送的信息放入一個(gè)容器中(Message),然后將其保存到一個(gè)系統公用空間的消息隊列中;本地或者是異地的消息接收程序再從該隊列中取出發(fā)給它的消息進(jìn)行處理。 由于采用的是異步通信方式,無(wú)論是發(fā)送程序還是接收程序都不用等待對方返回成功發(fā)送消息的標志,就可以執行余下的代碼,因而提高了系統的處理能力。當信息傳送過(guò)程中,信息發(fā)送機制具有故障恢復能力;MSMQ的消息傳遞機制使得消息通信的雙方具有通過(guò)不同的物理平臺進(jìn)行通信的能力。在支持.net技術(shù)的操作系統上利用其提供的MSMQ功能,可以輕松創(chuàng )建或者刪除消息隊列,發(fā)送或者接收消息,并具有對消息隊列進(jìn)行管理。消息隊列是發(fā)送和接收消息的公用存儲空間,它可以存在于內存中或者是物理文件中。 系統結構與軟件配置 系統結構 針對客車(chē)業(yè)生產(chǎn)現場(chǎng)數據采集系統實(shí)例,由于客車(chē)生產(chǎn)屬于混合流水生產(chǎn)行業(yè),工序和工藝路線(xiàn)復雜、人工參與生產(chǎn)多、客車(chē)比其他產(chǎn)品體積龐大,所以需要現場(chǎng)人員使用PDA掃描生產(chǎn)現場(chǎng)數據和上報生產(chǎn)進(jìn)度狀況。車(chē)間和廠(chǎng)區范圍大,車(chē)間環(huán)境復雜,整個(gè)網(wǎng)絡(luò )采用無(wú)線(xiàn)通信的方式。PDA中裝有Windows Mobile系統,在PDA中可以安裝各種應用程序,例如條碼掃描、車(chē)間物料供需程序和生產(chǎn)現場(chǎng)調度程序。在PDA上也可以擴展外部設備,例如條碼掃描槍和微型打印機等。利用PDA的移動(dòng)性和比較強的數據處理能力可對現場(chǎng)數據進(jìn)行實(shí)時(shí)的采集和整理。將采集的現場(chǎng)數據上傳到數據采集服務(wù)器、生產(chǎn)追蹤服務(wù)器和生產(chǎn)調度服務(wù)器。 如圖1所示的系統硬件平臺主要由廠(chǎng)級數據中心的服務(wù)器、無(wú)線(xiàn)路由器和PDA數據采集器構成,車(chē)間中根據生產(chǎn)工藝工序配置的多個(gè)PDA數據采集器,PDA上的掃描槍可以實(shí)時(shí)的采集現場(chǎng)數據,PDA的上的處理程序將采集的數據進(jìn)行處理,然后通過(guò)多層無(wú)線(xiàn)路由器AP上傳到廠(chǎng)級數據中心服務(wù)器,每個(gè)PDA都有自己獨立的IP地址,服務(wù)器通過(guò)收發(fā)消息對上傳的數據進(jìn)行管理和向PDA發(fā)出指令。整個(gè)系統包括服務(wù)器程序和客戶(hù)端程序,通過(guò)MSMQ技術(shù)實(shí)現PDA與數據服務(wù)器的數據通信。 ![]() 系統軟件配置 服務(wù)端配置:服務(wù)端是Windows Server2003操作系統,服務(wù)器程序檢查客戶(hù)端在線(xiàn)狀態(tài),將在線(xiàn)客戶(hù)端信息(包括:客戶(hù)端名稱(chēng)、客戶(hù)段IP地址)共享給每個(gè)客戶(hù)端。 客戶(hù)端:需要設置服務(wù)器端IP地址,本地客戶(hù)端名稱(chēng)。設置正確服務(wù)端IP地址、本地客戶(hù)端名稱(chēng)后。通過(guò)服務(wù)端獲取在線(xiàn)客戶(hù)端信息,指定客戶(hù)端后可以接收新消息和發(fā)送消息。 MSMQ技術(shù)在Windows Mobile中的應用 在PDA上Windows Mobile操作系統中通過(guò)MSMQ技術(shù)實(shí)現數據通信,要使用MSMQ開(kāi)發(fā)消息處理程序,必須在服務(wù)器主機和客戶(hù)端上安裝消息隊列。消息處理程序主要是消息的發(fā)送和接收,如果要實(shí)現收發(fā)消息,必須引用一個(gè)隊列,引用的消息隊列分為公用隊列和專(zhuān)用隊列,這兩個(gè)隊列都存放用戶(hù)設計的消息。引用消息隊列后,就可以發(fā)送、接收和閱讀消息了。消息接收服務(wù)位于System.Messaging中,需要在工程中引用System.Messaging.dll文件。具體實(shí)現過(guò)程和代碼如下: 引用隊列 通過(guò)路徑、格式名和標簽三種方法引用隊列。例如:通過(guò)路徑引用消息隊列,路徑的形式為 machinenamequeuename。在實(shí)際應用中,指向隊列的路徑必須是唯一的。表1列出用于每種類(lèi)型的隊列的路徑信息。 ![]() 如果是發(fā)送到本機上,還可以使用“.”代表本機名稱(chēng)。具體的引用方法可以在初始化消息隊列時(shí)設置,也可以通過(guò)設置消息隊列的Path屬性來(lái)實(shí)現。如果在初始化時(shí)引用消息隊列,那么消息隊列必須存在于系統中,否則會(huì )產(chǎn)生錯誤。在程序中可以實(shí)現消息隊列的創(chuàng )建。 在初始化時(shí)引用消息隊列的代碼如下: MessageQueue Mq=new MessageQueue(“.\private$\mq”); 通過(guò)Path屬性引用消息隊列的代碼: MessageQueue Mq=new MessageQueue(); Mq.Path=”.\private$\mq”; 如果消息隊列不存在,可以使用 Create方法可在計算機上創(chuàng )建隊列,實(shí)現代碼如下: System.Messaging.MessageQueue. Create(@".private$mq"); 發(fā)送消息 應用程序引用消息隊列后,就可以進(jìn)行發(fā)送和接收消息操作。發(fā)送的消息可以分為簡(jiǎn)單消息和復雜消息,簡(jiǎn)單消息類(lèi)型就是常用的數據類(lèi)型,例如整型、字符串等數據;復雜消息的數據類(lèi)型通常對應于系統中的復雜數據類(lèi)型,例如結構體和類(lèi)對象等。 簡(jiǎn)單消息的發(fā)送示例如下: Mq.Send(1000); //發(fā)送整型數據 1000 Mq.Send(“This is a test message!”); //發(fā)送字符串 復雜消息的發(fā)送和簡(jiǎn)單消息的發(fā)送大同小異,只是發(fā)送時(shí),通常不是直接給出發(fā)送的消息內容,而是代表發(fā)送消息內容的變量。下面的代碼分別通過(guò)消息變量和復雜數據類(lèi)型變量發(fā)送一條復雜消息。 下面的代碼中發(fā)送的消息由消息變量表示: Message Msg; Msg=new Message(“A Complex Message!”); Msg.Label=”This is the label”; Msg.Priority=MessagePriority.High; Mq.Send(Msg); 下面的代碼中發(fā)送的消息由復雜數據類(lèi)型變量表示,Customer為自定義的一個(gè)類(lèi): Customer customer = new Customer(); customer.LastName = "Copernicus"; customer.FirstName = "Nicolaus"; Mq.Send(customer); 接收消息 接收消息相比發(fā)送消息要復雜一些。接收消息有兩種方式:通過(guò)Receive方法接收消息同時(shí)永久性地從隊列中刪除消息;通過(guò)Peek 方法從隊列中取出消息而不從隊列中移除該消息。如果知道消息的標識符(ID),還可以通過(guò)ReceiveById方法和PeekById方法完成相應的接收消息操作。 接收消息的代碼如下: Mq.Receive(); //或 Mq.ReceiveById(ID); Mq.Peek(); // 或 Mq.PeekById(ID); 閱讀消息 只有通過(guò)根據通信雙方的約定將接收到的消息中信息提取出來(lái),傳遞的消息才有價(jià)值,因此接收到消息以后還必須能讀出消息中包含的信息。在發(fā)送端的應用程序發(fā)送的消息和消息隊列中的傳輸消息的格式不同,因而發(fā)送端的應用程序發(fā)送出去的消息經(jīng)過(guò)序列化以后才發(fā)送給了消息隊列,這一過(guò)程由系統自動(dòng)完成了,程序開(kāi)發(fā)人員不必為此編寫(xiě)代碼,然而在接收到消息后就需要對接收的消息進(jìn)行反序列化。 消息的反序列化可以通過(guò) Visual Studio和.NET Framework附帶的三個(gè)預定義的格式化程序來(lái)完成:XMLMessageFormatter對象(MessageQueue組件的默認格式化程序設置)、BinaryMessageFormatter對象、ActiveXMessageFormatter對象。由于后兩者格式化后的消息通常不能被用戶(hù)閱讀,所以經(jīng)常采用XMLMessageFormatter對象對接收的消息進(jìn)行反序列化。 使用 XMLMessageFormatter對象反序列化消息的代碼如下: string[] types = { "System.String" }; ((XmlMessageFormatter)mq.Formatter).TargetTypeNames = types; Message m=mq.Receive(new TimeSpan(0,0,3)); 將接收到的消息傳送給消息變量以后,通過(guò)消息變量m的Body屬性就可以讀出消息了: MessageBox.Show((string)m.Body); 關(guān)閉消息隊列 關(guān)閉消息隊列可以通過(guò)Close函數來(lái)實(shí)現,代碼如下: Mq.Close(); 結語(yǔ) 基于Windows Mobile平臺的高速無(wú)線(xiàn)網(wǎng)絡(luò )為各行業(yè)客戶(hù)提供更加可靠便捷的移動(dòng)解決方案。消息隊列技術(shù)保證移動(dòng)設備與數據中心之間進(jìn)行良好的通信。通過(guò)對 Windows Mobile平臺上,發(fā)送、接收和閱讀消息工作過(guò)程的講解說(shuō)明消息隊列技術(shù)簡(jiǎn)單實(shí)用;贛SMQ技術(shù)的Windows Mobile平臺通信系統已經(jīng)在國內某大型客車(chē)企業(yè)生產(chǎn)追蹤系統中得到應用。 參考文獻: [1] 徐凱聲. 基于MSMQ的網(wǎng)絡(luò )通信的研究[J]. 武漢交通科技大學(xué)學(xué)報,2000, 24(6) [2] 李曉劍, 劉洪星. 消息隊列中間件技術(shù)MSMQ的應用研究 [J].交通與計算機, 2001, 19(21) [3] 高勇, 吳健. 基于MSMQ的分布式應用架構[J].計算機應用研究, 2004,21(10) [4] 朱曉東, 耿國華. MTS和MSMQ技術(shù)及其應用 [J].西北大學(xué)學(xué)報, 2002,32(10) [5] 湯丹, 胡志剛, 匡曉紅. 基于消息隊列的工作流引擎及其容錯設計[J].計算機工程, 2008,34(19) 作者:尚爾明 沈陽(yáng)市電信規劃設計院 王長(cháng)濤 沈陽(yáng)建筑大學(xué)信息與控制工程學(xué)院 于天明 沈陽(yáng)市華域建筑設計有限公司 來(lái)源:電子產(chǎn)品世界 2010-03-09 |