您的位置:首页 > 其它

WinCE 下 RAS 拨号连接的建立和拨号过程

2016-02-22 10:00 239 查看
在 CE 下如果系统没有建立拨号网络,要实现上网功能时,就需要通过代码来实现建立拨号网络、拨号实现上网的过程。

以下代码中的参数和拨号所用数值,都是电信 EVDO 的配置。如果换 GSM 或 WCDMA 时,请相应修改。

HRASCONN ghRasConn = NULL;
/*
* 设置串口波特率和数据位等
*/
BOOL CTCPClientDlg::SetDevCfg(TCHAR *ptcRasEntryName)
{
HKEY hk;
unsigned char cDevCfg[684];
TCHAR tcRegAddr[512 + 1];
DWORD *pdwEapConnData = NULL;

ZeroMemory(tcRegAddr,sizeof(TCHAR) * (512 + 1));
ZeroMemory(cDevCfg,sizeof(char) * 683);
cDevCfg[0] = 0x30;
cDevCfg[4] = 0x05;
cDevCfg[9] = 0x01;
cDevCfg[13] = 0xC2;     // 波特率
cDevCfg[14] = 0x01;
cDevCfg[18] = 0x08;     // 数据位

wsprintf(tcRegAddr,L"Comm\\RasBook\\%s",ptcRasEntryName);

if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER,tcRegAddr,0,0,&hk))
{
RegSetValueEx(hk,L"DevCfg",0,REG_BINARY,(LPBYTE)cDevCfg,sizeof(cDevCfg));
RegSetValueEx(hk,L"EapConnData",0,REG_BINARY,(LPBYTE)pdwEapConnData,0);
RegFlushKey(HKEY_CURRENT_USER);

RegCloseKey(hk);

return TRUE;
}
return FALSE;
}

BOOL CTCPClientDlg::CreateRASLink(TCHAR *ptcRasEntryName,TCHAR *ptcModemName)
{
LPRASENTRY lpRasEntry = NULL;
DWORD dwRasEntrySize = sizeof(RASENTRY);
DWORD dwBufferSize = 0;
DWORD dwRet = 0;
BOOL bRet = TRUE;

if(NULL == ptcRasEntryName || NULL == ptcModemName)
return FALSE;

RasGetEntryProperties(NULL,L"",NULL,&dwBufferSize,NULL,NULL);
if(0 == dwBufferSize)
return FALSE;

lpRasEntry = (LPRASENTRY)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwBufferSize);
if(NULL == lpRasEntry)
return FALSE;

ZeroMemory(lpRasEntry,sizeof(RASENTRY));
lpRasEntry->dwSize = dwBufferSize;
lpRasEntry->dwfOptions = RASEO_RemoteDefaultGateway;     // RASEO_PreviewUserPw 弹出用户名和密码输入框
// Leo lpRasEntry->dwType = RASET_Phone;
// lpRasEntry->dwCountryID = 86; // This member is currently ignored by Windows CE.
lpRasEntry->dwCountryCode = 86;
lstrcpy(lpRasEntry->szAreaCode,L"10");
lstrcpy(lpRasEntry->szLocalPhoneNumber,L"#777");

lstrcpy(lpRasEntry->szDeviceType,RASDT_Modem);
lstrcpy(lpRasEntry->szDeviceName,ptcModemName);      // 选用 Modem 的名字
lpRasEntry->dwfNetProtocols = RASNP_Ip;
lpRasEntry->dwFramingProtocol = RASFP_Ppp;

dwRet = RasSetEntryProperties(NULL,ptcRasEntryName,lpRasEntry,dwBufferSize,NULL,0);  //  创建连接
if(0 != dwRet)
{
bRet = FALSE;
}
HeapFree(GetProcessHeap(),0,(LPVOID)lpRasEntry);

return bRet;
}

BOOL CTCPClientDlg::NetworkDialAndParams(TCHAR *ptcRasEntryName)
{
DWORD dwRet = 0;
UINT i = 0;
RASDIALPARAMS rdParams;

ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));

rdParams.dwSize = sizeof(RASDIALPARAMS);
wcscpy(rdParams.szEntryName,ptcRasEntryName);
// wcscpy(rdParams.szPhoneNumber,L"#777");
wcscpy(rdParams.szUserName,L"card");
wcscpy(rdParams.szPassword,L"card");

ghRasConn = NULL;
dwRet = RasDial(NULL,NULL,&rdParams,0xFFFFFFFF,NULL,&ghRasConn);
if(0 != dwRet)
{
RETAILMSG(1,(L"RasDial Error: %d.\r\n",dwRet));
return FALSE;
}
return TRUE;
}


调用示例:

