• WinCE切换GPRS


    // GPRSwitch.cpp : 定义应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "GPRSwitch.h"
    #include <windows.h>
    #include <commctrl.h>
    #include "GprsXmlConfig.h"
    #include <connmgr.h>
    #include <ras.h>
    #include <Raserror.h>
    //#include <stdio.h>
    
    #define MAX_LOADSTRING 100
    #define WM_GPRSwitch WM_USER+7227
    #define WM_CTLCENTER WM_USER+112
    #define GPRS_STATUS_ON 1
    #define GPRS_STATUS_OFF 0
    
    // 全局变量:
    HINSTANCE            g_hInst;            // 当前实例
    HANDLE                hConnection;
    HRESULT                hResult;
    DWORD                dwStatus;
    GprsXmlConfig        config;
    DWORD                bufsize;
    DWORD                numEntries;
    //FILE *fp;
    HWND                hWndDes = NULL;            // 接收消息的主程序句柄
    
    // 此代码模块中包含的函数的前向声明:
    ATOM            MyRegisterClass(HINSTANCE, LPTSTR);
    BOOL            InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
    {
        MSG msg;
        nCmdShow = SW_HIDE;
    
        // 执行应用程序初始化:
        if (!InitInstance(hInstance, nCmdShow)) 
        {
            return FALSE;
        }
    
        HACCEL hAccelTable;
        hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GPRSWITCH));
    
        // 主消息循环:
        while (GetMessage(&msg, NULL, 0, 0)) 
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    
        return (int) msg.wParam;
    }
    
    //
    //  函数: MyRegisterClass()
    //
    //  目的: 注册窗口类。
    //
    //  注释:
    //
    ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
    {
        WNDCLASS wc;
    
        wc.style         = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_GPRSWITCH));
        wc.hCursor       = 0;
        wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName  = 0;
        wc.lpszClassName = szWindowClass;
    
        return RegisterClass(&wc);
    }
    
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
        HWND hWnd;
        TCHAR szTitle[MAX_LOADSTRING] = _T("GPRS Switcher");        // 标题栏文本
        TCHAR szWindowClass[MAX_LOADSTRING] = _T("TBWidget");    // 主窗口类名
    
        g_hInst = hInstance; // 将实例句柄存储在全局变量中
    
        SHInitExtraControls();
    
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 
        LoadString(hInstance, IDC_GPRSWITCH, szWindowClass, MAX_LOADSTRING);
    
        hWnd = FindWindow(szWindowClass, szTitle);    
        if (hWnd) 
        {
            return 0;
        } 
    
        if (!MyRegisterClass(hInstance, szWindowClass))
        {
            return FALSE;
        }
    
        hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    
        if (!hWnd)
        {
            return FALSE;
        }
    
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
        hWndDes = FindWindow(_T("TBClass"), _T("TBMainWnd"));
        SendMessage(hWnd, WM_GPRSwitch, 0, 0);
    
        return TRUE;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message) 
        {
            case WM_GPRSwitch:
                RASCONN entries[25];
                bufsize = 0;
                numEntries = 0;
                bufsize = 25 * sizeof(RASCONN);
                entries[0].dwSize = sizeof(RASCONN);//必须
                RASCONNSTATUS status;//RAS状态在ras.h中可以查找到。
                status.dwSize = sizeof(RASCONNSTATUS);
    
                //fp = fopen("GPRSwitch.log", "w");
    
                if(RasEnumConnections(entries, &bufsize, &numEntries) == 0) //枚举所有活动的连接
                {
                    if (numEntries == 0) //无GPRS连接
                    {
                        RASDIALPARAMS rdParams;
                        HRASCONN hRasConn = NULL;
                        //初始化参数
                        rdParams.dwSize = sizeof(RASDIALPARAMS);
                        lstrcpy(rdParams.szEntryName, _T("GPRS"));
                        lstrcpy(rdParams.szPhoneNumber, _T(""));
                        lstrcpy(rdParams.szCallbackNumber, _T(""));
                        lstrcpy(rdParams.szPhoneNumber, _T(""));
                        lstrcpy(rdParams.szUserName, _T(""));
                        lstrcpy(rdParams.szPassword, _T(""));
                        lstrcpy(rdParams.szDomain, _T(""));
                        DWORD dwRet;
    
                        dwRet = RasDial(NULL, NULL, &rdParams, 0xFFFFFFFF, NULL, &hRasConn); //通过给窗体发送WM_RASDIALEVENT消息。
    
                        if(dwRet != 0)    //拔号失败
                        {
                            if (hWndDes != NULL)
                            {
                                SendMessage(hWndDes, WM_CTLCENTER, WM_GPRSwitch, GPRS_STATUS_OFF);
                            }
                        }
                        else
                        {
                            if (hWndDes != NULL)
                            {
                                SendMessage(hWndDes, WM_CTLCENTER, WM_GPRSwitch, GPRS_STATUS_ON);
                            }
                        }
    
                        exit(0);
                        break;
                    }
    
                    for(DWORD i=0; i<numEntries; i++) // 有GPRS连接
                    {
                        for (DWORD j=0; j<wcslen(entries[i].szEntryName)-4; j++)
                        {
                            if (entries[i].szEntryName[j] == 'G'
                                && entries[i].szEntryName[j+1] == 'P'
                                && entries[i].szEntryName[j+2] == 'R'
                                && entries[i].szEntryName[j+3] == 'S'
                                )
                            {
                                RasHangUp(entries[i].hrasconn);
                                while(RasGetConnectStatus(entries[i].hrasconn,&status)==0)//得到连接的状态(能获取得到)
                                {
                                    Sleep(0);    //Sleep(0)是指CPU交出当前线程的执行权,让CPU去执行其他线程。
                                }
                                break;
                            }
                        }
    
                        //fwprintf(fp, _T("%d : %s\n"), i, entries[i].szEntryName);
                    }
    
                    if (hWndDes != NULL)
                    {
                        SendMessage(hWndDes, WM_CTLCENTER, WM_GPRSwitch, GPRS_STATUS_OFF);
                    }
                }
    
                //fclose(fp);
                exit(0);
                break;
    
            case WM_DESTROY:
                PostQuitMessage(0);
                break;
    
            case WM_CLOSE:
                exit(0);
                break;
    
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    // GPRSXmlConfig.h
    
    #pragma once
    /*!
    * 通过wap-provisioningdoc方式设置gprs连接
    * 使用方式:枚举网络找一个名为CMWAP_GPRS的连接,(如果找不到新建一个名为CMWAP_GPRS的网络连接),
    * 然后通过建立该连接来进行网络访问
    */
    class GprsXmlConfig
    {
    public:
        GprsXmlConfig(void);
        ~GprsXmlConfig(void);
    
    public:
        /* 创建一个名为CMWAP_GPRS的网络设置*/
        BOOL CreateCmwapNetConfig();
    
        /*选择名为CMWAP_GPRS的网络设置的GUID*/
        BOOL findCmwapNetGuid(GUID&);
    };
    // GprsXmlConfig.cpp
    #include "StdAfx.h"
    #include "GprsXmlConfig.h"
    #include <Cfgmgrapi.h>
    #include <connmgr.h>
    #include <connmgr_proxy.h>
    #pragma comment( lib,"cellcore.lib")
    #pragma comment(lib, "Aygshell.lib")
    
    GprsXmlConfig::GprsXmlConfig(void)
    {
    }
    
    GprsXmlConfig::~GprsXmlConfig(void)
    {
    }
    
    BOOL GprsXmlConfig::findCmwapNetGuid(GUID& guid)
    {
        BOOL rst = false;
        HRESULT hr = 0;
        int nIndex = 0;
        CONNMGR_DESTINATION_INFO DestInfo;
        //WCHAR wszDestGUIDStr[128];
        while ( (hr = ConnMgrEnumDestinations(nIndex,&DestInfo)) == 0 )
        {
            if (_tcscmp(_T("中国移动WAP设置"),DestInfo.szDescription)==0)
            {
                guid = DestInfo.guid;
                rst = true;
                break;
            }
            nIndex++;
        }
     
        return rst;
    }
    
    BOOL GprsXmlConfig::CreateCmwapNetConfig()
    {
        //AfxMessageBox(_T("开始创建连接"));
        LPCWSTR g_wszFavoriteXml = 
            L"<wap-provisioningdoc>"
            L"    <characteristic type=\"CM_Networks\">"
            L"        <characteristic type=\"中国移动WAP设置\">"
            L"            <parm name=\"DestId\" value=\"{EA9A391E-7878-0D28-4CA2-21F8C61F1243}\"/>"
            L"        </characteristic>"
            L"    </characteristic>"
            L"    <characteristic type=\"CM_GPRSEntries\">"
            L"        <characteristic type=\"中国移动 GPRS 因特网\">"
            L"            <parm name=\"DestId\" value=\"{EA9A391E-7878-0D28-4CA2-21F8C61F1243}\"/>"
            L"            <characteristic type=\"DevSpecificCellular\">"
            L"                <parm name=\"BearerInfoValid\" value=\"1\"/>"
            L"                <parm name=\"GPRSInfoValid\" value=\"1\"/>"
            L"                <parm name=\"GPRSInfoProtocolType\" value=\"2\"/>"
            L"                <parm name=\"GPRSInfoL2ProtocolType\" value=\"PPP\"/>"
            L"                <parm name=\"GPRSInfoAccessPointName\" value=\"cmwap\"/>"
            L"                <parm name=\"GPRSInfoAddress\" value=\"\"/>"
            L"                <parm name=\"GPRSInfoDataCompression\" value=\"1\"/>"
            L"                <parm name=\"GPRSInfoHeaderCompression\" value=\"1\"/>"
            L"                <parm name=\"GPRSInfoParameters\" value=\"\"/>"
            L"            </characteristic>"
            L"        </characteristic>"
            L"    </characteristic>"
            L"    <characteristic type=\"CM_ProxyEntries\">"
            L"        <characteristic type=\"HTTP-{EA9A391E-7878-0D28-4CA2-21F8C61F1243}\">"
            L"            <parm name=\"SrcId\" value=\"{EA9A391E-7878-0D28-4CA2-21F8C61F1243}\"/>"
            L"            <parm name=\"DestId\" value=\"{436EF144-B4FB-4863-A041-8F905A62C572}\"/>"
            L"            <parm name=\"Proxy\" value=\"10.0.0.172:80\"/>"
            L"            <parm name=\"Enable\" value=\"1\"/>"
            L"            <parm name=\"Type\" value=\"1\"/>"
            L"        </characteristic>"
            L"        <characteristic type=\"WAP-{EA9A391E-7878-0D28-4CA2-21F8C61F1243}\">"
            L"            <parm name=\"SrcId\" value=\"{EA9A391E-7878-0D28-4CA2-21F8C61F1243}\"/>"
            L"            <parm name=\"DestId\" value=\"{7022E968-5A97-4051-BC1C-C578E2FBA5D9}\"/>"
            L"            <parm name=\"Proxy\" value=\"10.0.0.172:9201\"/>"
            L"            <parm name=\"Enable\" value=\"1\"/>"
            L"            <parm name=\"Type\" value=\"2\"/>"
            L"        </characteristic>"
            L"    </characteristic>"
            L"</wap-provisioningdoc>";
    
    
        HRESULT hr       = E_FAIL;
        LPWSTR wszOutput   = NULL;
    
        hr = DMProcessConfigXML(g_wszFavoriteXml, CFGFLAG_PROCESS, &wszOutput);
    // if (hr==S_OK)
    // {
    //     AfxMessageBox(_T("创建连接成功!"));
    // }
        if (wszOutput)
        {
            delete [] wszOutput;
            wszOutput=NULL;
        }
        return (hr==S_OK);
    
    }
    
    
    
     
  • 相关阅读:
    建设Kubernetes生产环境的16条建议
    深度长文:深入理解Ceph存储架构
    10个最危险的Linux命令,希望你牢记在心
    完美排查入侵者的 10 个方法和 1 个解决思路
    基于Docker&Kubernetes构建PaaS平台基础知识梳理
    Linux入门进阶
    (七)服务接口调用-OpenFeign
    (六)服务调用负载均衡-Ribbon
    (五)Eureka替换方案-Consul
    (四)Eureka替换方案-Zookeeper
  • 原文地址:https://www.cnblogs.com/ZzzZzz/p/2839768.html
Copyright © 2020-2023  润新知