电信cdma卡自动拨号
默认帐号与密码均为card
使用的接入点的名称设定为GPRS
evc4.0/wince5.0升级版
法一:使用cdma模块厂家提供的at使用说明,用at指令完成ppp拨号。
以华为的em200为例:
// 先询问一下当前网络的状态(这不是必须的也不是最重要的)
at+cpin?
/// 回应:
+CPIN:READY
OK
at+csq?
/// 回应:
+CSQ:22,99 // 值是不定的
OK
// 现开始建立PPP连接(这里是最重要的,也是必须的)
at%accnt=card,card
// 回应:
OK
at%pppopen
// 回应
%CORG:#777,1
%CCNT:1
%PPPOPEN:0 // 0表示成功,1表示失败
%PPPSTATUS:0 // 0表示连接上,1表示断开
OK
// 无线上网很可能中途断开的,所以很可能需要查询连接状态以采取行动
// 查询ppp拨号连接状态
at%pppstatus
// 回应:
%PPPSTATUS:0 // 0表示连接,1表示断开
OK
法二:使用ras函数来完成拨号。
注:以下代码思路有一个问题:如果检测到网络已经连接上了,而我又想把它断开,如何做到?因为连接不是程序创建的,所以
不知道它的句柄,所以这里的程序也没法把它hung up。如果连接是程序建立的,那自然可以断掉。
/// 说明:代码抄袭于网上
// 连接
#define MAX_NUM_RAS 20
BOOL RasConnect()
{
LPRASENTRYNAME lprasentryname;
DWORD cb, cEntries, nRet, i;
BOOL bPassword;
RASDIALPARAMS RasDialParams;
RASPPPIP rip;
lprasentryname = (LPRASENTRYNAME)LocalAlloc(LPTR, sizeof(RASENTRYNAME) * MAX_NUM_RAS);
if( !lprasentryname )
{
DETRACE("内存不足");
return FALSE;
}
lprasentryname[0].dwSize = sizeof(RASENTRYNAME);
cb = sizeof (RASENTRYNAME) * MAX_NUM_RAS;
// 枚举连接入口
nRet = RasEnumEntries(NULL, NULL, lprasentryname, &cb, &cEntries);
if (nRet)
{
if(nRet == ERROR_BUFFER_TOO_SMALL)
{ // 申请的空间小于实际需要的空间
LocalFree(lprasentryname);
lprasentryname = (LPRASENTRYNAME)LocalAlloc(LPTR, cb); //重新申请空间
if( !lprasentryname )
{
DETRACE("内存空间不足");
return FALSE;
}
lprasentryname->dwSize = sizeof(RASENTRYNAME); //只设置首个结构的字节大小
// 重新枚举
nRet = RasEnumEntries(NULL, NULL, lprasentryname, &cb, &cEntries);
if (nRet)
{
DETRACE("重新枚举接入点失败");
LocalFree(lprasentryname);
return FALSE;
}
}
else
{
DETRACE("枚举接入点失败");
LocalFree(lprasentryname);
return FALSE;
}
}
for(i = 0; i < cEntries; i ++)
{
if( !wcscmp(lprasentryname[i].szEntryName, _T("GPRS")) ) //寻找GPRS作为拨号连接
{
// 初始化RasDialParams
ZeroMemory(&RasDialParams, sizeof(RasDialParams));
RasDialParams.dwSize = sizeof(RasDialParams);
// 取得接入点(GPRS)的资料
_tcscpy(RasDialParams.szEntryName, lprasentryname[i].szEntryName);
nRet = RasGetEntryDialParams(NULL, &RasDialParams, &bPassword);
if( nRet )
{
DETRACE("获取接入点参数失败");
LocalFree(lprasentryname);
return FALSE;
}
_tcscpy(RasDialParams.szUserName, _T("card")); //默认的cdma拨号用户名
_tcscpy(RasDialParams.szPassword, _T("card")); //默认的cdma拨号密码
//建立客户端到服务器的Ras连接
nRet = RasDial(NULL, NULL, &RasDialParams, 0, NULL, &m_hRasConn);
if( nRet )
{
DETRACE("拨号失败");
m_hRasConn = NULL;
LocalFree(lprasentryname);
return FALSE;
}
}
}
LocalFree(lprasentryname);
return TRUE;
}
以上连接大概思路是:枚举出所有已经手工(或厂家程序)创建的接入点,然后找GPRS这一特定的接入点作为连接,取出它的信
息,用rasdial来拨号。(如果只为找GPRS接入点,显然上面的代码是可以优化的)
// 断网
BOOL RasDisConnect()
{
DWORD dwRet;
if(m_hRasConn)
{
dwRet= RasHangUp(m_hRasConn);
DETRACE("已经断网");
m_hRasConn = NULL;
}
return TRUE;
}
以上显然要知道m_hRasConn才可以断网,如果你不知道呢?
// 检测网络状态
// 0 -- 连接上
// 1 -- 断开
int ConnectStatus()
{
RASCONNSTATUS * lpRasConnStatus = (RASCONNSTATUS *)GlobalAlloc(GPTR, sizeof(RASCONNSTATUS));
if (lpRasConnStatus)
{
lpRasConnStatus->dwSize = sizeof(RASCONNSTATUS);
RasGetConnectStatus(g_snMain.m_hRasConn, lpRasConnStatus);
int ret = (lpRasConnStatus->rasconnstate == RASCS_Connected ? 0 : 1 );
return ret;
}
else
{
DETRACE("内存空间不足");
return -1;
}
GlobalFree(lpRasConnStatus);
}