void CNetworkDialDlg::OnBtnClickedOpenNet()
{
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
m_NetName.EnableWindow(FALSE);

// TODO: Add your control notification handler code here
if(CreateRASLink(RASDIAL_NET_NAME,RASDIAL_NET_MODEM_NAME))
{
if(SetDevCfg(RASDIAL_NET_NAME))
{
if(NetworkDialAndParams(RASDIAL_NET_NAME,ghMainWnd))
{
RETAILMSG(1,(L"[TCP Client]Dial new work success.\r\n"));

SetTimer(RASDIAL_NETSHOW_TIMER_ID,RASDIAL_NETSHOW_TIME_OUT,NULL);
}
else
{
RETAILMSG(1,(L"[TCP Client]Dial new work failed!\r\n"));
}
}
else
{
RETAILMSG(1,(L"[TCP Client]Set RAS device config failed!\r\n"));
}
}
else
{
RETAILMSG(1,(L"[TCP Client]Create RAS link failed!\r\n"));
}
}

BOOL CNetworkDialDlg::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_RASDIALEVENT:
OnRasDialEvent(pMsg->wParam,pMsg->lParam);
break;
case WM_USER + 0x1000:
if(1 == pMsg->wParam)
{
GetDlgItem(IDC_STATIC_PING_STATUS)->SetWindowText(L"PING 状态: 成功");
}
else
{
GetDlgItem(IDC_STATIC_PING_STATUS)->SetWindowText(L"PING 状态: 失败");
}
break;
default:
break;
}

return CDialog::PreTranslateMessage(pMsg);
}

/*
[TCP Ras Event]1.RasState: Open port
[TCP Ras Event]2.RasState: Port opened
[TCP Ras Event]3.RasState: Device Connected
[TCP Ras Event]4.RasState: All Device Connected
[TCP Ras Event]5.Authenticating
[TCP Ras Event]9.RAS Other RasState:12
[TCP Ras Event]6.Authenticated, continue login...
[TCP Ras Event]7.RASCS_Connected received
*/
LRESULT CNetworkDialDlg::OnRasDialEvent(WPARAM wParam,LPARAM lParam)
{
RASCONNSTATE RasState = (RASCONNSTATE)wParam;
DWORD dwError = (DWORD)lParam;

gRasState = RasState;
switch(RasState)
{
case RASCS_OpenPort:
RETAILMSG(1,(L"[TCP Ras Event]1.RasState: Open port\r\n"));
break;

case RASCS_PortOpened:  // 端口已经打开
RETAILMSG(1,(L"[TCP Ras Event]2.RasState: Port opened\r\n"));
break;

case RASCS_DeviceConnected: // 正在连接
{
// dialDeviceConnected = TRUE;
RETAILMSG(1,(L"[TCP Ras Event]3.RasState: Device Connected\r\n"));
}
break;

case RASCS_AllDevicesConnected: //
// dialDeviceConnected = TRUE;
RETAILMSG(1,(L"[TCP Ras Event]4.RasState: All Device Connected\r\n"));
break;

case RASCS_Authenticate:
{
// dialDeviceConnected = TRUE;
RETAILMSG(1,(L"[TCP Ras Event]5.Authenticating\r\n"));
}
break;

case RASCS_Authenticated:
{
// dialDeviceConnected = TRUE;
RETAILMSG(1,(L"[TCP Ras Event]6.Authenticated, continue login...\r\n"));
}
break;

case RASCS_AuthNotify:
{
RETAILMSG(1,(L"[TCP Ras Event]RASCS_AuthNofify received,Error: %d\r\n",dwError));
switch(dwError)
{
case ERROR_RESTRICTED_LOGON_HOURS:
case ERROR_ACCT_DISABLED:
case ERROR_PASSWD_EXPIRED:
case ERROR_NO_DIALIN_PERMISSION:
case ERROR_CHANGING_PASSWORD:
default:
break;
}
}
break;

case RASCS_Connected:
{
RETAILMSG(1,(L"[TCP Ras Event]7.RASCS_Connected received\r\n"));
gbNetConnected = TRUE;
}
break;

case RASCS_Disconnected:
{
CString csError;
RETAILMSG(1,(L"[TCP Ras Event]8.RASCS_Disconnected received. Error: %d\r\n",dwError));

csError.Format(L"建立网络出现错误:%d",dwError);
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
m_NetName.EnableWindow(TRUE);
giRasDialTimerCount = 0;
GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(csError);
KillTimer(RASDIAL_NETSHOW_TIMER_ID);
}
break;

default:
RETAILMSG(1,(L"[TCP Ras Event]9.RAS Other RasState:%d\r\n", RasState));
break;
}

return TRUE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: