如何通过 WinCE 访问 WAP 数据
来源:互联网 发布:冒险岛cms是什么意思 编辑:程序博客网 时间:2024/06/06 09:44
WAP 的访问需要通过 Wireless Datagram Protocol (WDP) 协议来实现。前提是 WinCE OS 在定制时需要选择 WAP 相应的组件,否则在使用相应的 SDK 编译时,对应的 WAP 功能函数无法编译通过。
因前公司项目需要,写了如下的代码。但未经过测试(项目所需功能确认无法通过 WAP 实现),也未提供此部分代码给公司,所以在网上放出来供大家参考。
以下是在 WinCE6.0 下,使用 VS2008 开发环境的示例代码:
// WapTestDlg.cpp : 实现文件// #include "stdafx.h"#include "WapTest.h"#include "WapTestDlg.h"#include "wap.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// http://technet.microsoft.com/zh-cn/windows/ee497490(en-us).aspx// http://msdn.microsoft.com/zh-cn/library/ee497490(v=WinEmbedded.60)// Use UDP bearer if bUDP = true, use SMS bearer if bUDP = false;bool WdpSendAndReadEcho( bool bUDP ) {bool bSendReadOK = false;HRESULT hResult;// Open WAP for Sending WDP UnitDataconst WAP_LAYER wlLayer = WAP_LAYER_WDP;const DWORD dwSendPort = 3000L;WAP_HANDLE hWapSend = 0L;HANDLE hWapSendMsgEvent= NULL;// Open WAP for reading WDP UnitDataconst DWORD dwRecvPort = 3001L;WAP_HANDLE hWapRecv= 0L;HANDLE hWapRecvMsgEvent = NULL;// Create WDP UnitData structure with user dataWAP_ADDRESS waSendRecv;const TCHAR *const tszIpLoopbackAddr = _T("127.0.0.1");// For UDP bearerconst TCHAR *const tszTelNum = _T("8009352663"); // Sample Phone number, used for SMS bearerWDP_UNITDATA Wdpunitdata;DWORD dwWdpRecvDataSize = 0L;WDP_UNITDATA *pcbWdpRecvData = NULL;// Use temporary buffer because pbUserData is const BYTE * BYTE *pbBuffer = NULL;hResult = WapOpen( wlLayer, dwSendPort, &hWapSend, &hWapSendMsgEvent );if ( FAILED(hResult) || !hWapSend || !hWapSendMsgEvent ) {OutputDebugString( _T("WapOpen() for sending WDP UnitData failed") );hWapSend = 0L;hWapSendMsgEvent= NULL;return false;}hResult = WapOpen( wlLayer, dwRecvPort, &hWapRecv, &hWapRecvMsgEvent );if ( FAILED(hResult) || !hWapRecv || !hWapRecvMsgEvent ) {OutputDebugString( _T("WapOpen() for reading WDP UnitData failed") );hWapRecv= 0L;goto exit_label;}if(bUDP){_tcsncpy( waSendRecv.ptsAddress, tszIpLoopbackAddr, MAX_WAP_ADDRESS_LENGTH );}else{_tcsncpy( waSendRecv.ptsAddress, tszTelNum, MAX_WAP_ADDRESS_LENGTH);}waSendRecv.watAddressType = bUDP ? WAP_ADDRESS_TYPE_UDP : WAP_ADDRESS_TYPE_GSM_SMS;// Initialize the WDP UnitDatamemset( &Wdpunitdata, 0, sizeof(Wdpunitdata) );Wdpunitdata.wpiPrimitiveID = WAP_PRIMITIVE_ID_T_DUNITDATA;Wdpunitdata.wptPrimitiveType = WAP_PRIMITIVE_TYPE_REQUEST;Wdpunitdata.dwValidFields = (WDP_FIELD_SOURCEADDRESS |WDP_FIELD_SOURCEPORT |WDP_FIELD_DESTINATIONADDRESS |WDP_FIELD_DESTINATIONPORT |WDP_FIELD_USERDATA );Wdpunitdata.waSourceAddress = waSendRecv;Wdpunitdata.dwSourcePort = dwSendPort;Wdpunitdata.waDestinationAddress = Wdpunitdata.waSourceAddress;Wdpunitdata.dwDestinationPort = dwRecvPort;// Set Random user data with size = 0x100Wdpunitdata.dwUserDataSize = 0x100;if(pbBuffer = new BYTE[Wdpunitdata.dwUserDataSize]){// Fill the user data section with random datafor ( DWORD dw = 0; dw < Wdpunitdata.dwUserDataSize; dw++ ) {pbBuffer[ dw ] = rand() % 0xFF;}} else {goto exit_label;}Wdpunitdata.pbUserData = pbBuffer;// Send WDP DatahResult = WapSend( hWapSend, (WAP_PRIMITIVE_BASE *)&Wdpunitdata );if ( FAILED(hResult) ) {OutputDebugString( _T("WapSend() with WDP Unitdata failed") );goto exit_label;}// Wait for WAP message received Eventif ( WAIT_OBJECT_0 != WaitForSingleObject( hWapRecvMsgEvent , 10000L )){OutputDebugString( _T("Failed to wait for or timed out waiting for expected WDP Data") );goto exit_label;}hResult = WapGetNextPrimitiveSize( hWapRecv, &dwWdpRecvDataSize);if ( FAILED(hResult) || (0 == dwWdpRecvDataSize) ) {OutputDebugString( _T("WapGetNextPrimitiveSize() failed") );goto exit_label;}// Allocate memory for storing received WDP DatapcbWdpRecvData =( WDP_UNITDATA* ) new BYTE[ dwWdpRecvDataSize ];if ( !pcbWdpRecvData) {OutputDebugString( _T("Failed to allocate memory for storing WDP Unit Data") );goto exit_label;}// Read WDP DatahResult = WapRead( hWapRecv, (WAP_PRIMITIVE_BASE *)pcbWdpRecvData, dwWdpRecvDataSize );if ( FAILED(hResult) ) {OutputDebugString( _T("WapRead() failed") );goto exit_label;}// Validate the received primitive and// Compare the received user data to the sent user dataif (!pcbWdpRecvData)goto exit_label;bSendReadOK = true;bSendReadOK &= (WAP_PRIMITIVE_ID_T_DUNITDATA == pcbWdpRecvData->wpiPrimitiveID);bSendReadOK &= (WAP_PRIMITIVE_TYPE_INDICATION == pcbWdpRecvData->wptPrimitiveType);bSendReadOK &= (pcbWdpRecvData->dwValidFields & WDP_FIELD_SOURCEADDRESS ) && ( pcbWdpRecvData->dwValidFields & WDP_FIELD_SOURCEPORT );bSendReadOK &= (pcbWdpRecvData->dwUserDataSize == Wdpunitdata.dwUserDataSize);if(bSendReadOK && pcbWdpRecvData->pbUserData){bSendReadOK &= !memcmp(pcbWdpRecvData->pbUserData, Wdpunitdata.pbUserData, pcbWdpRecvData->dwUserDataSize);}exit_label:// Close WAP for Sending WDP UnitDataif ( hWapSend) {hResult = WapClose( hWapSend );if ( FAILED(hResult) ) {OutputDebugString( _T("WapClose() for sending WDP UnitData failed") );bSendReadOK = false;} else {hWapSend = 0L;}}// Close WAP for Receiving WDP UnitDataif ( hWapRecv ) {hResult = WapClose( hWapRecv );if ( FAILED(hResult) ) {OutputDebugString( _T("WapClose() for reading WDP UnitData failed") );bSendReadOK = false;} else {hWapRecv = 0L;}}// Clear the buffersif (pbBuffer) {delete[] (BYTE*) pbBuffer;pbBuffer = NULL;}if ( pcbWdpRecvData ) {delete [] (BYTE*) pcbWdpRecvData;pcbWdpRecvData = NULL;}return bSendReadOK;}// CWapTestDlg 对话框CWapTestDlg::CWapTestDlg(CWnd* pParent /*=NULL*/): CDialog(CWapTestDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CWapTestDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CWapTestDlg, CDialog)#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)ON_WM_SIZE()#endif//}}AFX_MSG_MAPEND_MESSAGE_MAP()// CWapTestDlg 消息处理程序BOOL CWapTestDlg::OnInitDialog(){CDialog::OnInitDialog();// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码WdpSendAndReadEcho(true);return TRUE; // 除非将焦点设置到控件,否则返回 TRUE}
0 0
- 如何通过 WinCE 访问 WAP 数据
- php如何判断用户通过手机wap访问还是电脑直接访问
- php如何判断用户通过手机wap访问还是电脑直接访问
- 如何通过配置apache,让Wap主域名URL访问到子域名服务
- wince 如何访问物理地址
- WINCE设备连接到PC后如何通过WIFI访问数据库服务器
- 如何判断是wap访问还是www访问
- 程序中通过wap联网方式访问网络
- FORM中,如何通过 ODBC 访问 Acress 数据?
- 如何通过CMPP短信网关下发WAP PUSH
- Php判断用户通过手机访问wap还是电脑直接访问
- 通过JDBC访问数据 实例
- 通过指针访问矩阵数据
- 如何使您的WEB服务器支持WAP数据发送?
- 恢复出厂设置时如何恢复WAP相关数据
- firefox访问WAP
- ecshop如何不用做wap模板,手机访问和电脑访问界面一致
- ecshop如何不用做wap模板,手机访问和电脑访问界面一致
- objectForKey与valueForKey在NSDictionary中的差异
- Android 如何把状态栏信号格改为5格
- FTP应答码&响应码
- leetcode: Reverse Integer
- Android Fragment完全解析,关于碎片你所需知道的一切
- 如何通过 WinCE 访问 WAP 数据
- .net 在ueditor修改编辑已有信息后提交 获取ueditor内容为null - 让人头疼的form 与 table
- String s=new String("abc")创建了几个对象?
- Visio 2013 Professional简体中文批量授权版一键激活
- 关于c#中的预编译指令-#define、#if——&&——mono touch,去掉sdk7下uitable的行线左侧余留空白
- 体验时间“类”
- .NET Framework详解之内存机制
- Crontab定时任务
- android背景選擇器selector