【问题标题】:how check connection between PPC to WebService?如何检查 PPC 与 WebService 之间的连接?
【发布时间】:2011-07-05 17:09:42
【问题描述】:

如何检查 PPC 与服务器上的 Web 服务之间的连接?我在 FW3.5 C# 上工作

【问题讨论】:

    标签: c# web-services windows-mobile pocketpc compact-framework


    【解决方案1】:

    我不记得这是否在 .Net CF 中可用:

    System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

    另一种选择是尝试使用 Web 服务并处理异常。我通常遵循这种模式,是否有原因它不适用于您的情况?

    编辑:

    连接监视器类:

        public static class ConnectionMonitor
        {
            public static event EventHandler IsConnectedChanged;
    
            private static SystemState _connectionState = null,
                //_cellState = null,
                _gprsState = null;
            private static int _connectionCount = 0;
                //_cellCount = 0;
            private static bool _gprs = false;
            private static bool _isConnected = true;
            private static string _phoneCarrier = SystemState.PhoneOperatorName;
            private const int POWER_FLAGS = 0x00000001; // default
            private const string AXIM_WIFI_ADAPTER = "{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\TIACXWLN1";
    
            public static bool IsPhone
            {
                get { return !string.IsNullOrEmpty(_phoneCarrier); }
            }
    
            public static bool IsGPRSConnected
            {
                get { return _gprs; }
            }
    
            public static bool IsConnected
            {
                get { return _isConnected; }
                set
                {
                    if (_isConnected != value)
                    {
                        _isConnected = value;
                        if (IsConnectedChanged != null)
                        {
                            IsConnectedChanged(null, EventArgs.Empty);
                        }
    
                        if (!_isConnected && !IsPhone)
                        {
                            WifiOn();  
                        }
                    }
                }
            }
    
            private static void WifiOn()
            {
                Win32.CEDEVICE_POWER_STATE state = new Win32.CEDEVICE_POWER_STATE();
                if (Win32.GetDevicePower(AXIM_WIFI_ADAPTER, POWER_FLAGS, ref state) == 0)
                {
                    if (state != Win32.CEDEVICE_POWER_STATE.D0)
                    {
                        Win32.DevicePowerNotify(AXIM_WIFI_ADAPTER, Win32.CEDEVICE_POWER_STATE.D4, POWER_FLAGS);
                        Win32.SetDevicePower(AXIM_WIFI_ADAPTER, POWER_FLAGS, Win32.CEDEVICE_POWER_STATE.D0);
                    }
                }
            }
    
            public static void Init()
            {
                if (_connectionState == null)
                {
                    _connectionState = new SystemState(SystemProperty.ConnectionsCount);
                    _connectionCount = SystemState.ConnectionsCount;
                    _connectionState.Changed += new ChangeEventHandler(_state_Changed);
                }
                //if (_cellState == null)
                //{
                //    _cellState = new SystemState(SystemProperty.ConnectionsCellularCount);
                //    _cellCount = SystemState.ConnectionsCellularCount;
                //    _cellState.Changed += new ChangeEventHandler(_state_Changed);
                //}
                if (_gprsState == null)
                {
                    _gprsState = new SystemState(SystemProperty.PhoneGprsCoverage);
                    _gprs = SystemState.PhoneGprsCoverage;
                    _gprsState.Changed += new ChangeEventHandler(_state_Changed);
                }
                IsConnected =  _connectionCount > 0 || _gprs;
            }
    
            private static void _state_Changed(object sender, ChangeEventArgs args)
            {
                //_cellCount = SystemState.ConnectionsCellularCount;
                _connectionCount = SystemState.ConnectionsCount;
                _gprs = SystemState.PhoneGprsCoverage;
                IsConnected = _connectionCount > 0 || _gprs;
            }
    
            public static void Dispose()
            {
                if (_connectionState != null)
                {
                    _connectionState.Changed -= new ChangeEventHandler(_state_Changed);
                    _connectionState.Dispose();
                    _connectionState = null;
                }
                //if (_cellState != null)
                //{
                //    _cellState.Changed -= new ChangeEventHandler(_state_Changed);
                //    _cellState.Dispose();
                //    _cellState = null;
                //}
                if (_gprsState != null)
                {
                    _gprsState.Changed -= new ChangeEventHandler(_state_Changed);
                    _gprsState.Dispose();
                    _gprsState = null;
                }
            }
    }
    

    我的 Win32 静态类中有很多调用(与您的需求无关)。以下是我认为您需要的所有内容:

            public enum CEDEVICE_POWER_STATE : int
            {
                PwrDeviceUnspecified = -1,
                D0 = 0, // Full On: full power, full functionality
                D1 = 1, // Low Power On: fully functional at low power/performance
                D2 = 2, // Standby: partially powered with automatic wake
                D3 = 3, // Sleep: partially powered with device initiated wake
                D4 = 4, // Off: unpowered
                PwrDeviceMaximum = 5
            }
    
            [DllImport("coredll.dll", SetLastError = true)]
            public static extern int DevicePowerNotify(string name, CEDEVICE_POWER_STATE state, int flags);
    
            [DllImport("coredll.dll", SetLastError = true)]
            public static extern int SetDevicePower(string name, int flags, CEDEVICE_POWER_STATE state);
    
            [DllImport("coredll.dll", SetLastError = true)]
            public static extern int GetDevicePower(string name, int flags, ref CEDEVICE_POWER_STATE state);
    

    如果我错过了,请在 pinvoke.net 上查找。

    【讨论】:

    • 此类在 .Net CF 中不可用。异常处理对你有用吗?如果没有,请回帖,我过去曾使用过一个类来监控此类事情。
    • 见我上面的编辑。需要注意的一件事是,我特别必须通过 guid 为适配器的状态命名我的 wifi 适配器。玩弄它,您可能会找到更好的方法来处理它或不需要它。 ConnectionsCount SystemProperty 可能就是您所需要的。
    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多