代码改变世界

WM下的数据业务拨号

2008-08-01 15:52  cppguy  阅读(1365)  评论(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