织梦CMS - 轻松建站从此开始!

罗索

Windows Mobile 下使用C#进行GPRS、CDMA开发

jackyhwei 发布于 2010-08-25 19:57 点击:次 
有关GPRS、CDMA开发的文章网上已经有不少,但网上的文章大多数都是C++版本的,尽管也有C#编写的但是大多封装的有些不对并且没有经过很好的测试,本文在网络已有的资料上整理出如何用C#进行GPRS、CDMA开发。
TAG:

有关GPRS、CDMA开发的文章网上已经有不少,但是由于Windows Mobile SDK提供的GPRS、CDMA连接操作的库只有C++版本的(即Connection Manager API),网上的文章大多数都是C++版本的,尽管也有C#编写的但是大多封装的有些不对并且没有经过很好的测试,本文在网络已有的资料上整理出如何用C#进行GPRS、CDMA开发。

参考文献:

http://www.vckbase.com/document/viewdoc/?id=1803

http://www.cnblogs.com/jsjkandy/archive/2008/08/06/1262445.html

http://blogs.msdn.com/anthonywong/archive/2006/03/13/550686.aspx

开发环境

Visual Studio 2005

Windows Mobile 6 SDK Professional

头文件封装

我们要用到Windows Mobile SDK的一个C++的头文件Connmgr.h,它的路径是:c:\program files\windows mobile 6 sdk\pocketpc\include\armv4i\connmgr.h,首先要用C#重新定义要用到的这个头文件的常量、结构和外部函数声明。

有关C#平台封送的更多说明可以参考MSDN:

http://msdn.microsoft.com/zh-cn/library/fzhhdwae(VS.80).aspx

常量声明:

  1. const int S_OK = 0; 
  2. const uint CONNMGR_PARAM_GUIDDESTNET = 0x1; 
  3. const uint CONNMGR_PRIORITY_USERINTERACTIVE = 0x08000; 
  4. const uint INFINITE = 0xffffffff; 
  5. const uint CONNMGR_STATUS_CONNECTED = 0x10; 
  6.  
  7. const int CONNMGR_MAX_DESC = 128;   // @Max size of a network description 
  8. const int CONNMGR_FLAG_PROXY_HTTP = 0x1;    // @HTTP Proxy supported 
  9. const int CONNMGR_FLAG_PROXY_WAP = 0x2;     // @WAP Proxy (gateway) supported 
  10. const int CONNMGR_FLAG_PROXY_SOCKS4 = 0x4;  // @SOCKS4 Proxy supported 
  11. const int CONNMGR_FLAG_PROXY_SOCKS5 = 0x8;  // @SOCKS5 Proxy supported 
  12.  
  13. const UInt16 IDC_WAIT = 32514; 
  14. const UInt16 IDC_ARROW = 32512; 

结构封送声明

C++原型:

  1. typedef struct _CONNMGR_CONNECTIONINFO 
  2.     DWORD cbSize;       // @field Size of this structure 
  3.     DWORD dwParams;     // @field Valid parms, set of CONNMGR_PARAM_* 
  4.     DWORD dwFlags;      // @field Connection flags, set of CONNMGR_FLAG_* 
  5.     DWORD dwPriority;   // @field Priority, one of CONNMGR_PRIORITY_* 
  6.     BOOL bExclusive;    // @field Connection is exclusive, see comments 
  7.     BOOL bDisabled;     // @field Don't actually connect 
  8.     GUID guidDestNet;   // @field GUID of network to connect to 
  9.     HWND hWnd;  // @field hWnd to post status change messages to 
  10.     UINT uMsg;  // @field Msg to use when posting status changes 
  11.     LPARAM lParam;      // @field lParam to use when posting status changes 
  12.     ULONG ulMaxCost;    // @field Max acceptable cost of connection 
  13.     ULONG ulMinRcvBw;   // @field Min acceptable receive bandwidth of connection 
  14.     ULONG ulMaxConnLatency; // @field Max acceptable connect latency 
  15. } CONNMGR_CONNECTIONINFO; 
  16.  
  17. typedef struct _CONNMGR_DESTINATION_INFO 
  18.     GUID guid;  // @field GUID associated with network 
  19.     TCHAR szDescription[CONNMGR_MAX_DESC];  // @field Description of network 
  20.     BOOL fSecure; // @field Is it OK to allow multi-homing on the network 
  21. } CONNMGR_DESTINATION_INFO; 
  22.  
  23. typedef struct _GUID {  // size is 16 
  24.     DWORD Data1; 
  25.     WORD   Data2; 
  26.     WORD   Data3; 
  27.     BYTE  Data4[8]; 
  28. } GUID; 

C#声明

  1. [StructLayout(LayoutKind.Sequential)] 
  2. public struct CONNMGR_CONNECTIONINFO 
  3.     public uint cbSize; 
  4.     public uint dwParams; 
  5.     public uint dwFlags; 
  6.     public uint dwPriority; 
  7.     public int bExclusive; 
  8.     public int bDisabled; 
  9.     public GUID guidDestNet; 
  10.     public IntPtr hWnd; 
  11.     public uint uMsg; 
  12.     public uint lParam; 
  13.     public uint ulMaxCost; 
  14.     public uint ulMinRcvBw; 
  15.     public uint ulMaxConnLatency; 
  16.  
  17. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
  18. public struct CONNMGR_DESTINATION_INFO 
  19.     public GUID guid;  // @field GUID associated with network 
  20.     [MarshalAs(UnmanagedType.ByValTStr,SizeConst = CONNMGR_MAX_DESC)] 
  21.     public string szDescription;  // @field Description of network 
  22.     public int fSecure; // @field Is it OK to allow multi-homing on the network 
  23.   
  24. public struct GUID 
  25. {  // size is 16 
  26.     public uint Data1; 
  27.     public UInt16 Data2; 
  28.     public UInt16 Data3; 
  29.     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
  30.     public byte[] Data4; 

函数封送声明

C++原型:

请参考connmgr.h

C#声明:

  1. [DllImport("coredll.dll")] 
  2. public static extern uint GetTickCount(); 
  3.  
  4. [DllImport("coredll.dll")] 
  5. public static extern uint WaitForSingleObject(
  6. IntPtr hHandle,uint dwMilliseconds); 
  7.  
  8. [DllImport("cellcore.dll")] 
  9. public static extern int ConnMgrMapURL(
  10. string pwszURL, ref GUID pguid, ref uint pdwIndex); 
  11.  
  12. [DllImport("cellcore.dll")] 
  13. public static extern int ConnMgrEstablishConnectionSync(
  14. ref CONNMGR_CONNECTIONINFO ci, ref IntPtr phConnection,
  15.  uint dwTimeout, ref uint pdwStatus); 
  16.  
  17. [DllImport("cellcore.dll")] 
  18. private static extern IntPtr ConnMgrApiReadyEvent(); 
  19.  
  20. [DllImport("cellcore.dll")] 
  21. public static extern int ConnMgrReleaseConnection
  22. (IntPtr hConnection, int bCache); 
  23.  
  24. [DllImport("cellcore.dll")] 
  25. public static extern int ConnMgrEnumDestinations
  26. (int nIndex,ref CONNMGR_DESTINATION_INFO pDestInfo); 
  27.  
  28. [DllImport("cellcore.dll")] 
  29. public static extern int ConnMgrConnectionStatus
  30. (IntPtr hConnection, ref uint pdwStatus );   
  31.  
  32. [DllImport("coredll.dll")] 
  33. private static extern int CloseHandle(IntPtr hObject); 

这里参考http://www.vckbase.com/document/viewdoc/?id=1803例子用C#封装一个类库,并实现类似的Demo。运行界面如下图所示:

7

在Demo中,增加一个建立GPRS和建立CDMA连接的演示,代码:

  1. // <summary> 
  2. // 连接到移动网络 
  3. // </summary> 
  4. // <returns></returns> 
  5. private static bool ConnectMobileNetwork(string csDesc) 
  6.    ConnectManager connectManager = new ConnectManager(); 
  7.    List<ConnectManager.CONNMGR_DESTINATION_INFO> lst = connectManager.EnumNetIdentifier(); 
  8.    int nIndex = 0; 
  9.          
  10.    //选择连接 
  11.    for (; nIndex < lst.Count; nIndex++) 
  12.    { 
  13.        if (string.Compare(lst[nIndex].szDescription, csDesc, true) == 0) 
  14.        { 
  15.   break
  16.        } 
  17.    } 
  18.          
  19.    //建立连接 
  20.    if (nIndex >= 0 && nIndex < lst.Count) 
  21.    { 
  22.       return connectManager.EstablishConnection((uint)nIndex); 
  23.    } 
  24.    return false
  25.  
  26. // <summary> 
  27. // 建立GPRS连接 
  28. // </summary> 
  29. // <param name="sender"></param> 
  30. // <param name="e"></param> 
  31. private void btnConnectGPRS_Click(object sender, EventArgs e) 
  32.    if (!ConnectMobileNetwork("Internet 设置")) 
  33.    { 
  34.        MessageBox.Show("未能建立GPRS连接!"); 
  35.        return
  36.    } 
  37.    else 
  38.    { 
  39.        MessageBox.Show("成功建立GPRS连接!"); 
  40.    } 
  41. }        /// <summary> 
  42.  
  43. // 建立CDMA连接 
  44. // </summary> 
  45. // <param name="sender"></param> 
  46. // <param name="e"></param> 
  47. private void btnConnectCDMA_Click(object sender, EventArgs e) 
  48.    if (!ConnectMobileNetwork("联通wap")) 
  49.    { 
  50.        MessageBox.Show("未能建立CDMA连接!"); 
  51.        return
  52.    } 
  53.    else 
  54.    { 
  55.        MessageBox.Show("成功建立CDMA连接!"); 
  56.    } 

