Windows Mobile, WinCe使用 .NET Compact Framework 进行3G和RAS应用的开发

简介:

在.NET Compact Framework下开发3G应用可以有两个options,1:AT command, 2:RAS。其实RAS最终也是通过AT command来管理3G设备,RAS屏蔽了技术细节,很方便地建立TCP/IP based 的网络连接,所以推荐使用RAS,WinCE本身提供了native API可以直接操作RAS,管理3G设备及其连接。与此同时RAS也支持有线电话拨号,GPRS等应用。

RAS简介

Overview of RAS,MSDN

RAS的详细介绍见 Overview of RAS

由于.NET Compact Framework 不直接提供RAS组件,因此只能通过native invoke来使用RAS。

RAS的native调用函数,事件及结构见 RAS Reference 

关键的RAS native调用

 

复制代码
        [DllImport( " coredll.dll " , CharSet  =  CharSet.Auto)]
        
private   static   extern  Int32 RasGetEntryDialParams( string  lpszPhoneBook,
        
byte [] lpRasDialParams,
        
out  UInt32 lpfPassword);

        [DllImport(
" coredll.dll " , CharSet  =  CharSet.Auto)]
        
private   static   extern   int  RasDial(IntPtr pDialExtensions,
                                                   
string  pPhonebook,
                          
byte [] pRasDialParam,
                          
uint  pNotifierType,
                          IntPtr pHwnd,
                          
ref   int  pRasConn);

        [DllImport(
" coredll.dll " , CharSet  =  CharSet.Auto)]
        
private   static   extern   int  RasHangUp( int  pSession);

        [DllImport(
" coredll.dll " , CharSet  =  CharSet.Auto)]
        
private   static   extern   uint  RasGetConnectStatus( int  pSession,
                                                                        
byte [] lpRasConnStatus);
复制代码

RasGetEntryDialParams 取得原先配置的连接项,可以在手工新建连接或者修改注册表建立连接项(Connection Entry)。这个函数的关键作用是从连接项取出配置好的拨号密码。
RasDial 拨号到电信运营商的网络上。
RasHangUp 挂断连接。
RasGetConnectStatus 取当前的连接状态。

 

RAS 事件

在调用RasDial 时,如果uint pNotifierType传递0xFFFFFFFF,那么IntPtr pHwnd可以注册一个事件接受的Handler。当连接状态发生改变时,windows会把相应的事件发送给这个handler,这样我们可以接收这些事件,把之变成delegate来通知clients。这样就实现了一个Observer模式,client可以通过订阅来实时得到连接状态的变更状况。

要把windows event变成C#的delegate,要继承MessageWindow class,然后override  WndProc(ref Message pMsg),同时定义C#的delegate和event把windows事件变成delegate提供给client订阅。

 

复制代码
public   class  RasManager : MessageWindow
    {
        
public   delegate   void  NotifyEvent();
        
public   event  NotifyEvent OnConnectedEvent;
        
public   event  NotifyEvent OnDisconnectedEvent;

        
protected   override   void  WndProc( ref  Message pMsg)
        {
            
if  (pMsg.Msg  ==  WM_RASDIALEVENT)
            {
                
switch  (( int )pMsg.WParam)
                {
                    
case  ( int )RASCONNSTATE.RASCS_OpenPort:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_PortOpened:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_ConnectDevice:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_DeviceConnected:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_AllDevicesConnected:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_Authenticate:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_AuthNotify:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_AuthRetry:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_AuthCallback:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_AuthChangePassword:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_AuthProject:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_AuthLinkSpeed:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_AuthAck:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_ReAuthenticate:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_Authenticated:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_PrepareForCallback:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_WaitForModemReset:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_WaitForCallback:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_Projected:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_Interactive:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_RetryAuthentication:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_CallbackSetByCaller:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_PasswordExpired:
                        {
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_Connected:
                        {
                            OnConnected(); 
                            
break ;
                        }
                    
case  ( int )RASCONNSTATE.RASCS_Disconnected:
                        {
                            OnDisconnected();
                            
break ;
                        }
                    
default :
                        {
                            
break ;
                        }
                }
            }
            
base .WndProc( ref  pMsg);
        }
复制代码

RASCS_Disconnected windows 事件转换成OnConnected C# event, 而RASCS_Disconnected windows 事件转换成OnDisconnectedC# event

 

Client 的调用

事件注册可以放在Client 的Constructor上执行
RasManager.Instance.OnConnectedEvent  +=  
  new  RasManager.NotifyEvent(Form1_OnConnectedEvent);
RasManager.Instance.OnDisconnectedEvent 
+=  
new
 RasManager.NotifyEvent(Form1_OnDisconnectedEvent); 

 

连接3G网络
RasManager.Instance.DialUp( " 3G Connection " null null );

 

断开连接
RasManager.Instance.HangUp();

 

查询连接状态

 

RasManager.RASCONNSTATE rasConnState  =  
(RasManager.RASCONNSTATE) RasManager.Instance.GetStatus();

 

这个类同样可以使用于GPRS里面。

 



    本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/01/06/Windows_Mobile_3G.html,如需转载请自行联系原作者


相关文章
|
12天前
|
设计模式 开发框架 JavaScript
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
|
12天前
|
存储 缓存 NoSQL
2款使用.NET开发的数据库系统
2款使用.NET开发的数据库系统
|
12天前
|
开发框架 JavaScript 前端开发
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
|
1月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
36 1
|
7天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
12天前
|
监控 安全 网络安全
Windows Server管理:配置与管理技巧
Windows Server管理:配置与管理技巧
41 3
|
15天前
|
存储 安全 网络安全
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。
|
1月前
|
边缘计算 安全 网络安全
|
1月前
|
数据安全/隐私保护 Windows
安装 Windows Server 2019
安装 Windows Server 2019
|
1月前
|
网络协议 Windows
Windows Server 2019 DHCP服务器搭建
Windows Server 2019 DHCP服务器搭建
下一篇
无影云桌面