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