當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 一、前言在前篇《GPRS開發(fā)系列文章之入門篇》里,我主要對(duì)GPRS開發(fā)中遇到的一些常用概念和一些業(yè)務(wù)邏輯做了簡(jiǎn)單的介紹,沒想到得到了很多網(wǎng)友的支持和關(guān)注,因昨天有事因此

 一、前言

在前篇《GPRS開發(fā)系列文章之入門篇》里,我主要對(duì)GPRS開發(fā)中遇到的一些常用概念和一些業(yè)務(wù)邏輯做了簡(jiǎn)單的介紹,沒想到得到了很多網(wǎng)友的支持和關(guān)注,因昨天有事因此延遲到今天才奉上這篇進(jìn)階系列文章,還請(qǐng)各位見諒。希望大家支持同時(shí)歡迎拍磚,共同提高。

在最后一篇《GPRS開發(fā)系列文章之實(shí)戰(zhàn)篇》我將詳細(xì)敘述如何利用類庫(kù)開發(fā)Client和Server端通信程序,因此本文的多數(shù)講解將是為下文服務(wù)的。本文將向您介紹基于PPC2003的Windows mobile 系列的客戶端和基于.Net 2005的服務(wù)器端進(jìn)行開發(fā)所需掌握和了解的開發(fā)庫(kù),并著重圍繞客戶端進(jìn)行GPRS連接所用到的一些API函數(shù)進(jìn)行講解。本文的最后是一些用于引用和學(xué)習(xí)用的鏈接和利用API建立GPRS連接的demo,感興趣的同志可以去點(diǎn)擊或下載后進(jìn)行深入研究。

關(guān)于客戶端API的敘述我基本上都是翻譯過(guò)來(lái)的,如欠妥還請(qǐng)各位多多斧正!同時(shí)demo程序我也是只做了部分加工,主要都是參照了謝紅偉的發(fā)表的文章(后面有引用鏈接)

二、進(jìn)階系列篇詳解

1. 客戶端建立GPRS連接 API

客戶端開發(fā)采用 EVC4.0進(jìn)行開發(fā),主要講解的類庫(kù)為Connection Manager 系列API,客戶端在進(jìn)行GPRS撥號(hào)連接時(shí)將使用下文所介紹的API。

Connection Manager(本人譯為 連接管理器,此對(duì)象為一系列API的集合) 系列API的主要目的是為了集中管理基于Windows Mobile系列的設(shè)備網(wǎng)絡(luò)連接的建立與維護(hù)。移動(dòng)應(yīng)用程序使用 連接管理器API去建立或規(guī)劃一個(gè)網(wǎng)絡(luò)連接,而連接管理器則掌控連接過(guò)程中的所有狀態(tài)信息.應(yīng)用程序在要發(fā)起一個(gè)連接(比如Internet),只要簡(jiǎn)單的告知連接管理器就OK了。

當(dāng)一個(gè)應(yīng)用程序發(fā)起一個(gè)網(wǎng)絡(luò)連接的請(qǐng)求時(shí),連接管理器首先從連接服務(wù)提供商(CSPS)處獲取所有可能的連接信息,然后連接管理器會(huì)從這一系列連接信息中根據(jù)開銷,延遲、帶寬等因素來(lái)選擇一個(gè)最佳的連接,最后連接管理器將被請(qǐng)求的連接排入隊(duì)列,然后在一個(gè)適合的時(shí)間使用CSPS來(lái)建立連接。

【API函數(shù)】:

a) ConnMgrApiReadyEvent()函數(shù)

函數(shù)原型:HANDLE WINAPI ConnMgrApiReadyEvent();

利用此函數(shù)來(lái)我們可以返回一個(gè)連接事件的句柄 ,注意在的得到句柄后要記得及時(shí)釋放

b) ConnMgrConnectionStatus()函數(shù)

函數(shù)原型:

HRESULT WINAPI ConnMgrConnectionStatus(HANDLE hConnection,DWORD * pdwStatus );利用此函數(shù)的返回值pdwStatus,我們可以得到很多的關(guān)于連接的信息,例如如果我們連接成功將返回CONNMGR_STATUS_CONNECTED,斷開連接將返回CONNMGR_STATUS_DISCONNECTED,他的返回狀態(tài)信息非常豐富,有14中之多,完全可以滿足我們的應(yīng)用需要;

c) ConnMgrEnumDestinations()函數(shù)

函數(shù)原型:

HRESULT WINAPI ConnMgrEnumDestinations(int nIndex,CONNMGR_DESTINATION_INFO * pDestInfo );

一般我們的PDA在連接GPRS時(shí)都有好幾個(gè)連接,利用此函數(shù)我們可以枚舉出所有可用的連接,然后再對(duì)挑選的連接進(jìn)行篩選得到一個(gè)最佳連接

接下來(lái)講兩個(gè)很重要的函數(shù),我們將利用兩個(gè)函數(shù)中的一個(gè)來(lái)發(fā)起連接,他們是:

d) ConnMgrEstablishConnection()和ConnMgrEstablishConnectionSync()函數(shù),這兩個(gè)函數(shù)一個(gè)用于發(fā)起一個(gè)異步連接請(qǐng)求,一個(gè)用于同步請(qǐng)求,使用異步連接請(qǐng)求我們可以在發(fā)起連接后立即返回,而使用同步請(qǐng)求客戶端將一直被阻塞知道函數(shù)返回確認(rèn)連接,關(guān)于異步和同步我就不再敘述;

它們的原型依次為:

HRESULT WINAPI ConnMgrEstablishConnection( CONNMGR_CONNECTIONINFO * pConnInfo, HANDLE * phConnection );

HRESULT WINAPI ConnMgrEstablishConnectionSync( CONNMGR_CONNECTIONINFO * pConnInfo, HANDLE * phConnection, DWORD dwTimeout, DWORD * pdwStatus );

可以看到兩個(gè)函數(shù)的第一個(gè)參數(shù)都為一個(gè)CONNMGR_CONNECTIONINFO對(duì)象,此對(duì)象為一個(gè)結(jié)構(gòu)體,它保存了客戶端發(fā)起連接請(qǐng)求的一系列信息,因此,在我們調(diào)用此函數(shù)時(shí)必須構(gòu)造一個(gè)該對(duì)象,然后將其作為參數(shù)傳入連接函數(shù)中。這里很有必要講一下該結(jié)構(gòu)體,該結(jié)構(gòu)體的原型如下:

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;

其中參數(shù)dwFlags用于指定我們的接入點(diǎn),比如我們常說(shuō)的CMNER和CMWAP,而參數(shù)GUID則標(biāo)志了我們對(duì)應(yīng)于每個(gè)接入點(diǎn)的全球唯一標(biāo)志符,關(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ò)查看注冊(cè)表方式來(lái)查看PDA上連接管理器的相關(guān)連接信息,在PPC 2003中注冊(cè)表路徑為:

[HKEY_LOCAL_MACHINECommConnMgr],如下圖所示:

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

在這里里面有DestId一項(xiàng),就對(duì)應(yīng)著我們久違的GUID

e) ConnMgrReleaseConnection函數(shù)

我們?cè)谏弦徊街薪⑦B接后我們將得到一個(gè)連接句柄,在重新開始一個(gè)新的連接或者斷開連接都要調(diào)用此函數(shù)來(lái)釋放掉之前創(chuàng)建的連接,它的原型為:[!--empirenews.page--]

HRESULT WINAPI ConnMgrReleaseConnection( HANDLE hConnection,BOOL bCache );

【連接管理API大致使用步驟】:

首先我們利用ConnMgrApiReadyEvent()函數(shù)來(lái)確認(rèn)是否有可用連接,如果有可用連接我們則利用ConnMgrEnumDestinations()函數(shù)枚舉所有可用連接,然后遍歷所有連接調(diào)用我們的同步或異步連接方法ConnMgrEstablishConnectionSync()與ConnMgrEstablishConnection()來(lái)發(fā)起連接,一旦連接成功后我們就可以進(jìn)行我們偉大的下一步了,就是和我們的服務(wù)器進(jìn)行通信。

【GPRS demo效果圖】

【GPRSDemo介紹】

GPRSDemo主要利用了上述的幾個(gè)重要的API函數(shù)來(lái)獲取當(dāng)前可用連接,并自動(dòng)選擇一個(gè)最佳的連接途徑,然后啟用這個(gè)連接,在連接啟動(dòng)成功以后再用socket 進(jìn)行網(wǎng)絡(luò)連接,與公網(wǎng)服務(wù)器進(jìn)行通信。

首先檢查是否有可用連接

BOOL CConnectManager::GetConnMgrAvailable()

{

HANDLE hConnMgr = ConnMgrApiReadyEvent ();

BOOL bAvailbale = FALSE;

DWORD dwResult = ::WaitForSingleObject ( hConnMgr, 2000 );

if ( dwResult == WAIT_OBJECT_0 )

{

bAvailbale = TRUE;

}

// 關(guān)閉

if ( hConnMgr ) CloseHandle ( hConnMgr );

return bAvailbale;

}

然后枚舉所有可用連接:

void CConnectManager::EnumNetIdentifier ( OUT CStringArray &StrAry )

{

CONNMGR_DESTINATION_INFO networkDestInfo = {0};

// 得到網(wǎng)絡(luò)列表

for ( DWORD dwEnumIndex=0; ; dwEnumIndex++ )

{

memset ( &networkDestInfo, 0, sizeof(CONNMGR_DESTINATION_INFO) );

if ( ConnMgrEnumDestinations ( dwEnumIndex, &networkDestInfo ) == E_FAIL )

{

break;

}

StrAry.Add ( networkDestInfo.szDescription );

}

}

接下來(lái)找到“Internet”這個(gè)連接,可用遠(yuǎn)程URL映射的方式來(lái)完成,這樣可以讓系統(tǒng)自動(dòng)選取一個(gè)最好的連接。

int CConnectManager::MapURLAndGUID ( LPCTSTR lpszURL, OUT GUID &guidNetworkObject, OUT CString *pcsDesc/*=NULL*/ )

{

if ( !lpszURL || lstrlen(lpszURL) < 1 )

return FALSE;

memset ( &guidNetworkObject, 0, sizeof(GUID) );

int nIndex = 0;

HRESULT hResult = ConnMgrMapURL ( lpszURL, &guidNetworkObject, (DWORD*)&nIndex );

if ( FAILED(hResult) )

{

nIndex = -1;

DWORD dwLastError = GetLastError ();

AfxMessageBox ( _T("Could not map a request to a network identifier") );

}

else

{

if ( pcsDesc )

{

CONNMGR_DESTINATION_INFO DestInfo = {0};

if ( SUCCEEDED(ConnMgrEnumDestinations(nIndex, &DestInfo)) )

{

*pcsDesc = DestInfo.szDescription;

}

}

}

return nIndex;

}

最后啟用指定編號(hào)的連接并檢查連接狀態(tài)

BOOL CConnectManager::EstablishConnection ( DWORD dwIndex )

{

// 釋放之前的連接

ReleaseConnection ();

// 得到正確的連接信息

CONNMGR_DESTINATION_INFO DestInfo = {0};

HRESULT hResult = ConnMgrEnumDestinations(dwIndex, &DestInfo);

BOOL bRet = FALSE;

if(SUCCEEDED(hResult))

{

// 初始化連接結(jié)構(gòu)

CONNMGR_CONNECTIONINFO ConnInfo;

ZeroMemory(&ConnInfo, sizeof(ConnInfo));

ConnInfo.cbSize = sizeof(ConnInfo);

ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;

ConnInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP | CONNMGR_FLAG_PROXY_WAP | CONNMGR_FLAG_PROXY_SOCKS4 | CONNMGR_FLAG_PROXY_SOCKS5;

ConnInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;

ConnInfo.guidDestNet = DestInfo.guid;

ConnInfo.bExclusive = FALSE;

ConnInfo.bDisabled = FALSE;

DWORD dwStatus = 0;

hResult = ConnMgrEstablishConnectionSync(&ConnInfo, &m_hConnection, 10*1000, &dwStatus );

if(FAILED(hResult))

{

m_hConnection = NULL;

}

else bRet = TRUE;

}

return bRet;

}

檢測(cè)連接狀態(tài)

BOOL CConnectManager::WaitForConnected ( int nTimeoutSec, DWORD *pdwStatus/*=NULL*/ )

{

DWORD dwStartTime = GetTickCount ();

BOOL bRet = FALSE;

while ( GetTickCount ()-dwStartTime < (DWORD)nTimeoutSec * 1000 )

{

if ( m_hConnection )

{

DWORD dwStatus = 0;

HRESULT hr = ConnMgrConnectionStatus ( m_hConnection, &dwStatus );

if ( pdwStatus ) *pdwStatus = dwStatus;

if ( SUCCEEDED(hr) )

{

if ( dwStatus == CONNMGR_STATUS_CONNECTED )

{

bRet = TRUE;

break;

}

}

}

Sleep ( 100 );

}

return bRet;

}

最后要記得釋放連接

void CConnectManager::ReleaseConnection ()

{

if ( m_hConnection )

{

ConnMgrReleaseConnection(m_hConnection, FALSE);

m_hConnection = NULL;

}

}

2. 客戶端與服務(wù)器端進(jìn)行socket通信APIsocket通信相關(guān)開發(fā)API在Winsock2.h.文件中定義,因?yàn)镾OCKET通信不是本文的重點(diǎn)但是又是必須要涉及的[!--empirenews.page--]

a) WSAStartup函數(shù)。在應(yīng)用程序進(jìn)行Windows Sockets通信時(shí),必須首先調(diào)用此函數(shù)來(lái)指定應(yīng)用程序要加載的Windows Scoket版本等信息,應(yīng)用程序結(jié)束前我們應(yīng)該調(diào)用WSACleanup去釋放掉所用的系統(tǒng)資源

b) Connect 函數(shù)。此函數(shù)用來(lái)建立連接

c) Select 函數(shù)。建立連接后,用來(lái)偵聽是否有數(shù)據(jù)傳輸

d) Send函數(shù)。用于給服務(wù)器發(fā)送消息

3. 服務(wù)器端與客戶端進(jìn)行socket通信

服務(wù)器端主要涉及到的庫(kù)為:

System.Net,System.Net.Sockets,System.IO;

System.Net 命名空間為當(dāng)前網(wǎng)絡(luò)上使用的多種協(xié)議提供了簡(jiǎn)單的編程接口,System.Net.Sockets 命名空間為需要嚴(yán)密控制網(wǎng)絡(luò)訪問的開發(fā)人員提供了Windows Sockets (Winsock) 接口的托管實(shí)現(xiàn)。

System.IO 命名空間包含允許讀寫文件和數(shù)據(jù)流的類型以及提供基本文件和目錄支持的類型。

需要了解的技術(shù)有:多線程,事件與委托,SOCKET通信等

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