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

在 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;
}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

91program

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值