GPRS開(kāi)發(fā)系列文章之進(jìn)階篇
一、前言
本文引用地址:http://dyxdggzs.com/article/201610/305853.htm在前篇《GPRS開(kāi)發(fā)系列文章之入門(mén)篇》里,我主要對GPRS開(kāi)發(fā)中遇到的一些常用概念和一些業(yè)務(wù)邏輯做了簡(jiǎn)單的介紹,沒(méi)想到得到了很多網(wǎng)友的支持和關(guān)注,因昨天有事因此延遲到今天才奉上這篇進(jìn)階系列文章,還請各位見(jiàn)諒。希望大家支持同時(shí)歡迎拍磚,共同提高。
在最后一篇《GPRS開(kāi)發(fā)系列文章之實(shí)戰篇》我將詳細敘述如何利用類(lèi)庫開(kāi)發(fā)Client和Server端通信程序,因此本文的多數講解將是為下文服務(wù)的。本文將向您介紹基于PPC2003的Windows mobile 系列的客戶(hù)端和基于.Net 2005的服務(wù)器端進(jìn)行開(kāi)發(fā)所需掌握和了解的開(kāi)發(fā)庫,并著(zhù)重圍繞客戶(hù)端進(jìn)行GPRS連接所用到的一些API函數進(jìn)行講解。本文的最后是一些用于引用和學(xué)習用的鏈接和利用API建立GPRS連接的demo,感興趣的同志可以去點(diǎn)擊或下載后進(jìn)行深入研究。
關(guān)于客戶(hù)端API的敘述我基本上都是翻譯過(guò)來(lái)的,如欠妥還請各位多多斧正!同時(shí)demo程序我也是只做了部分加工,主要都是參照了謝紅偉的發(fā)表的文章(后面有引用鏈接)
二、進(jìn)階系列篇詳解
1. 客戶(hù)端建立GPRS連接 API
客戶(hù)端開(kāi)發(fā)采用 EVC4.0進(jìn)行開(kāi)發(fā),主要講解的類(lèi)庫為Connection Manager 系列API,客戶(hù)端在進(jìn)行GPRS撥號連接時(shí)將使用下文所介紹的API。
Connection Manager(本人譯為 連接管理器,此對象為一系列API的集合) 系列API的主要目的是為了集中管理基于Windows Mobile系列的設備網(wǎng)絡(luò )連接的建立與維護。移動(dòng)應用程序使用 連接管理器API去建立或規劃一個(gè)網(wǎng)絡(luò )連接,而連接管理器則掌控連接過(guò)程中的所有狀態(tài)信息.應用程序在要發(fā)起一個(gè)連接(比如Internet),只要簡(jiǎn)單的告知連接管理器就OK了。
當一個(gè)應用程序發(fā)起一個(gè)網(wǎng)絡(luò )連接的請求時(shí),連接管理器首先從連接服務(wù)提供商(CSPS)處獲取所有可能的連接信息,然后連接管理器會(huì )從這一系列連接信息中根據開(kāi)銷(xiāo),延遲、帶寬等因素來(lái)選擇一個(gè)最佳的連接,最后連接管理器將被請求的連接排入隊列,然后在一個(gè)適合的時(shí)間使用CSPS來(lái)建立連接。
【API函數】:
a) ConnMgrApiReadyEvent()函數
函數原型:HANDLE WINAPI ConnMgrApiReadyEvent();
利用此函數來(lái)我們可以返回一個(gè)連接事件的句柄 ,注意在的得到句柄后要記得及時(shí)釋放
b) ConnMgrConnectionStatus()函數
函數原型:
HRESULT WINAPI ConnMgrConnectionStatus(HANDLE hConnection,DWORD * pdwStatus );利用此函數的返回值pdwStatus,我們可以得到很多的關(guān)于連接的信息,例如如果我們連接成功將返回CONNMGR_STATUS_CONNECTED,斷開(kāi)連接將返回CONNMGR_STATUS_DISCONNECTED,他的返回狀態(tài)信息非常豐富,有14中之多,完全可以滿(mǎn)足我們的應用需要;
c) ConnMgrEnumDestinations()函數
函數原型:
HRESULT WINAPI ConnMgrEnumDestinations(int nIndex,CONNMGR_DESTINATION_INFO * pDestInfo );
一般我們的PDA在連接GPRS時(shí)都有好幾個(gè)連接,利用此函數我們可以枚舉出所有可用的連接,然后再對挑選的連接進(jìn)行篩選得到一個(gè)最佳連接
接下來(lái)講兩個(gè)很重要的函數,我們將利用兩個(gè)函數中的一個(gè)來(lái)發(fā)起連接,他們是:
d) ConnMgrEstablishConnection()和ConnMgrEstablishConnectionSync()函數,這兩個(gè)函數一個(gè)用于發(fā)起一個(gè)異步連接請求,一個(gè)用于同步請求,使用異步連接請求我們可以在發(fā)起連接后立即返回,而使用同步請求客戶(hù)端將一直被阻塞知道函數返回確認連接,關(guān)于異步和同步我就不再敘述;
它們的原型依次為:
HRESULT WINAPI ConnMgrEstablishConnection( CONNMGR_CONNECTIONINFO * pConnInfo, HANDLE * phConnection );
HRESULT WINAPI ConnMgrEstablishConnectionSync( CONNMGR_CONNECTIONINFO * pConnInfo, HANDLE * phConnection, DWORD dwTimeout, DWORD * pdwStatus );
可以看到兩個(gè)函數的第一個(gè)參數都為一個(gè)CONNMGR_CONNECTIONINFO對象,此對象為一個(gè)結構體,它保存了客戶(hù)端發(fā)起連接請求的一系列信息,因此,在我們調用此函數時(shí)必須構造一個(gè)該對象,然后將其作為參數傳入連接函數中。這里很有必要講一下該結構體,該結構體的原型如下:
typedef struct _CONNMGR_CONNECTIONINFO
{
DWORD cbSize; DWORD dwParams;DWORD dwFlags;
DWORD dwPriority;BOOL bExclusive;BOOL bDisabled;GUID guidDestNet;
HWND hWnd; UINT uMsg; LPARAM lParam;ULONG ulMaxCost; ULONG ulMinRcvBw;
ULONG ulMaxConnLatency;
} CONNMGR_CONNECTIONINFO;
其中參數dwFlags用于指定我們的接入點(diǎn),比如我們常說(shuō)的CMNER和CMWAP,而參數GUID則標志了我們對應于每個(gè)接入點(diǎn)的全球唯一標志符,關(guān)于如何得到或者查看GUID,我們可以在“Program FilesWindows CE Toolswce420POCKET PC 2003IncludeArmv4”目錄下查看connmgr.h文件,里面包含了各個(gè)接入點(diǎn)的GUID,例如:
CMNET 為:(0x436ef144, 0xb4fb, 0x4863, 0xa0, 0x41, 0x8f, 0x90, 0x5a, 0x62, 0xc5, 0x72)
CMWAP為:0x7022e968, 0x5a97, 0x4051, 0xbc, 0x1c, 0xc5, 0x78, 0xe2, 0xfb, 0xa5, 0xd9
如果想更進(jìn)一步了解,我們還可以通過(guò)查看注冊表方式來(lái)查看PDA上連接管理器的相關(guān)連接信息,在PPC 2003中注冊表路徑為:
[HKEY_LOCAL_MACHINECommConnMgr],如下圖所示:

在Destinations一項中就對應我們所有可用的網(wǎng)絡(luò )連接,這個(gè)跟用ConnMgrEnumDestinations()方法得到的是一樣的效果,在默認Internet設置中我們將看到CMNET的GUID,如下所示:

在這里里面有DestId一項,就對應著(zhù)我們久違的GUID
e) ConnMgrReleaseConnection函數
我們在上一步中建立連接后我們將得到一個(gè)連接句柄,在重新開(kāi)始一個(gè)新的連接或者斷開(kāi)連接都要調用此函數來(lái)釋放掉之前創(chuàng )建的連接,它的原型為:
評論