我们现在的模块用的是USB接口,然后模拟成一个COM6进行通信,在CE的: 控制面板->网络连接 里要新建一个连接,选择“拨号连接”然后设置好区域代码,还有附加解调器命令+CGDCON,"IP","CMNET",modem选择,与modem的串口通信速率等信息,然后连接,这上可以实现上网。

添加的CE组件有:

CoreOS->Windwos CE devices->commuication services and newworking->networking-wide area network ->Dial up networking

->Autodail

->TAPI

->Virtual Private Networking(VPN)

我们现在要实现的功能是,让用户只点击一个ICON,就能实现上网,不用这么麻烦去设置。

我写了一个应用,通过RAS 接口调用可以实现拨号上网功能,但是,必须指定一个已建立并设好参数的连接,

所以,还得在程序中创建一个网络连接才行,因为我们需要的简化的其实就是让用户输入附加拨号命令(+CGDCONT=1,"IP","CMNET"那么一长串,其实只需要用户输入一个APN和一个电话号码就OK了)。因为针对不同的运营商,这个APN是不同的,所以这个要能给用户设置。

查MSDN得知,调用RasSetEntryProperties加上RasSetEntryDialParams可以实现,但是这种方法貌似设置不了modem的串口属性、附加拨号命令等一些信息,

用RasSetEntryProperties设置一个Entry的属性的时候,如果Entry的参数中指定的EntryName已经存在了,那么就更改已有的Entry的设置,如果不存在,则创建了一个新的Entry,这样就实现了创建拨号连接的功能,

MSDN上关于RasSetEntryProperties函数中的倒数第二个参数的解释说明是说它是一个指向包含设备配置信息的缓冲区的指针,是关于设modem的串口属性、附加拨号命令等,

但是要查阅关于这个配置信息的更多详细内容,就要看TAPI相关的lineGetDevConfig函数,但是TAPI相关知识是相当庞大的一个体系,因为项目时间很紧,

直接在WINCE系统里的控制面板下,进入“网络和拨号连接”,手动新建一个能拨通上网的连接,我命名为“3GCONNECT”

然后写测试程序,调用RasGetEntryProperties()函数,在倒数第二个参数传一个数组,然后打印出正确设置时的lpb里面的值,结果如下:

-                  lpb     0x001aed00 "0"       unsigned char[436]

[0x0]  0x30 '0'        unsigned char

[0x1]  0x00 ''          unsigned char

[0x2]  0x00 ''          unsigned char  //等待信用卡音频信号时间

[0x3]  0x00 ''          unsigned char

[0x4]  0x78 'x'        unsigned char  //120 秒这时间之内未建立连接,则取消拨号

[0x5]  0x00 ''          unsigned char

[0x6]  0x00 ''          unsigned char

[0x7]  0x00 ''          unsigned char

[0x8]  0x00 ''          unsigned char  //串口参数:流控制,0 -- 无 0x20 软件  0x10 硬件

[0x9]  0x01 'r'         unsigned char

[0xa]   0x00 ''          unsigned char

[0xb]  0x00 ''          unsigned char

[0xc]   0x00 ''          unsigned char  //串口波特率 19200

[0xd]  0x4b 'K'       unsigned char

[0xe]   0x00 ''          unsigned char

[0xf]   0x00 ''          unsigned char

[0x10] 0x00 ''          unsigned char // 对应“设备属性”对话框中的“手动拨号(用户提供拨号串)”,

//如果为0x04 表示选上此项

[0x11] 0x00 ''          unsigned char

[0x12] 0x08 ''       unsigned char //串口数据位 8位

[0x13] 0x00 ''          unsigned char   //停止位,00- 1位,  02 - 2位

[0x14] 0x00 ''          unsigned char   //奇偶校验位,00-无,01奇数,02偶数,03标记,04空格

[0x15] 0x00 ''          unsigned char

[0x16] 0x2b '+'        unsigned char

