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,如需转载请自行联系原作者


相关文章
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
835 23
|
区块链 C# Windows
PasteEx:一款.NET开源的Windows快捷粘贴神器
PasteEx:一款.NET开源的Windows快捷粘贴神器
366 17
|
Web App开发 C# Windows
一款.NET开源的Windows资源管理器标签页工具
一款.NET开源的Windows资源管理器标签页工具
348 5
|
弹性计算 开发框架 安全
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
433 5
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
682 2
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
865 0
|
9月前
|
安全 数据安全/隐私保护 虚拟化
Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)
Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)
2220 2
Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)