WINCE+6410 拨号上网
我们现在的模块用的是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系统里的控制面板下,进入“网络和拨号连接”,手动新建一个能拨通上网的连接,我命名为“
经过改不同的参数然后以上面的方法打出这个参数传回来的值,总结出
所以总结出以下结构体:
空格
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 拨号上网的更多相关文章
- 升级Ubuntu 16.04 LTS后 DSL拨号上网(ppp)连接自动断开解决办法
原本在Ubuntu 15.10用拨号上网没有问题,但升级了16.04 LTS后发现原来的DSL连接不上了.主要表现为: 1.在NetworkManager里面选择DSL Connection能够尝试拨 ...
- CentOS7 连网 拨号上网 PPoe网
CentOS7 连网 拨号上网 PPoe网 在安装之前,请确定是否安装 rp-pppoe-3.5.rmp 如果没有安装,请使用 --replacepkgs 先强制安装它 (CentOS-7 ...
- 利用ADSL拨号上网方式如何搭建服务器
序:搭建服务器需要两个条件硬件服务器和固定公网IP,随便一台个人电脑都可以作为硬件服务器,就剩下一个问题,如何获得一个固定公网IP. 第一章 扫盲:ADSL拨号上网方式,本地IP与公网IP的区别 一. ...
- Linux--fedora21 PC机安装以及拨号上网和无限上网
最近回家,学习许久未用的linux,之前也是在培训的时候用的是 ubuntu ,这次回家查了下 fedora 最适合开发人员使用,所以就装了个试试.刚开始只能拨号上网,经过三天时间的各种搜索查找终于解 ...
- 远程控制篇:在DELPHI程序中拨号上网
用MODEM拨号上网,仍是大多数个人网民选择上网的方式.如果能在我们的应用程序中启动拨号连接(如IE浏览器程序中的自动拨号功能),无疑将会方便我们的软件用户(不用再切换应用程序,运行拨号网络),提高我 ...
- 集群搭建:主机宽带拨号上网,虚拟机使用桥接模式,该如何ping通外网
首先介绍一下看这篇文章需要的基础.需要了解虚拟机的 虚拟机的三种网络模式,有Linux基础知识,这些都是前提.首先介绍一下我的环境:主机:win7虚拟机:VMware Workstation 10虚拟 ...
- android移植pppoe拨号上网的全过程
硬件环境:Tiny6410开发板 软件环境:fedora14 + Android 2.3.4 + linux-2.6.36 所需资源:rp-pppoe-3.11.tar.gz http://www.r ...
- Ubuntu ADSL拨号上网
一直在家用接ADSL的无线wifi上网,最近用了很久的NetGear无线路由器被我毁了,只好暂时用有线了.在Ubuntu Linux下也可直接使用ADSL拨号上网. 1.连接设备 这没什么可多说的,一 ...
- PPPOE拨号上网流程及密码窃取具体实现
楼主学生党一枚,最近研究netkeeper有些许心得. 关于netkeeper是调用windows的rasdial来进行上网的东西,网上已经有一大堆,我就不赘述了. 本文主要讲解rasdial的部分核 ...
随机推荐
- shp图层创建
IField,IFieldEdit,IFields,IFieldsEdit,IGeometryDef,IGeometryDefEdit接口 (2013-05-06 20:40:27) 转载▼ 标签: ...
- paper 82:边缘检测的各种微分算子比较(Sobel,Robert,Prewitt,Laplacian,Canny)
不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像.需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界 ...
- Easyui主从表设计
js代码: // 全局变量 var loading; var grid; var mainGrid; var dlg_Edit; var dlg_Edit_form; var virpath = &q ...
- Java -verbose:gc 命令
Java -verbose:gc 中参数-verbose:gc 表示输出虚拟机中GC的详细情况. [Full GC 168K->97K(1984K), 0.0253873 secs] 解读如 ...
- DMA-330(二)
DMA内部的block diagram: DMAC包含一个instruction processing block,来process program code,control DMA transfer ...
- PAT乙级 1026. 程序运行时间(15)
1026. 程序运行时间(15) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 要获得一个C语言程序的运行时间, ...
- centos的用户管理相关命令所在的包
用户管理命令是指:useradd userdel groupadd groupdel 这些 这些命令出自一个叫 shadow-utils 的包. 对于配置文件 /etc/shadow ,则来自一个叫 ...
- NOIP200503采药
NOIP200503采药 [问题描述] 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质, ...
- OpenStack collectd的从零安装客户端
1.查看是否需要增加yum 源 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@node-12 ~]# yum search collectd Loaded plugin ...
- Intel Edison
起步: https://software.intel.com/zh-cn/node/628224 刷机: https://software.intel.com/zh-cn/flashing-firmw ...