[0x17] 0x00 ''          unsigned char

[0x18] 0x43 'C'       unsigned char

[0x19] 0x00 ''          unsigned char

[0x1a] 0x47 'G'       unsigned char

[0x1b] 0x00 ''          unsigned char

[0x1c] 0x44 'D'       unsigned char

[0x1d] 0x00 ''          unsigned char

[0x1e] 0x43 'C'       unsigned char

[0x1f] 0x00 ''          unsigned char

[0x20] 0x4f 'O'        unsigned char

[0x21] 0x00 ''          unsigned char

[0x22] 0x4e 'N'        unsigned char

[0x23] 0x00 ''          unsigned char

[0x24] 0x54 'T'        unsigned char

[0x25] 0x00 ''          unsigned char

[0x26] 0x3d '='        unsigned char

[0x27] 0x00 ''          unsigned char

[0x28] 0x31 '1'        unsigned char

[0x29] 0x00 ''          unsigned char

[0x2a] 0x2c ','         unsigned char

[0x2b] 0x00 ''          unsigned char

[0x2c] 0x22 '"'        unsigned char

[0x2d] 0x00 ''          unsigned char

[0x2e] 0x49 'I'         unsigned char

[0x2f] 0x00 ''          unsigned char

[0x30] 0x50 'P'        unsigned char

[0x31] 0x00 ''          unsigned char

[0x32] 0x22 '"'        unsigned char

[0x33] 0x00 ''          unsigned char

[0x34] 0x2c ','         unsigned char

[0x35] 0x00 ''          unsigned char

[0x36] 0x22 '"'        unsigned char

[0x37] 0x00 ''          unsigned char

[0x38] 0x43 'C'       unsigned char

[0x39] 0x00 ''          unsigned char

[0x3a] 0x4d 'M'       unsigned char

[0x3b] 0x00 ''          unsigned char

[0x3c] 0x4e 'N'        unsigned char

[0x3d] 0x00 ''          unsigned char

[0x3e] 0x45 'E'        unsigned char

[0x3f] 0x00 ''          unsigned char

[0x40] 0x54 'T'        unsigned char

[0x41] 0x00 ''          unsigned char

[0x42] 0x22 '"'        unsigned char

[0x43] 0x00 ''          unsigned char

[0x44]         0x00 ''          unsigned char后面的全为0

经过改不同的参数然后以上面的方法打出这个参数传回来的值,总结出

所以总结出以下结构体:

typedef struct

{                             //offerset

U16INT  Reserved1;               //0               一般为0x30

U16INT  WaitForCreditcard;           //0x02 等待信用卡音频信号时间,单位 ;秒

U16INT  WaitForConnect;       //0x04      这时间之内未建立连接,则取消拨号

U16INT  Reserved2;              //0x06    一般为0

UINT8    Flowcontrol;           // 0x08  串口参数:流控制,0 -- 无 0x20 软件  0x10 硬件

UINT8    Unknow1;              // 0x09    一般为1,暂时还不知它是什么作用

U16INT  Reserved3;              // 0x0a   = 00

U16INT  BaudRate;               //0x0c 串口波特率例如 19200

U16INT  Reserved4;              // 0x0e   =0

U16INT  Configbit2;     // 0x10  // 对应“设备属性”对话框中的“手动拨号(用户提供拨号串)”,如果为0x04 表示选上此项

UINT8    DataBit;             // 0x12  串口数据位 例如:8位

UINT8    StopBit;             // 0x13  停止位00- 1位,  02 - 2位

UINT8    ParityBit;           // 0x14  奇偶校验位00-无,01奇数,02偶数,03标记,04空格

UINT8    Reserved5;          // 0x15  i don't know it's function

TCHAR    AttachedCmd[210];  // 0X16  从这开始是附加解调器命令,例如"+CGDCON=1,IP,COMNET"

//注意:本人使用的是wince6.0,所以这个长度为436byte,其它平台可能会不一样,网上有牛人测出WM的是一百多的

}RASlpdInfo;

用这个结构在AttachedCmd中填入附加拨号命令,就可以了

DWORD dwSize,

dwError;

TCHAR szError[100];

RASlpdInfo lpb;

unsigned long lpbSize = sizeof(RASlpdInfo);

memset(&lpb,0,lpbSize);

RASENTRY RasEntry;

dwSize = sizeof (RASENTRY);

memset (&RasEntry, 0, dwSize);

RasEntry.dwSize = dwSize;

wcscpy(RasEntry.szDeviceName,L"CDMAModem");

wcscpy(RasEntry.szDeviceType,L"modem");                 //#define RASDT_Modem         TEXT("modem")     // Ras.h

RasEntry.dwCountryCode = 86; //国家代码

wcscpy(RasEntry.szAreaCode,L"10");

TCHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1] = {0};

wsprintf(szLocalPhoneNumber,L"%s",LocNum);  //-------------------容易出问题的地方

wcscpy(RasEntry.szLocalPhoneNumber,szLocalPhoneNumber );

RasEntry.dwfOptions= 4194304;//RASEO_ProhibitEAP|RASEO_RemoteDefaultGateway;  ;//4194304;0x00400208;//

RasEntry.dwfNetProtocols= RASNP_Ip;//4; Negotiate TCP/IP

RasEntry.dwFramingProtocol= RASFP_Ppp;//1; // Point-to-Point Protocol (PPP)

lpb.Reserved1 = 0x30;

lpb.WaitForCreditcard = 0;

lpb.WaitForConnect =120;

lpb.Reserved2 = 0;

lpb.Flowcontrol = 0;

lpb.Unknow1 = 1;

lpb.Reserved3 = 0;

lpb.BaudRate = 19200;

lpb.Reserved4 = 0;

lpb.Configbit2 = 0;

lpb.DataBit = 8;

lpb.StopBit = 0;

lpb.ParityBit = 0;

TCHAR szATComd[420] = {0};

wsprintf(szATComd,L"+CGDCONT=1,$IP$,$%s$",lpszAPN);

szATComd[11] = 0x22; // 双引号"

szATComd[14] = 0x22;

szATComd[16] = 0x22;

szATComd[22] = 0x22;

wcscpy(lpb.AttachedCmd,szATComd);

if (dwError = RasSetEntryProperties (NULL, lpszName,

&RasEntry, sizeof (RASENTRY),(LPBYTE)(&lpb), lpbSize))

{

wsprintf (szError, TEXT("Unable to create the phonebook entry.")

TEXT(" Error %ld"), dwError);

return FALSE;

}

注意,WINCE6.0调用了RasSetEntryProperties()之后,就可以在控制面板的连接管理里看到这个连接图标了,但是,如果是在WM系统,那就得再做下面的工作才能看得到图标。

机器中控制面板的”管理现有连接“对应注册表中

HKEY_LOCAL_MACHINE//Comm//ConnMgr//Providers//{7C4B7A38-5FF7-4bc1-80F6-5DA7870BB1AA}//Connections

[Connections]下的集合;

[Enabled]:      是否为默认连接;

[RequirePW]  是否需要用户名与密码

[DestId]:      表示属于哪种类型的连接;

[ConnectionGUID]:表示连接的标识ID,

拔号时获得当前状态

如果想在拔号时获得当前状态,可以这样:

拦截PreTranslateMessage这个消息事件,截获WM_RASDIALEVENT消息即可达到目的

BOOL CMy3GControlerDlg::PreTranslateMessage(MSG* pMsg)

