299 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			299 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | 
 | ||
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Text; | ||
|  | using System.Threading; | ||
|  | 
 | ||
|  | namespace Urovo | ||
|  | { | ||
|  |     #region enum | ||
|  |      /// <summary> | ||
|  |     /// ConnectType | ||
|  |     /// </summary> | ||
|  |     public enum ConnType | ||
|  |     { | ||
|  |         Offline = -1, | ||
|  |         Gprs, | ||
|  |         Wlan | ||
|  |     } | ||
|  | 
 | ||
|  |     /// <summary> | ||
|  |     /// ConnState | ||
|  |     /// </summary> | ||
|  |     public enum ConnState  | ||
|  |     { | ||
|  |         Disconnectiong = 3, | ||
|  |         Connecting=2, | ||
|  |         ConnectSuccess=1, | ||
|  |         NoConnect=0 | ||
|  |     } | ||
|  |     #endregion | ||
|  | 
 | ||
|  |     #region ConnectNotifyEvent | ||
|  |     /// <summary> | ||
|  |     /// ConnectNotifyEventArgs | ||
|  |     /// </summary> | ||
|  |     public class ConnectNotifyEventArgs : EventArgs | ||
|  |     { | ||
|  |         private ConnState connectResult; | ||
|  | 
 | ||
|  |         private ConnType connectType; | ||
|  | 
 | ||
|  |         public ConnState ConnectResult | ||
|  |         { | ||
|  |             get { return connectResult; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public ConnType ConnectType | ||
|  |         { | ||
|  |             get { return connectType; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public ConnectNotifyEventArgs(ConnState connectResult, ConnType connectType) | ||
|  |         { | ||
|  |             this.connectResult = connectResult; | ||
|  |             this.connectType = connectType; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /// <summary> | ||
|  |     /// ConnectNotifyEvent delegate | ||
|  |     /// </summary> | ||
|  |     /// <param name="sender">sender</param> | ||
|  |     /// <param name="e">ConnectNotifyEventArgs</param> | ||
|  |     public delegate void ConnectNotifyEventHandler(object sender, ConnectNotifyEventArgs e); | ||
|  |     #endregion | ||
|  | 
 | ||
|  | 
 | ||
|  |     public class NetworkManager | ||
|  |     { | ||
|  | 
 | ||
|  |         #region Event | ||
|  |         public event ConnectNotifyEventHandler ConnectNotify; | ||
|  | 
 | ||
|  |         protected virtual void OnConnectNotify(ConnectNotifyEventArgs e) | ||
|  |         { | ||
|  |             if (ConnectNotify != null) | ||
|  |             { | ||
|  |                 ConnectNotify(this, e); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         #endregion | ||
|  | 
 | ||
|  |         #region Variable | ||
|  |         const int eventCount = 3; | ||
|  | 
 | ||
|  |         IntPtr[] hEvent = new IntPtr[eventCount]; | ||
|  | 
 | ||
|  |         const string gprsName = "GPRS"; | ||
|  | 
 | ||
|  |         uint waitTimeout = Win32.INFINITE; | ||
|  |         #endregion | ||
|  |         | ||
|  |         #region Property | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// ConnectType | ||
|  |         /// </summary> | ||
|  |         public static ConnType ConnectType = ConnType.Offline; | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// IsConnecting | ||
|  |         /// </summary> | ||
|  |         public static bool IsConnecting = false; | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// GprsName | ||
|  |         /// </summary> | ||
|  |         public static string GprsName | ||
|  |         { | ||
|  |             get { return gprsName; } | ||
|  |         } | ||
|  | 
 | ||
|  |         #endregion | ||
|  | 
 | ||
|  |         #region Structure | ||
|  | 
 | ||
|  |         public NetworkManager() | ||
|  |         { | ||
|  |             for (int i = 0; i < eventCount; i++) | ||
|  |             { | ||
|  |                 hEvent[i] = Win32.CreateEvent(IntPtr.Zero, false, false, null); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         ~NetworkManager() | ||
|  |         { | ||
|  |             for (int i = 0; i < eventCount; i++) | ||
|  |             { | ||
|  |                 Win32.CloseHandle(hEvent[i]); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         #endregion | ||
|  | 
 | ||
|  |         #region Method | ||
|  |         /// <summary> | ||
|  |         /// Start NetworkManagement Thread | ||
|  |         /// </summary> | ||
|  |         /// <returns></returns> | ||
|  |         public bool Start() | ||
|  |         { | ||
|  |             Thread t = new Thread(new ThreadStart(this.NetworkThreadPorc)); | ||
|  |             t.Start(); | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Stop NetworkManagement Thread | ||
|  |         /// </summary> | ||
|  |         public void Stop() | ||
|  |         { | ||
|  |             waitTimeout = Win32.INFINITE; | ||
|  |             this.ConnectNotify = null; | ||
|  |             Win32.EventModify(hEvent[0], Win32.EVENT_SET); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Send Connect Request | ||
|  |         /// </summary> | ||
|  |         /// <param name="type"></param> | ||
|  |         public void Connect(ConnType type) | ||
|  |         { | ||
|  |             waitTimeout = 30 * 1000; | ||
|  |             NetworkManager.ConnectType = type; | ||
|  |             Win32.EventModify(hEvent[1], Win32.EVENT_SET); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Send Disconnect Request | ||
|  |         /// </summary> | ||
|  |         /// <param name="netType"></param> | ||
|  |         public void Disconnect() | ||
|  |         { | ||
|  |             waitTimeout = Win32.INFINITE; | ||
|  |             Win32.EventModify(hEvent[2], Win32.EVENT_SET); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// NetworkThreadPorc | ||
|  |         /// </summary> | ||
|  |         private void NetworkThreadPorc() | ||
|  |         { | ||
|  |             while (true) | ||
|  |             { | ||
|  |                 //wait for 3 minute if not connect request. | ||
|  |                 //the thread will auto maintenance the network state. | ||
|  |                 uint evt = Win32.WaitForMultipleObjects(eventCount, hEvent, false, waitTimeout); | ||
|  |                 if (evt == 0)//return the thread | ||
|  |                 { | ||
|  |                     return; | ||
|  |                 } | ||
|  |                 if (evt == 2) | ||
|  |                 { | ||
|  |                     //fire the ConnectNotify Event | ||
|  |                     OnConnectNotify(new ConnectNotifyEventArgs(ConnState.Disconnectiong, ConnectType)); | ||
|  | 
 | ||
|  |                     switch (ConnectType) | ||
|  |                     { | ||
|  |                         case ConnType.Offline: | ||
|  |                             Device.DisConnectGprs(gprsName); | ||
|  |                             Device.DisableGsmModule(); | ||
|  |                             Device.DisableWlanModule(); | ||
|  |                             break; | ||
|  |                         case ConnType.Gprs: | ||
|  |                             Device.DisConnectGprs(gprsName); | ||
|  |                             Device.DisableGsmModule(); | ||
|  |                             break; | ||
|  |                         case ConnType.Wlan: | ||
|  |                             Device.DisableWlanModule(); | ||
|  |                             break; | ||
|  |                     } | ||
|  |                     //fire the ConnectNotify Event | ||
|  |                     OnConnectNotify(new ConnectNotifyEventArgs(ConnState.NoConnect, ConnectType)); | ||
|  |                 } | ||
|  |                 else | ||
|  |                 { | ||
|  |                     IsConnecting = true; | ||
|  | 
 | ||
|  |                     //fire the ConnectNotify Event | ||
|  |                     OnConnectNotify(new ConnectNotifyEventArgs(ConnState.Connecting, ConnectType)); | ||
|  | 
 | ||
|  |                     //if the connect request then disable the no need Network. | ||
|  |                     if (evt == 1) | ||
|  |                     { | ||
|  |                         switch (ConnectType) | ||
|  |                         { | ||
|  |                             case ConnType.Offline: | ||
|  |                                 Device.DisConnectGprs(gprsName); | ||
|  |                                 Device.DisableGsmModule(); | ||
|  |                                 Device.DisableWlanModule(); | ||
|  |                                 break; | ||
|  |                             case ConnType.Gprs: | ||
|  |                                 Device.DisableWlanModule(); | ||
|  |                                 break; | ||
|  |                             case ConnType.Wlan: | ||
|  |                                 Device.DisConnectGprs(gprsName); | ||
|  |                                 Device.DisableGsmModule(); | ||
|  |                                 break; | ||
|  |                         } | ||
|  |                     } | ||
|  | 
 | ||
|  |                     ConnState res = ConnState.ConnectSuccess; | ||
|  |                     if (!Device.CheckNetworkStat()) | ||
|  |                     { | ||
|  |                         res = ConnState.NoConnect; | ||
|  | 
 | ||
|  |                         switch (ConnectType) | ||
|  |                         { | ||
|  |                             case ConnType.Gprs: | ||
|  |                                 if (Device.EnableGsmModule()) | ||
|  |                                 { | ||
|  |                                     if (Device.GetGprsStatus(gprsName)) | ||
|  |                                     { | ||
|  |                                         Device.DisConnectGprs(gprsName); | ||
|  |                                     } | ||
|  | 
 | ||
|  |                                     uint err; | ||
|  |                                     if (Device.ConnectGprs(gprsName, out err)) | ||
|  |                                     { | ||
|  |                                         res = ConnState.ConnectSuccess; | ||
|  |                                         Thread.Sleep(5000); | ||
|  |                                     } | ||
|  |                                 } | ||
|  |                                 break; | ||
|  |                             case ConnType.Wlan: | ||
|  |                                 bool ret; | ||
|  |                                 if (Device.GetWlanPowerStatus() == 0) | ||
|  |                                 { | ||
|  |                                     ret = Device.EnableWlanModule(); | ||
|  |                                 } | ||
|  |                                 else | ||
|  |                                 { | ||
|  |                                     ret = Device.RefreshWlanPreferredList(); | ||
|  |                                 } | ||
|  | 
 | ||
|  |                                 Thread.Sleep(2000); | ||
|  |                                 for (int i = 0; i < 15; i++) | ||
|  |                                 { | ||
|  |                                     if (Device.CheckNetworkStat()) | ||
|  |                                     { | ||
|  |                                         res = ConnState.ConnectSuccess; | ||
|  |                                         Thread.Sleep(3000); | ||
|  |                                         break; | ||
|  |                                     } | ||
|  |                                     Thread.Sleep(1000); | ||
|  |                                 } | ||
|  |                                 break; | ||
|  |                         } | ||
|  |                     } | ||
|  |                     OnConnectNotify(new ConnectNotifyEventArgs(res, ConnectType)); | ||
|  |                     IsConnecting = false; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         #endregion | ||
|  |     } | ||
|  | } |