• 如何通过 WinCE 访问 WAP 数据


    WAP 的访问需要通过 Wireless Datagram Protocol (WDP) 协议来实现。前提是 WinCE OS 在定制时需要选择 WAP 相应的组件,否则在使用相应的 SDK 编译时,对应的 WAP 功能函数无法编译通过。

    因前公司项目需要,写了如下的代码。但未经过测试(项目所需功能确认无法通过 WAP 实现),也未提供此部分代码给公司,所以在网上放出来供大家参考。

    以下是在 WinCE6.0 下,使用 VS2008 开发环境的示例代码:

      1 // WapTestDlg.cpp : 实现文件  
      2 //   
      3   
      4 #include "stdafx.h"  
      5 #include "WapTest.h"  
      6 #include "WapTestDlg.h"  
      7   
      8 #include "wap.h"  
      9   
     10 #ifdef _DEBUG  
     11 #define new DEBUG_NEW  
     12 #endif  
     13   
     14 // http://technet.microsoft.com/zh-cn/windows/ee497490(en-us).aspx  
     15 // http://msdn.microsoft.com/zh-cn/library/ee497490(v=WinEmbedded.60)  
     16 //  Use UDP bearer if bUDP = true, use SMS bearer if bUDP = false;  
     17 bool WdpSendAndReadEcho( bool bUDP )   
     18 {  
     19   
     20     bool bSendReadOK = false;  
     21   
     22     HRESULT hResult;  
     23   
     24     //  Open WAP for Sending WDP UnitData  
     25     const WAP_LAYER wlLayer = WAP_LAYER_WDP;  
     26     const DWORD dwSendPort = 3000L;  
     27     WAP_HANDLE hWapSend = 0L;  
     28     HANDLE hWapSendMsgEvent= NULL;  
     29   
     30     //  Open WAP for reading WDP UnitData  
     31     const DWORD dwRecvPort = 3001L;  
     32     WAP_HANDLE hWapRecv= 0L;  
     33     HANDLE hWapRecvMsgEvent = NULL;  
     34   
     35     //  Create WDP UnitData structure with user data  
     36     WAP_ADDRESS waSendRecv;  
     37     const TCHAR *const tszIpLoopbackAddr = _T("127.0.0.1");// For UDP bearer  
     38     const TCHAR *const tszTelNum = _T("8009352663");   // Sample Phone number, used for SMS bearer  
     39   
     40     WDP_UNITDATA Wdpunitdata;  
     41   
     42     DWORD dwWdpRecvDataSize = 0L;  
     43   
     44     WDP_UNITDATA *pcbWdpRecvData = NULL;  
     45   
     46     // Use temporary buffer because pbUserData is const BYTE *   
     47     BYTE *pbBuffer = NULL;  
     48   
     49     hResult = WapOpen( wlLayer, dwSendPort, &hWapSend, &hWapSendMsgEvent );  
     50     if ( FAILED(hResult) || !hWapSend || !hWapSendMsgEvent  )   
     51     {  
     52         OutputDebugString( _T("WapOpen() for sending WDP UnitData failed") );  
     53         hWapSend = 0L;  
     54         hWapSendMsgEvent= NULL;  
     55         return false;  
     56     }  
     57   
     58     hResult = WapOpen( wlLayer, dwRecvPort, &hWapRecv, &hWapRecvMsgEvent );  
     59     if ( FAILED(hResult) || !hWapRecv || !hWapRecvMsgEvent )   
     60     {  
     61         OutputDebugString( _T("WapOpen() for reading WDP UnitData failed") );  
     62         hWapRecv= 0L;  
     63         goto exit_label;  
     64     }  
     65   
     66     if(bUDP)  
     67     {  
     68   
     69         _tcsncpy( waSendRecv.ptsAddress, tszIpLoopbackAddr, MAX_WAP_ADDRESS_LENGTH );  
     70     }  
     71     else  
     72     {  
     73         _tcsncpy( waSendRecv.ptsAddress, tszTelNum, MAX_WAP_ADDRESS_LENGTH);  
     74     }  
     75   
     76     waSendRecv.watAddressType = bUDP ? WAP_ADDRESS_TYPE_UDP : WAP_ADDRESS_TYPE_GSM_SMS;  
     77   
     78     // Initialize the WDP UnitData  
     79     memset( &Wdpunitdata, 0, sizeof(Wdpunitdata) );  
     80     Wdpunitdata.wpiPrimitiveID = WAP_PRIMITIVE_ID_T_DUNITDATA;  
     81     Wdpunitdata.wptPrimitiveType = WAP_PRIMITIVE_TYPE_REQUEST;  
     82     Wdpunitdata.dwValidFields =  (WDP_FIELD_SOURCEADDRESS      |  
     83         WDP_FIELD_SOURCEPORT         |  
     84         WDP_FIELD_DESTINATIONADDRESS |  
     85         WDP_FIELD_DESTINATIONPORT    |  
     86         WDP_FIELD_USERDATA );  
     87     Wdpunitdata.waSourceAddress =  waSendRecv;  
     88     Wdpunitdata.dwSourcePort = dwSendPort;  
     89     Wdpunitdata.waDestinationAddress = Wdpunitdata.waSourceAddress;  
     90     Wdpunitdata.dwDestinationPort = dwRecvPort;  
     91     // Set Random user data with size = 0x100  
     92     Wdpunitdata.dwUserDataSize = 0x100;  
     93   
     94     if(pbBuffer = new BYTE[Wdpunitdata.dwUserDataSize])  
     95     {  
     96         // Fill the user data section with random data  
     97         for ( DWORD dw = 0; dw < Wdpunitdata.dwUserDataSize; dw++ )   
     98         {  
     99             pbBuffer[ dw ] = rand() % 0xFF;  
    100         }  
    101     }      
    102     else   
    103     {  
    104         goto exit_label;  
    105     }  
    106     Wdpunitdata.pbUserData = pbBuffer;  
    107   
    108     //  Send WDP Data  
    109     hResult = WapSend( hWapSend, (WAP_PRIMITIVE_BASE *)&Wdpunitdata );  
    110     if ( FAILED(hResult) )   
    111     {  
    112         OutputDebugString( _T("WapSend() with WDP Unitdata failed") );  
    113         goto exit_label;  
    114     }  
    115   
    116     //  Wait for WAP message received Event  
    117     if ( WAIT_OBJECT_0 != WaitForSingleObject( hWapRecvMsgEvent , 10000L ))  
    118     {  
    119         OutputDebugString( _T("Failed to wait for or timed out waiting for expected WDP Data") );  
    120         goto exit_label;  
    121     }  
    122   
    123     hResult = WapGetNextPrimitiveSize( hWapRecv, &dwWdpRecvDataSize);  
    124     if ( FAILED(hResult) || (0 == dwWdpRecvDataSize) )   
    125     {  
    126         OutputDebugString( _T("WapGetNextPrimitiveSize() failed") );  
    127         goto exit_label;  
    128     }  
    129   
    130     //  Allocate memory for storing received WDP Data  
    131     pcbWdpRecvData =( WDP_UNITDATA* ) new BYTE[ dwWdpRecvDataSize ];  
    132     if ( !pcbWdpRecvData)   
    133     {  
    134         OutputDebugString( _T("Failed to allocate memory for storing WDP Unit Data") );  
    135         goto exit_label;  
    136     }  
    137   
    138     //  Read WDP Data  
    139     hResult = WapRead( hWapRecv, (WAP_PRIMITIVE_BASE *)pcbWdpRecvData, dwWdpRecvDataSize );  
    140     if ( FAILED(hResult) )   
    141     {  
    142         OutputDebugString( _T("WapRead() failed") );  
    143         goto exit_label;  
    144     }  
    145   
    146     // Validate the received primitive and  
    147     // Compare the received user data to the sent user data  
    148     if (!pcbWdpRecvData)  
    149         goto exit_label;  
    150   
    151     bSendReadOK = true;  
    152     bSendReadOK &= (WAP_PRIMITIVE_ID_T_DUNITDATA == pcbWdpRecvData->wpiPrimitiveID);  
    153     bSendReadOK &= (WAP_PRIMITIVE_TYPE_INDICATION == pcbWdpRecvData->wptPrimitiveType);  
    154     bSendReadOK &= (pcbWdpRecvData->dwValidFields & WDP_FIELD_SOURCEADDRESS ) && ( pcbWdpRecvData->dwValidFields & WDP_FIELD_SOURCEPORT );  
    155     bSendReadOK &= (pcbWdpRecvData->dwUserDataSize == Wdpunitdata.dwUserDataSize);  
    156     if(bSendReadOK && pcbWdpRecvData->pbUserData)  
    157     {  
    158         bSendReadOK &= !memcmp(pcbWdpRecvData->pbUserData, Wdpunitdata.pbUserData, pcbWdpRecvData->dwUserDataSize);  
    159     }  
    160   
    161 exit_label:  
    162   
    163     //  Close WAP for Sending WDP UnitData  
    164     if ( hWapSend)   
    165     {  
    166         hResult = WapClose( hWapSend );  
    167         if ( FAILED(hResult) )   
    168         {  
    169             OutputDebugString( _T("WapClose() for sending WDP UnitData failed") );  
    170             bSendReadOK = false;  
    171         }   
    172         else   
    173         {  
    174             hWapSend = 0L;  
    175         }  
    176     }  
    177   
    178     //  Close WAP for Receiving WDP UnitData  
    179     if ( hWapRecv )   
    180     {  
    181         hResult = WapClose( hWapRecv );  
    182         if ( FAILED(hResult) )   
    183         {  
    184             OutputDebugString( _T("WapClose() for reading WDP UnitData failed") );  
    185             bSendReadOK = false;  
    186         }   
    187         else   
    188         {  
    189             hWapRecv = 0L;  
    190         }  
    191     }  
    192     // Clear the buffers  
    193     if (pbBuffer)   
    194     {  
    195         delete[] (BYTE*) pbBuffer;  
    196         pbBuffer = NULL;  
    197     }  
    198   
    199     if ( pcbWdpRecvData )   
    200     {  
    201         delete [] (BYTE*) pcbWdpRecvData;  
    202         pcbWdpRecvData = NULL;  
    203     }  
    204   
    205     return bSendReadOK;  
    206 }  
    207 // CWapTestDlg 对话框  
    208   
    209 CWapTestDlg::CWapTestDlg(CWnd* pParent /*=NULL*/)  
    210     : CDialog(CWapTestDlg::IDD, pParent)  
    211 {  
    212     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);  
    213 }  
    214   
    215 void CWapTestDlg::DoDataExchange(CDataExchange* pDX)  
    216 {  
    217     CDialog::DoDataExchange(pDX);  
    218 }  
    219   
    220 BEGIN_MESSAGE_MAP(CWapTestDlg, CDialog)  
    221 #if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)  
    222     ON_WM_SIZE()  
    223 #endif  
    224     //}}AFX_MSG_MAP  
    225 END_MESSAGE_MAP()  
    226   
    227 // CWapTestDlg 消息处理程序  
    228   
    229 BOOL CWapTestDlg::OnInitDialog()  
    230 {  
    231     CDialog::OnInitDialog();  
    232   
    233     // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动  
    234     //  执行此操作  
    235     SetIcon(m_hIcon, TRUE);         // 设置大图标  
    236     SetIcon(m_hIcon, FALSE);        // 设置小图标  
    237   
    238     // TODO: 在此添加额外的初始化代码  
    239     WdpSendAndReadEcho(true);  
    240       
    241     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
    242 }  
  • 相关阅读:
    Java8 Stream
    一个轻量级的基于RateLimiter的分布式限流实现
    常用限流算法与Guava RateLimiter源码解析
    Java学习之socket网络编程篇
    Java学习之文件io流篇
    Java学习之异常篇
    Java学习之多线程篇
    Java学习之集合篇
    Java学习之常用类篇
    Java学习之final与匿名内部类篇
  • 原文地址:https://www.cnblogs.com/91program/p/5205112.html
Copyright © 2020-2023  润新知