{

if(pMsg->message == WM_RASDIALEVENT)

{

switch(pMsg->wParam)

{

case   RASCS_OpenPort:

pShowstate->SetWindowTextW(_T("打开端口…"));

break;

case   RASCS_PortOpened:

pShowstate->SetWindowTextW(_T("端口已打开…"));

break;

case   RASCS_ConnectDevice:

break;

case   RASCS_DeviceConnected:

pShowstate->SetWindowTextW(_T("设备已连接…"));

break;

case   RASCS_Authenticate:

pShowstate->SetWindowTextW(_T("验证用户及密码…"));

break;

case   RASCS_Authenticated:

pShowstate->SetWindowTextW(_T("用户及密码已通过验证"));

break;

case   RASCS_Connected:

pShowstate->SetWindowTextW(_T("已连接"));

break;

case   RASCS_Disconnected:

pShowstate->SetWindowTextW(_T("断开连接"));

break;

default:

return   (LRESULT)0;

}

}

return CDialog::PreTranslateMessage(pMsg);

}

RAS拨号的同步和异步问题

dwRet = RasDial(NULL,NULL,&rdParams,0L,NULL,&m_hRasConn);//同步
 dwRet = RasDial(NULL,NULL,&rdParams,0L,RasDialFunc,&m_hRasConn);//异步回调 --只支持在PC
 dwRet = RasDial(NULL,NULL,&rdParams,0xFFFFFFFF,this->m_hWnd,&m_hRasConn); //异步消息--支持PC、CE

如果同步,可用线程监视同步过程,

异步:只在使用了PreTranslateMessage才成功

所以,在CE系统里,要实现连接状态显示,那就得使用

dwRet = RasDial(NULL,NULL,&rdParams,0xFFFFFFFF,this->m_hWnd,&m_hRasConn);

拨号连接

void DialRAS(LPVOID Hahandle,LPWSTR ConnectionName,LPWSTR PhoneNumber)

{

RASDIALPARAMS RasDialParams;

BOOL                   fPassword;

memset (&RasDialParams, 0, sizeof (RASDIALPARAMS));

RasDialParams.dwSize  = sizeof(RASDIALPARAMS);

wcscpy(RasDialParams.szEntryName,ConnectionName);  //已建连接的名字

TCHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1] = {0};

wsprintf(szLocalPhoneNumber,L"%s",PhoneNumber);

wcscpy(RasDialParams.szPhoneNumber,szLocalPhoneNumber);

wcscpy(RasDialParams.szCallbackNumber, _T(""));

wcscpy(RasDialParams.szUserName, _T(""));

wcscpy(RasDialParams.szPassword, _T(""));

wcscpy(RasDialParams.szDomain, _T(""));

CMy3GControlerDlg* hthisp =(CMy3GControlerDlg*)Hahandle;

DWORD hRasRet = 0;

// Try to establish RAS connection.

hRasRet = RasDial (NULL,            // Extension not supported

NULL,            // Phone book is in registry

&RasDialParams,  // RAS configuration for connection

0xFFFFFFFF,      // Notifier type is a window handle

hthisp->m_hWnd,  // Window receives notification message

&hRscon);

printf("hRasRet == %d ", hRasRet);

if ( hRasRet != 0) // Connection handle

{

printf("Could not connect using RAS, error == %d ", GetLastError());

}

}

