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
|
|
}
|
|
}
|