首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

能否提供一个SP手机连接GPRS访问网页的例子?[额外200分]解决方案

2012-02-20 
能否提供一个SP手机连接GPRS访问网页的例子?[额外200分]我的是dopod565,不过smartphone的手机应该都可以,

能否提供一个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
);

其它叁数照旧

热点排行