WINCE+6410 拨号上网相关推荐

  1. 3G模块在WinCE系统上拨号上网配置过程描述

    DTM6211使用Wince下默认的unimodem稍加修改即可实现拨号上网. 一. 内核添加   图1 二. 注册表修改   图2 大唐的DTM6211的一些地方与unimodem的默认注册表配置不 ...

  2. 如何实现GPRS 拨号上网?

    我参照别人成功的文档配置,但是不能连接,不知道怎么回事,说端口被占用了. 我和下面文档不同的是我的使用了硬件流控制,请做过的说说 .GPRS 拨号上网实现要什么条件 http://download.c ...

  3. linux网卡设置adsl上网,Linux下设置ADSL自动拨号上网

    前段时间下载了红帽的linux,版本为redhat 9.0,整整刻了三张CD.最初是为了体验一下linux下QQ聊天软件的功能,最后因内核太低(官方推荐内核在2.6以上,我下载的版本是2.4)而告终. ...

  4. Ubuntu 12.10 拨号上网及停用方法

    2019独角兽企业重金招聘Python工程师标准>>> 本人电脑在设置了拨号上网过后,本来原先插上网线就能上网,现在反而不能上了,在网上找了些办法,再进行了些修改,最后成功了,现在把 ...

  5. linux中的pppoe拨号上网

    实例:(linux中的pppoe拨号上网) ① 安装软件:把下载的pppoe传到linux下的/root目录下,在终端对软件进行拆包: ll:查看目录,能看见软件包的名字 tar -zxvf rp-p ...

  6. 一台物理机上VMware虚拟机实现拨号上网同时内网通信

    一台物理机上VMware虚拟机实现拨号上网同时内网通信 前言:数据走向就是底下的图,看起来是不是很简单很easy 一:准备在VMware vSphere Client上面准备两台windows2003 ...

  7. 如何建立拨号上网连接

    建立拨号上网连接是上网的第一步骤,如何正确地设置拨号连接是您能否上网的前提,下面将向你介绍建立拨号连接的方法. 一.    WindowsXP/2003操作系统:     如果你使用的是Windows ...

  8. 关于Ubuntu 使用PPPoe拨号上网,导致wifi没有错误。

    因为宿舍网是拨号上网, 刚从 温都死 转向Ubuntu(LINUX桌面版)基本上陌生的操作环境,所以百度一下 Ubuntu怎么拨号上网. gedit pppoeconfig  终端输入,就可以操作配置 ...

  9. PPPOE拨号上网流程及密码窃取具体实现

    楼主学生党一枚,最近研究netkeeper有些许心得. 关于netkeeper是调用windows的rasdial来进行上网的东西,网上已经有一大堆,我就不赘述了. 本文主要讲解rasdial的部分核 ...

最新文章

  1. SAP PM 初级系列22 - IW38可以批量处理维修工单
  2. BCH收银APP已在Android系统上下载超10000次
  3. Python编程之计算生态
  4. linux内核网络协议栈--linux协议栈调用流程(七)
  5. linux落字效果代码,Shell中实现飞行文字效果
  6. SpringBoot实现注册时头像上传与下载
  7. scala入门-01-IDEA安装scala插件
  8. ISA Server服务器故障恢复一例系统盘符更换之后的应对方法
  9. Android 串口开发——粘包解决方法,定时查询心跳数据,解析心跳数据。——持续更新中
  10. 用生动的例子花式解释:python类中一定需要有 __init__方法么?没有会怎样?
  11. 信息学奥赛一本通 2065:【例2.2】整数的和
  12. Android 屏幕适配攻略(六)设置通知样图标与启动图标适配
  13. js判断数据类型(如数组)及数组操作函数
  14. HDU_2082 找单词 (生成函数)
  15. My eclipse和Eclipse平台 JSP可视化编程工具
  16. 解决使用CSDN下载东西时,点击直接下载没有反应的问题
  17. 我的未来作文计算机行业,我的未来职业畅想作文
  18. Unity3d+Gameframework:entity实体代码分析,基于StarForce
  19. Java面向可复用性和可维护性的设计模式
  20. Python3 - k8s之深入理解 Pod

热门文章

  1. Android Activity的启动模式及对生命周期的影响
  2. golang 切片 接口_Golang简单入门教程——函数进阶使用
  3. 50个直击灵魂的问题_直击保险人灵魂的五个问题,你怎么回答?
  4. 030_vue命名路由
  5. python在通信中的应用_基于Redis的进程间通信——在C++里使用python的深度学习模型...
  6. android apk签名工具_Android 应用修改为系统签名的方法(macOS)
  7. Android开发常用第三方平台
  8. Linux常用系统备份、恢复命令
  9. Premiere Pro CS4软件安装教程
  10. Premiere Pro CC2019安装资料及安装教程