在Windows Phone 开发中有时候需要获取设备当前连接网络的类型,是Wifi,还是2G,3G,或者4G,SDK中提供获取网络类型的API(Microsoft.Phone.Net.NetworkInformation. DeviceNetworkInformation),通过此API我们可以方便的获取相关信息。但是此API是基于异步回调的方式获取的,如果需要同步获取,那么就需要做一些特殊的处理。
以下代码定义网络类型信息类,用于存储获取的网络类型信息。
/// <summary>
/// 网络类型
/// </summary>
public enum NetworkType
{
None = ,
Wifi = , //Wifi
Mobile2G = , //2G网络
Mobile3G = , //3G网络
Mobile4G = //4G网络
} /// <summary>
/// 网络类型信息
/// </summary>
public class NetworkInfo
{
/// <summary>
/// 网络接口的名称
/// </summary>
public string InterfaceName { get; set; } /// <summary>
/// 网络接口的说明
/// </summary>
public string Description { get; set; } /// <summary>
/// 网络类型
/// </summary>
public NetworkType InterfaceType { get; set; }
}
以下代码将从系统NetworkInterfaceInfo解析获取网络类型信息并写入到上面构造的NetworkInfo类中。
private static NetworkInfo parseNetworkInfo(NetworkInterfaceInfo info)
{
NetworkInfo netInfo = new NetworkInfo();
if (info != null)
{
netInfo.InterfaceName = info.InterfaceName;
netInfo.Description = info.Description;
switch (info.InterfaceType)
{
case NetworkInterfaceType.MobileBroadbandCdma:
case NetworkInterfaceType.MobileBroadbandGsm:
switch (info.InterfaceSubtype)
{
case NetworkInterfaceSubType.Cellular_GPRS:
case NetworkInterfaceSubType.Cellular_1XRTT:
case NetworkInterfaceSubType.Cellular_EDGE:
netInfo.InterfaceType = NetworkType.Mobile2G;
break;
case NetworkInterfaceSubType.Cellular_3G:
case NetworkInterfaceSubType.Cellular_EVDO:
case NetworkInterfaceSubType.Cellular_EVDV:
case NetworkInterfaceSubType.Cellular_HSPA:
netInfo.InterfaceType = NetworkType.Mobile3G;
break;
case NetworkInterfaceSubType.Cellular_LTE:
case NetworkInterfaceSubType.Cellular_EHRPD:
netInfo.InterfaceType = NetworkType.Mobile4G;
break;
default:
netInfo.InterfaceType = NetworkType.None;
break;
}
break;
case NetworkInterfaceType.Wireless80211:
netInfo.InterfaceType = NetworkType.Wifi;
break;
default:
netInfo.InterfaceType = NetworkType.None;
break;
}
}
return netInfo;
}
关于NetworkInterfaceInfo. NetworkInterfaceSubType的各种网络类型的说明给出以下表格:
网络类型 |
说明 |
Unknown |
没有有关网络接口类型的其他信息。 |
Cellular_GPRS |
使用通用分组无线业务 (General Packet Radio Service, GPRS) 蜂窝技术的网络接口。这是 2.5G 技术。 |
Cellular_1XRTT |
使用无线传输技术 (Radio Transmission Technology, 1xRTT) 蜂窝技术的网络接口。这是 2.5G 技术。 |
Cellular_EVDO |
Evolution Data Only (EV-DO) 蜂窝技术的网络接口。这是 3G 技术。 |
Cellular_EDGE |
使用增强型数据速率 GSM 演进 (Enhanced Data rates for GSM Evolution, EDGE) 蜂窝技术的网络接口。这是2.5G 技术。 |
Cellular_3G |
使用第三代 (3G) 蜂窝技术的网络接口。 |
Cellular_HSPA |
使用高速下行分组接入 (High-Speed Downlink Packet Access, HSPA) 蜂窝技术的网络接口。这是 3.5G 技术。 |
Cellular_EVDV |
使用数据和语音演进 (Evolution Data and Voice, EV-DV) 蜂窝技术的网络接口。这是 3G 技术。 |
Desktop_PassThru |
桌面 pass- through 网络接口。 |
WiFi |
使用无线技术 (802.11) 的网络接口。 |
Cellular_LTE |
使用长期进化 (Long Term Evolution,LTE) 蜂窝技术的网络接口。这是 4G 技术。 |
Cellular_EHRPD |
使用增强型高速率数据包 (Enhanced High Rate Packet Data,EHRPD) 蜂窝技术的网络接口。这是 4G 技术。 |
下面给出通过回调的方式获取网络类型信息的实现方式。
public static NetworkInfo NetInfo = null;
public static void getNetworkType()
{
DeviceNetworkInformation.ResolveHostNameAsync(
new DnsEndPoint("www.microsoft.com", ),
new NameResolutionCallback(handle =>
{
NetworkInterfaceInfo info = handle.NetworkInterface;
NetInfo = parseNetworkInfo(info);
}), null);
}
下面给出如何将基于异步回调的方式转换为同步方式来获取网络类型信息,此种转换方式不仅仅只用于此处,对于所有的基于异步回调的处理都可以安装此种处理来转换成同步获取。实例代码如下:
public static async Task<NetworkInfo> getNetworkTypeAsync()
{
NetworkInfo result = await Task.Factory.StartNew<NetworkInfo>(() =>
{
NetworkInfo netInfo = null;
EventWaitHandle Wait = new AutoResetEvent(false);
DeviceNetworkInformation.ResolveHostNameAsync(
new DnsEndPoint("www.microsoft.com", ),
new NameResolutionCallback(handle =>
{
NetworkInterfaceInfo info = handle.NetworkInterface;
netInfo = parseNetworkInfo(info);
Wait.Set(); }), null);
Wait.WaitOne();
return netInfo;
});
return result;
}