Windows Phone 同步方式獲取網絡類型


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM