能否提供一个SP手机连接GPRS访问网页的例子?[额外200分]
我的是dopod565,不过smartphone的手机应该都可以,使用动感地带cmwap包月的GPRS。我有试过多种方法,始终无法实现GPRS拨号并打开一个网页的功能。当然,我用手机自带浏览器可以上网,开QQ也没问题,UCWEB使用正常,彩信可以收发,因此应该是我的程序的问题,可是找不到错在哪里,希望有人可以提供一个能够成功连接并打开网页的例子。使用EVC或者C#都可以。
下面简单介绍一下目前我使用的方法:
首先是为进行连接而定义的一个类
#include <windows.h>
#include <connmgr.h>
#include <aygshell.h>
class CConnectMgr
{
public:
CConnectMgr(HWND hwnd);
virtual ~CConnectMgr();
void DestroyConnection();
HRESULT EstablishConnection();
BOOL SetConectMsgEvent();
void SetConnectType(UINT);
UINTm_NetWorkType;//Network Type
UINTm_NetWorkCount;
HANDLEhConnection;//Connection handle
UINTWM_CMEVENT;//Registered Window Message
HWND m_ParentWnd;
BOOL m_isConnect;
};
CConnectMgr::CConnectMgr(HWND hwnd)
{
m_ParentWnd = hwnd;
hConnection = NULL;
WM_CMEVENT = 0;
m_NetWorkType = 0; // default 0 type;
m_isConnect = FALSE;
///*
FILE *pFile;
pFile= _wfopen(L "\\url.txt ", L "w " );
CONNMGR_DESTINATION_INFO DestInfo;
m_NetWorkCount=0;
for(int i = 0; SUCCEEDED(ConnMgrEnumDestinations(i, &DestInfo)); i++)
{
fputws(DestInfo.szDescription,pFile);
fputws(L "\r\n ",pFile);
m_NetWorkCount++;
/*
if(0==wcscmp(L "WAP 网络 ",DestInfo.szDescription))
{
m_NetWorkType=i;
break;
}
*/
}
fclose(pFile);
//*/
}
CConnectMgr::~CConnectMgr()
{
DestroyConnection();
}
void CConnectMgr::DestroyConnection()
{
if(NULL != hConnection)
{
ConnMgrReleaseConnection(hConnection, FALSE);
hConnection = NULL;
}
}
void CConnectMgr::SetConnectType(UINT type)
{
if(type < 0 )
type = 0;
m_NetWorkType = type;
}
HRESULT CConnectMgr::EstablishConnection()
{
HRESULT hResult = E_FAIL;
// 清除连接
DestroyConnection();
// 得到正确的连接信息
CONNMGR_DESTINATION_INFO DestInfo;
hResult = ConnMgrEnumDestinations(m_NetWorkType, &DestInfo);
if(SUCCEEDED(hResult))
{
// 初始化连接结构
CONNMGR_CONNECTIONINFO ConnInfo;
ZeroMemory(&ConnInfo, sizeof(ConnInfo));
ConnInfo.cbSize = sizeof(ConnInfo);
ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
ConnInfo.dwPriority = CONNMGR_PRIORITY_USERBACKGROUND;
ConnInfo.guidDestNet = DestInfo.guid;
ConnInfo.hWnd = m_ParentWnd;
ConnInfo.uMsg = WM_CMEVENT;
hResult = ConnMgrEstablishConnection(&ConnInfo, &hConnection);
if(FAILED(hResult))
{
}else
{
ConnMgrSetConnectionPriority(hConnection,CONNMGR_PRIORITY_USERINTERACTIVE);
}
}
return hResult;
}
BOOL CConnectMgr::SetConectMsgEvent()
{
if(!(WM_CMEVENT = RegisterWindowMessage(TEXT( "SNA Event "))))
{
return FALSE;
}
return TRUE;
}
然后是主程序,首先定义一个连接类的实例
CConnectMgr *g_pConnect = NULL;
然后是建立连接
if(g_pConnect-> m_NetWorkType> =g_pConnect-> m_NetWorkCount)
PostQuitMessage(0);
g_pConnect-> EstablishConnection();
进入消息处理:
default:
if(g_pConnect && msg == g_pConnect-> WM_CMEVENT)
{
switch(wp)
{
case CONNMGR_STATUS_DISCONNECTED:
SetWindowText(g_wndMsg,_T( "DISCONNECTED "));
break;
case CONNMGR_STATUS_WAITINGCONNECTION:
SetWindowText(g_wndMsg,_T( "WAITINGCONNECTION "));
break;
case CONNMGR_STATUS_WAITINGCONNECTIONABORT:
SetWindowText(g_wndMsg,_T( "WAITINGCONNECTIONABORT "));
break;
case CONNMGR_STATUS_WAITINGDISCONNECTION:
SetWindowText(g_wndMsg,_T( "WAITINGDISCONNECTION "));
break;
case CONNMGR_STATUS_CONNECTED:
{
SetWindowText(g_wndMsg,_T( "CONNECTED "));
FILE *pFile;
pFile= fopen( "\\url.txt ", "a " );
fprintf(pFile, "OK%d ",g_pConnect-> m_NetWorkType);
fclose(pFile);
g_pConnect-> m_isConnect=TRUE;
//SaveUrl(L "http://www.163.com ",L "\\test.txt ");
if(SaveUrl(L "http://www.163.comsp ",L "\\test.txt "))
SendMessage (hwnd, WM_CLOSE, 0, 0);
else
{
g_pConnect-> m_NetWorkType++;
SetTimer(hwnd,55,1000,HeartBeat);
}
}
break;
case CONNMGR_STATUS_CONNECTIONFAILED:
SetWindowText(g_wndMsg,_T( "CONNECTIONFAILED "));
g_pConnect-> DestroyConnection();
g_pConnect-> m_NetWorkType++;
SetTimer(hwnd,55,1000,HeartBeat);
break;
case CONNMGR_STATUS_NOPATHTODESTINATION:
SetWindowText(g_wndMsg,_T( "NOPATHTODESTINATION "));
g_pConnect-> DestroyConnection();
g_pConnect-> m_NetWorkType++;
SetTimer(hwnd,55,1000,HeartBeat);
break;
case CONNMGR_STATUS_CONNECTIONCANCELED:
SetWindowText(g_wndMsg,_T( "CONNECTIONCANCELED "));
g_pConnect-> DestroyConnection();
break;
default:
if(wp & CONNMGR_STATUS_DISCONNECTED)
{SetWindowText(g_wndMsg,_T( "default DISCONNECTED "));
g_pConnect-> DestroyConnection();
g_pConnect-> m_NetWorkType++;
SetTimer(hwnd,55,1000,HeartBeat);
}
break;
}
}
lResult = DefWindowProc(hwnd, msg, wp, lp);
break;
打开网页并保存的函数:
bool SaveUrl(LPCTSTR url, LPCTSTR filename)
{
bool ret=true;
HINTERNET hNet = ::InternetOpen(L "Outlook ",
PRE_CONFIG_INTERNET_ACCESS,
NULL,
INTERNET_INVALID_PORT_NUMBER,
0) ;
HINTERNET hUrlFile = ::InternetOpenUrl(hNet,
url,
NULL,
0,
INTERNET_FLAG_RELOAD,
0) ;
char buffer[10*1024] ;
DWORD dwBytesRead = 1;
BOOL bRead=TRUE;
FILE *pFile;
pFile= _wfopen(filename, L "a " );
if(NULL==hUrlFile)
{
fputs( "网络打开错误! ",pFile);
ret= false;
}
else
{
while(bRead&&dwBytesRead> 0)
{
bRead = ::InternetReadFile(hUrlFile,
buffer,
sizeof(buffer),
&dwBytesRead);
if(dwBytesRead> 0)
fwrite(buffer,dwBytesRead,1,pFile);
}
ret=true;
}
::InternetCloseHandle(hUrlFile) ;
::InternetCloseHandle(hNet) ;
fclose(pFile);
//AfxMessageBox( "finished ");
return ret;
}
如果需要,我可以提供整个项目,可以帮我解决问题的朋友最好可以把例子的整个项目发送到我的邮箱,我会额外开帖赠送200分数。因为经常在csdn提问没有回答,所以主帖分数不高,但是问题解决一定送分。
[解决办法]
关注,过两天有空了仔细研究下
因为我也在做类似的课题。
初步来看,应该是如doushi所说,没有指定代理的原因
至于UserAgent应该不是问题。因为它使用机身自带浏览器可以上网的。
建议这样排查调试:
使用ActiveSync建立PC和SP的网络连接,默认情况下:PC的IP地址为:169.254.2.2,Smartphone的IP地址为:169.254.2.1。
然后在PC机器上装一个Http服务器,比如MicroSvr,很小的也很简单,直接可以用。
看看能不能获取。
可以使用Ethereal抓包看一下UserAgent是什么。
可以加我的popo: lizhaozhuoxp
[解决办法]
如果你想通过wap直接访问HTTP的页面是办不到的,要在openurl的时候设置代理,代理的地址就是wap网关的地址。这个网关只实现了http代理和wap代理,而且不同地方这个网关的限制是不一样的,我在上海用这个代理可以直接访问到我公网的服务器。
[解决办法]
抱歉,上面程序中没有修改完变量命.正确如下:
2 在程序中指定代理的联网部分的程序,硬编码,任何中国移动用户支持GPRS的手机都可以用,其他运营商的估计不行(此处设置的代理是中国移动的GPRS服务器代理):
public HttpConnection openConnection(String urlStr) {
HttpConnection con = null;
try {
//设置中国移动的代理,所有手机都可以用,必须是中国移动用户,要访问的页面是
//如urlStr=http://news.163.com/07/0813/10/3LP53LDM000120GU.html
//去掉url中的 'http:// '字符
urlStr = urlStr.substring(7);
//取url即 'news.163.com '
String url = urlStr.substring(0, 12);
//取URI 即 '07/0813/10/3LP53LDM000120GU.html '
String uri = urlStr.substring(12);
//设置中国移动的wap代理80端口默认,可以不写,URI=后面的参数,即上面截取的字符串
con = (HttpConnection) Connector.open( "http://10.0.0.172:80 " + uri);
//设置服务器的url,即www.hahatoo.com,URL参数为要访问服务器的地址
con.setRequestProperty( "X-Online-Host ", url);
con.setRequestProperty( "Accept ", "*/* ");
} catch (Exception e) {
con = null;
}
return con;
}
[解决办法]
下面这段程序我在P800上可以连接GPRS并打开网页(测试过的)。
你可以参考下。
HANDLE hConection;
DWORD dwStatus;
CONNMGR_CONNECTIONINFO sConInfo;
memset(&sConInfo, 0 ,sizeof(CONNMGR_CONNECTIONINFO));
sConInfo.cbSize = sizeof(CONNMGR_CONNECTIONINFO);
sConInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
sConInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
sConInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP
|CONNMGR_FLAG_PROXY_WAP
|CONNMGR_FLAG_PROXY_SOCKS4
|CONNMGR_FLAG_PROXY_SOCKS5;
sConInfo.bExclusive = FALSE;
sConInfo.bDisabled = FALSE;
GUID IID_DestNetWAP = { 0x7022e968, 0x5a97, 0x4051, {0xbc, 0x1c, 0xc5, 0x78, 0xe2, 0xfb, 0xa5, 0xd9}};
sConInfo.guidDestNet = IID_DestNetWAP;
ConnMgrEstablishConnectionSync(&sConInfo, &hConection, 10000, &dwStatus);
TCHAR* pUrl = L "http://wap.sohu.com ";
SHELLEXECUTEINFO execInf;
ZeroMemory(&execInf, sizeof(execInf));
execInf.cbSize = sizeof(execInf);
execInf.fMask = SEE_MASK_NOCLOSEPROCESS;
execInf.lpFile = pUrl;
execInf.lpVerb = TEXT( "open ");
ShellExecuteEx(&execInf);
[解决办法]
查一下 InternetOpen函数,里面有个设代理的差数
HINTERNET WINAPI InternetOpen(
LPCTSTR lpszAgent,
DWORD dwAccessType, //填 INTERNET_OPEN_TYPE_PROXY
LPCTSTR lpszProxy, //直接 _T( "10.0.0.172:80 ") 或者用函数拿代理
LPCTSTR lpszProxyBypass,
DWORD dwFlags
);
其它叁数照旧