在Windows Phone 開發中有時候需要獲取設備當前連接網絡的類型,是Wifi,還是2G,3G,或者4G,SDK中提供獲取網絡類型的API(Microsoft.Phone.Net.NetworkInformation. DeviceNetworkInformation),通過此API我們可以方便的獲取相關信息。但是此API是基於異步回調的方式獲取的,如果需要同步獲取,那么就需要做一些特殊的處理。
以下代碼定義網絡類型信息類,用於存儲獲取的網絡類型信息。
1 /// <summary> 2 /// 網絡類型 3 /// </summary> 4 public enum NetworkType 5 { 6 None = 0, 7 Wifi = 1, //Wifi 8 Mobile2G = 2, //2G網絡 9 Mobile3G = 3, //3G網絡 10 Mobile4G = 4 //4G網絡 11 } 12 13 /// <summary> 14 /// 網絡類型信息 15 /// </summary> 16 public class NetworkInfo 17 { 18 /// <summary> 19 /// 網絡接口的名稱 20 /// </summary> 21 public string InterfaceName { get; set; } 22 23 /// <summary> 24 /// 網絡接口的說明 25 /// </summary> 26 public string Description { get; set; } 27 28 /// <summary> 29 /// 網絡類型 30 /// </summary> 31 public NetworkType InterfaceType { get; set; } 32 }
以下代碼將從系統NetworkInterfaceInfo解析獲取網絡類型信息並寫入到上面構造的NetworkInfo類中。
1 private static NetworkInfo parseNetworkInfo(NetworkInterfaceInfo info) 2 { 3 NetworkInfo netInfo = new NetworkInfo(); 4 if (info != null) 5 { 6 netInfo.InterfaceName = info.InterfaceName; 7 netInfo.Description = info.Description; 8 switch (info.InterfaceType) 9 { 10 case NetworkInterfaceType.MobileBroadbandCdma: 11 case NetworkInterfaceType.MobileBroadbandGsm: 12 switch (info.InterfaceSubtype) 13 { 14 case NetworkInterfaceSubType.Cellular_GPRS: 15 case NetworkInterfaceSubType.Cellular_1XRTT: 16 case NetworkInterfaceSubType.Cellular_EDGE: 17 netInfo.InterfaceType = NetworkType.Mobile2G; 18 break; 19 case NetworkInterfaceSubType.Cellular_3G: 20 case NetworkInterfaceSubType.Cellular_EVDO: 21 case NetworkInterfaceSubType.Cellular_EVDV: 22 case NetworkInterfaceSubType.Cellular_HSPA: 23 netInfo.InterfaceType = NetworkType.Mobile3G; 24 break; 25 case NetworkInterfaceSubType.Cellular_LTE: 26 case NetworkInterfaceSubType.Cellular_EHRPD: 27 netInfo.InterfaceType = NetworkType.Mobile4G; 28 break; 29 default: 30 netInfo.InterfaceType = NetworkType.None; 31 break; 32 } 33 break; 34 case NetworkInterfaceType.Wireless80211: 35 netInfo.InterfaceType = NetworkType.Wifi; 36 break; 37 default: 38 netInfo.InterfaceType = NetworkType.None; 39 break; 40 } 41 } 42 return netInfo; 43 }
關於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 技術。 |
下面給出通過回調的方式獲取網絡類型信息的實現方式。
1 public static NetworkInfo NetInfo = null; 2 public static void getNetworkType() 3 { 4 DeviceNetworkInformation.ResolveHostNameAsync( 5 new DnsEndPoint("www.microsoft.com", 80), 6 new NameResolutionCallback(handle => 7 { 8 NetworkInterfaceInfo info = handle.NetworkInterface; 9 NetInfo = parseNetworkInfo(info); 10 }), null); 11 }
下面給出如何將基於異步回調的方式轉換為同步方式來獲取網絡類型信息,此種轉換方式不僅僅只用於此處,對於所有的基於異步回調的處理都可以安裝此種處理來轉換成同步獲取。實例代碼如下:
1 public static async Task<NetworkInfo> getNetworkTypeAsync() 2 { 3 NetworkInfo result = await Task.Factory.StartNew<NetworkInfo>(() => 4 { 5 NetworkInfo netInfo = null; 6 EventWaitHandle Wait = new AutoResetEvent(false); 7 DeviceNetworkInformation.ResolveHostNameAsync( 8 new DnsEndPoint("www.microsoft.com", 80), 9 new NameResolutionCallback(handle => 10 { 11 NetworkInterfaceInfo info = handle.NetworkInterface; 12 netInfo = parseNetworkInfo(info); 13 Wait.Set(); 14 15 }), null); 16 Wait.WaitOne(); 17 return netInfo; 18 }); 19 return result; 20 }