gprs开发系列文章之进阶篇

上传人:小** 文档编号:70920584 上传时间:2019-01-19 格式:DOC 页数:13 大小:80.50KB
返回 下载 相关 举报
gprs开发系列文章之进阶篇_第1页
第1页 / 共13页
gprs开发系列文章之进阶篇_第2页
第2页 / 共13页
gprs开发系列文章之进阶篇_第3页
第3页 / 共13页
gprs开发系列文章之进阶篇_第4页
第4页 / 共13页
gprs开发系列文章之进阶篇_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《gprs开发系列文章之进阶篇》由会员分享,可在线阅读,更多相关《gprs开发系列文章之进阶篇(13页珍藏版)》请在金锄头文库上搜索。

1、GPRS开发系列文章之进阶篇豆豆网 技术应用频道2009年07月04日 【字号:小 中 大】 收藏本文关键字: GPRS开发 GPRS连接 模拟器 Startup.s Bootloader Mobile GPRS开发系列文章之进阶篇。 在前篇GPRS开发系列文章之入门篇里,我主要对GPRS开发中遇到的一些常用概念和一些业务逻辑做了简单的介绍,没想到得到了很多网友的支持和关注,因昨天有事因此延迟到今天才奉上这篇进阶系列文章,还请各位见谅。希望大家支持同时欢迎拍砖,共同提高。在最后一篇GPRS开发系列文章之实战篇我将详细叙述如何利用类库开发Client和Server端通信程序,因此本文的多数讲解将

2、是为下文服务的。本文将向您介绍基于PPC2003的Windows mobile 系列的客户端和基于.Net 2005的服务器端进行开发所需掌握和了解的开发库,并着重围绕客户端进行GPRS连接所用到的一些API函数进行讲解。本文的最后是一些用于引用和学习用的链接和利用API建立GPRS连接的demo,感兴趣的同志可以去点击或下载后进行深入研究。 关于客户端API的叙述我基本上都是翻译过来的,如欠妥还请各位多多斧正!同时demo程序我也是只做了部分加工,主要都是参照了谢红伟的发表的文章(后面有引用链接)二、进阶系列篇详解1. 客户端建立GPRS连接 API客户端开发采用 EVC4.0进行开发,主要

3、讲解的类库为Connection Manager 系列API,客户端在进行GPRS拨号连接时将使用下文所介绍的API。 Connection Manager(本人译为 连接管理器,此对象为一系列API的集合) 系列API的主要目的是为了集中管理基于Windows Mobile系列的设备网络连接的建立与维护。移动应用程序使用 连接管理器API去建立或规划一个网络连接,而连接管理器则掌控连接过程中的所有状态信息.应用程序在要发起一个连接(比如Internet),只要简单的告知连接管理器就OK了。当一个应用程序发起一个网络连接的请求时,连接管理器首先从连接服务提供商(CSPS)处获取所有可能的连接信

4、息,然后连接管理器会从这一系列连接信息中根据开销,延迟、带宽等因素来选择一个最佳的连接,最后连接管理器将被请求的连接排入队列,然后在一个适合的时间使用CSPS来建立连接。【API函数】:a) ConnMgrApiReadyEvent()函数函数原型:HANDLE WINAPI ConnMgrApiReadyEvent();利用此函数来我们可以返回一个连接事件的句柄 ,注意在的得到句柄后要记得及时释放b) ConnMgrConnectionStatus()函数函数原型:HRESULT WINAPI ConnMgrConnectionStatus(HANDLE hConnection,DWORD

5、* pdwStatus );利用此函数的返回值pdwStatus,我们可以得到很多的关于连接的信息,例如如果我们连接成功将返回CONNMGR_STATUS_CONNECTED,断开连接将返回CONNMGR_STATUS_DISCONNECTED,他的返回状态信息非常丰富,有14中之多,完全可以满足我们的应用需要;c) ConnMgrEnumDestinations()函数函数原型:HRESULT WINAPI ConnMgrEnumDestinations(int nIndex,CONNMGR_DESTINATION_INFO * pDestInfo );一般我们的PDA在连接GPRS时都有好

6、几个连接,利用此函数我们可以枚举出所有可用的连接,然后再对挑选的连接进行筛选得到一个最佳连接接下来讲两个很重要的函数,我们将利用两个函数中的一个来发起连接,他们是:d) ConnMgrEstablishConnection()和ConnMgrEstablishConnectionSync()函数,这两个函数一个用于发起一个异步连接请求,一个用于同步请求,使用异步连接请求我们可以在发起连接后立即返回,而使用同步请求客户端将一直被阻塞知道函数返回确认连接,关于异步和同步我就不再叙述;它们的原型依次为:HRESULT WINAPI ConnMgrEstablishConnection( CONNMG

7、R_CONNECTIONINFO * pConnInfo, HANDLE * phConnection );HRESULT WINAPI ConnMgrEstablishConnectionSync( CONNMGR_CONNECTIONINFO * pConnInfo, HANDLE * phConnection, DWORD dwTimeout, DWORD * pdwStatus );可以看到两个函数的第一个参数都为一个CONNMGR_CONNECTIONINFO对象,此对象为一个结构体,它保存了客户端发起连接请求的一系列信息,因此,在我们调用此函数时必须构造一个该对象,然后将其作为参数

8、传入连接函数中。这里很有必要讲一下该结构体,该结构体的原型如下: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;其中参

9、数dwFlags用于指定我们的接入点,比如我们常说的CMNER和CMWAP,而参数GUID则标志了我们对应于每个接入点的全球唯一标志符,关于如何得到或者查看GUID,我们可以在“Program FilesWindows CE Toolswce420POCKET PC 2003IncludeArmv4”目录下查看connmgr.h文件,里面包含了各个接入点的GUID,例如:CMNET 为:(0x436ef144, 0xb4fb, 0x4863, 0xa0, 0x41, 0x8f, 0x90, 0x5a, 0x62, 0xc5, 0x72)CMWAP为:0x7022e968, 0x5a97, 0x

10、4051, 0xbc, 0x1c, 0xc5, 0x78, 0xe2, 0xfb, 0xa5, 0xd9如果想更进一步了解,我们还可以通过查看注册表方式来查看PDA上连接管理器的相关连接信息,在PPC 2003中注册表路径为:HKEY_LOCAL_MACHINECommConnMgr,如下图所示:在Destinations一项中就对应我们所有可用的网络连接,这个跟用ConnMgrEnumDestinations()方法得到的是一样的效果,在默认Internet设置中我们将看到CMNET的GUID,如下所示:在这里里面有DestId一项,就对应着我们久违的GUIDe) ConnMgrReleas

11、eConnection函数我们在上一步中建立连接后我们将得到一个连接句柄,在重新开始一个新的连接或者断开连接都要调用此函数来释放掉之前创建的连接,它的原型为:HRESULT WINAPI ConnMgrReleaseConnection( HANDLE hConnection,BOOL bCache );【连接管理API大致使用步骤】:首先我们利用ConnMgrApiReadyEvent()函数来确认是否有可用连接,如果有可用连接我们则利用ConnMgrEnumDestinations()函数枚举所有可用连接,然后遍历所有连接调用我们的同步或异步连接方法ConnMgrEstablishConn

12、ectionSync()与ConnMgrEstablishConnection()来发起连接,一旦连接成功后我们就可以进行我们伟大的下一步了,就是和我们的服务器进行通信。【GPRS demo效果图】【GPRSDemo介绍】GPRSDemo主要利用了上述的几个重要的API函数来获取当前可用连接,并自动选择一个最佳的连接途径,然后启用这个连接,在连接启动成功以后再用socket 进行网络连接,与公网服务器进行通信。首先检查是否有可用连接BOOLCConnectManager:GetConnMgrAvailable()HANDLEhConnMgr=ConnMgrApiReadyEvent();BOO

13、LbAvailbale=FALSE;DWORDdwResult=:WaitForSingleObject(hConnMgr,2000);if(dwResult=WAIT_OBJECT_0)bAvailbale=TRUE;/关闭if(hConnMgr)CloseHandle(hConnMgr);returnbAvailbale; 然后枚举所有可用连接:voidCConnectManager:EnumNetIdentifier(OUTCStringArray&StrAry)CONNMGR_DESTINATION_INFOnetworkDestInfo=0;/得到网络列表for(DWORDdwEnu

14、mIndex=0;dwEnumIndex+)memset(&networkDestInfo,0,sizeof(CONNMGR_DESTINATION_INFO);if(ConnMgrEnumDestinations(dwEnumIndex,&networkDestInfo)=E_FAIL)break;StrAry.Add(networkDestInfo.szDescription);接下来找到“Internet”这个连接,可用远程URL映射的方式来完成,这样可以让系统自动选取一个最好的连接。 intCConnectManager:MapURLAndGUID(LPCTSTRlpszURL,OUTGUID&guidNetworkObject,OUTCString*pcsDesc/*=NULL*/)if(!lpszURL|lstrlen(lpszURL)1)returnFALSE;memset(&guidNetworkObject,0,sizeof(GUID);intnIndex=0;HRESULThResult=ConnMg

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号