WM下的数据业务拨号
2008-08-01 15:52 cppguy 阅读(1371) 评论(0) 编辑 收藏 举报WM下的很多应用是需要动态的拨号建立与Internet的连接,G网一般会启用GPRS,C网启用CDMA的数据服务,如果应用过移动msn,移动QQ,Fetion,手机大头等其他手机IM软件的用户来说,基于Windows mobile的版本,都会有自动数据拨号连接的功能,本人认为手机大头是做的比较优秀和稳定的,它会识别出现有的wap或者net网络连接,并有自己的默认连接选项,这样普通用户就不用通过连接管理器来手动配置GPRS连接,自动的就会接入Wap网络,对于开发者来说,我们可以使用“连接管理器”API建立连接,也可以使用RAS。
1:Connection Manager
针对G网手机,数据连接是建立在GPRS上的,在运行Windows Mobile的设备中,有一个专用的API来处理连接的建立与状态的监视,虽然只是一套本地API,但可以通过P/Invoke或者第三方封装器类库,方便机型调用。
连接管理器用于处理不同网络媒介上的底层连接(如WiFi,GPRS,电路交换数据和桌面简介连接)。由于这个API管理的连接跨越系统中所有应用程序,基于其他应用程序所请求的连接来进行决策会更合适。它是围绕目标网络与这些目标的路由的概念构建起来的。在CM中设置这些连接后,只需要知道要连接的目标网络,之后CM会自动管理连接过程,使您连接到所选的网络上。
有许多像Internet,单位和Wap的标准网络,大多数情况下,程序只需要连接到Internet或单位这样的目标网络。
这套连接管理器API支持通知,后者可以通过窗口消息提供的窗口句柄返回给应用程序。另外程序通过ConnMgrConnectionStatus函数,随时获得状态。 在下面的代码中,演示如何通过“连接管理器”创建一个最合适的连接类型来建立Internet连接。这个例子对CM的封装十分有限。第三方类库提供了更完整的功能实现。例如Mobile In Hand www.inthehand.com/windowsmobile.aspx 或者OpennetCF Smart Device Framework,网址为www.opennetcf.org/sdf
连接管理器使用了一些标准的规则,用于检测主机名称是Internet格式,还是单一的主机名称。ConnMgrMapUrl方法会检查URL,并返回目标网络的标识符。下面这个封装其函数将返回目标网络的标识符列表。
public static Guid[] MapUrl(Uri uri)
{
ArrayList al=new ArrayList();
Guid g;
int index=0;
int hresult=0;
while(hresult==0)
{
hresult=ConnMgrMapURL(url.ToString(),out g,ref index);
if(hresult==0)
{
al.Add(g);
}
}
return (Guid[]) al.ToArray(typeof(Guid));
}
[DllImport("cellcore",SetLastError=true)]
private static extern int ConnMgrMapURL(string pwszURL,out Guid pguid,ref int pdwIndex)
返回的各个Guid值会按优先级顺序,从高到低排列。可以创建ConnnectionManager的实例,并使用其中的第一个返回值调用EstablishConnection或者EstablishConnectionSync方法。这些方法会分别调用本地的ConnMgrEstablishConnection和ConnMgrEstablishConnectionSync方法。EstablishConnectionSync放阿飞会等待连接建立,超时候便失败。EstablishConnection会启动一个连接进程,然后将控制权交还给您的代码。对于连接请求的生命周期,需要维护一个句柄。我们将其存储在ConnecionMnanger的实例中。
在本例中,将连接设置以CONNMGR_CONNECTIONINFO结构的形式被插入,这个结构在托管代码中如下定义:
[StructLayout(LayoutKind.Seuential)]
internal struct CONNMGR_CONNECTIONINFO
{
public int cbSize;
public CONNMGR_PARAM dwParams;
pubilc CONNMGR_FLAG dwFlags;
pubilc ConnectionPriority dwPriority;
public int bExclusive;
public int bDisabled;
pubilc Guid guidDestNet;
pubic IntPtr hWnd;
pubilc uint uMsg;
pubilc uint lparam;
pubic uint ulMaxCost;
public uint ulMaxRcvBw;
public uint ulMaxConnlatrency;
}
}
2 : RAS(Remote Access Service),即“远程访问服务”,它允许用户从远程地点将自己的计算机连接到一个本地计算机网络。一旦建立了连接,就可以像与局域网中的计算机一样进行通讯,即使计算机实际连接的是一个远程网络。例如,CE中如果有GPRS设备,就可以通过RAS直接借入Internet,下面介绍RAS功能需要用到的一些API函数,这里我都已经通过P/Invoke将接口转换为c#了
建立拨号连接
在RAS客户端应用程序准备和一个远程的计算机建立通讯时,首先需要调用RASDial幻术来建立连接,
public static int RASDial(int hDC)
{
return sRASDial(sConnectionEntry, sUsername, sPassword, sDomain, ref iConnection, ref hDC, SapphireRASLicence);
}
参数sConnectionEntry 指定了建立拨号连接的名称,RASDail函数将根据该名称建立拨号连接,该参数不能为空
参数sUsername, sPassword 指定访问远程RAS服务器进行身份验证的用户名和密码
参数sDomain 指定进行验证时的域名
参数hDC,用于指定RasDial函数建立的拨号连接句柄
相信RAS封装请看demo中RAS工程,这里简单介绍一下使用的方法。
public bool RssConnect()
{
Ras.RasClass.sConnectionEntry = this._connectEntry;
Ras.RasClass.sUsername = "";
Ras.RasClass.sPassword = "";
Ras.RasClass.sDomain = "";
Ras.RasClass.sUserPass = false;
Ras.PhoneBook.PBSetWorkInternet(2);
//使用了自动连接,就是使用当前的默认连接作为GPRS的入口
int result = MRas.RasClass.RASAutoDial();
return (result == 0) ? true : false;
}
RASDemo 下载链接 https://files.cnblogs.com/abob/RASDemo.rar