手机设置

      在这里给出GPRS连接的设置说明,大多数的手机采用默认设置就可以直接使用了,并不用自己设置,但是如果你发现上面代码运行后不能建立GPRS连接,测可以尝试下面的设置。

     在上面的GPRS连接代码中,我们使用了“Internet 设置”这个设置,如果手机还没有建立这个连接设置或者已经建立设置但是连接总是失败,则可以按下面的方式建立或修改连接设置(这里使用Windows Mobile 5操作系统,动感地带SIM卡,用模拟器截图):

     1.打开“开始->设置”,点击“连接”如图所示。

1

      2.如果您的手机已经有Internet设置,则在图2中会有“管理现有连接”的链接,点击它可以进行修改设置,在这里点击“添加新调制解调器连接”,增加一个Internet 设置。

2

    3.在弹出的如图3所示的对话框中,选择调制解调器为“电话线路(GPRS)”。

3

     4.在弹出如图4所示的对话框中,“访问点名称”输入“cmnet”。

4

     5.在弹出的如图5所示的对话框中,直接点击“完成”。对于专用网络则要输入移动提供的用户名和密码。

5

     6.点击“完成”后在“Internet 设置”里多了一个“GRPS连接互联网”的设置,如果此处有几个设置,请确保您要使用的设置处于选中状态。点击“OK”退出设置。此时您可以使用本问提供的实例程序来尝试连接,在连接的时候手机不要和电脑处于同步状态,否则手机可能不会进行拨号。

6

      从上面的使用我们可以知道,建立GPRS连接和建立CDMA连接的差别仅仅是连接设置的不同而已,也就是拨号的问题。但是网络上很多人问GPRS开发和CDMA开发问题,这里通过这个Demo,希望可以给学习移动开发的朋友们提供一些帮助。

源码下载:本程序源码

(mugua)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201008/10039.html]
本文出处:博客园 作者:mugua
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容