wince下Ras拨号

利用Ras系列函数再wince系统下进行GPRS拨号,经历了几次修改,但期间太懒没有进行总结,感觉不踏实,今决定回顾代码,能总结多少算多少,然后再慢慢完善此文。

1)首先,在wince控制面板创建一个拨号连接,把波特率、串口号、(APN、用户名、密码)等设置后确保能够拨号,然后将注册表信息导出后合成到定制wince系统。接下来就可以在这个系统上做对应的应用程序了。

2)检测是否存在设备名为pszDeviceName(如我用的是SIM300W模块,SIMCOM提供驱动,名为SIM300 MUX Modem),类型为modem的设备;

使用的API:需要调用两次RasEnumDevices来获取Devices列表,然后再比较DeviceName

示例代码:

 LPRASDEVINFO pRasDevInfo = NULL; DWORD cb = 0; DWORD dwDeviceCount = 0; DWORD dwRetVal = ::RasEnumDevices(NULL, &cb, &dwDeviceCount); if ((0 == dwRetVal||dwRetVal==ERROR_BUFFER_TOO_SMALL) && (0 != cb)) { *pRasDevInfo = reinterpret_cast<LPRASDEVINFO>(new BYTE[cb]); ASSERT(*pRasDevInfo); if (*pRasDevInfo) { (*pRasDevInfo)->dwSize = sizeof(RASDEVINFO); dwRetVal = ::RasEnumDevices(*pRasDevInfo, &cb, &dwDeviceCount); } else { dwDeviceCount = 0; } }

3)设置RASENTRY属性

使用的APIRasGetEntryProperties RasSetEntryProperties

先使用RasGetEntryProperties(需2次调用)获取默认的属性,然后根据具体的情况修改属性值(如:拨号号码)。

注:需要保存RasGetEntryProperties获取的lpbDeviceInfo,供后面使用(如保存为成员变量m_pDevConfig)。

4)设置APNCDMA拨号无需设置APN),我是从网上找的,具体的链接不记得了。

设置代码段如下:

 TCHAR szATCmd[80]={0}; _stprintf(szATCmd,_T("+CGDCONT=1,/"IP/",/"%s/""),pszAPN); PDEVMINICFG pDev=(PDEVMINICFG)m_pDevConfig; pDev->dwBaudRate=dwBauti; // 波特率 pDev->dwModemOptions&=~dwFlowControl ; // 硬件流控或软件流控 int dwDialOff=offsetof(DEVMINICFG,szDialModifier); #ifdef _WIN32_WCE memcpy(m_pDevConfig+dwDialOff,szATCmd, 80*sizeof(TCHAR)); #endif if (m_pszAPN) { delete []m_pszAPN; m_pszAPN = NULL; } m_pszAPN = new TCHAR[_tcslen(pszAPN)+1]; _tcscpy(m_pszAPN, pszAPN);

5)连网

使用的APIRasDial

分为同步连网和异步连网,一般都是选择异步。

先设置 RASDIALPARAMS rdParams;

同步连网: DWORD dwRet =  RasDial(NULL, NULL, &rdParams, 0, NULL, &m_hRasConn);

异步连网: DWORD dwRet = RasDial(NULL, NULL, &rdParams, 0xffffffff, m_hEventWnd, &m_hRasConn);   

RasDial返回值进行判断是否成功执行,如果不成功且m_hRasConn不为NULL,需要调用RasHangUp释放m_hRasConn

6)断网

使用的APIRasHangUp

调用RasHangUp后,最好是能够判断下是否释放完成。如:

#define MAX_HANGUP_RETRIES 50 void MyHangUp(LPHRASCONN phRasConn) { int i; RASCONNSTATUS RasConnStatus; RasConnStatus.dwSize = sizeof(RASCONNSTATUS); RasHangUp(*phRasConn); for (i = 0; i < MAX_HANGUP_RETRIES; i++) { if (ERROR_INVALID_HANDLE == RasGetConnectStatus(*phRasConn,&RasConnStatus)) break; Sleep(1000); } ASSERT ( i != MAX_HANGUP_RETRIES); *phRasConn = 0; }

7 获取当前活动连接的HRASCONN

使用APIRasEnumConnections

8 HRASCONN的释放

断网时必须得把此资源完全释放,否则会引起拨号不成功。这点在重连网络的时候要特别留意。

 

以上转自:http://blog.csdn.net/nolatestudy/archive/2011/04/22/6342392.aspx

 

另注:windows CE 5.0 PB目录$:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/NETSAMP/RASDIAL是个关于Ras异步拨号很好的例子。而$:/WINCE500/PRIVATE/WINCEOS/COMM/TCPIPW/IPNAT/AUTODIAL/autodial.c,则包含有同步和异步的例子。值得参考。

你可能感兴趣的:(windows,api,null,delete,buffer,WinCE)