Windows Phone 7 - 取得Device的NetworkInformation

Windows Phone 7 - 取得Device的NetworkInformation

 

 

在<Windows Phone 7 - 取得Device相關資訊>介紹了DeviceStatus API之後,接下來往下介紹有關Device網路狀況的擷取。

為何要了解這個資訊呢,因為撰寫App當需要與Server或Remote Resouce互動時,一開始就先識別目前Device的網路狀態,

有助於節省呼叫了服務或進行了下載才在那等20秒HTTP RESPONSE;或者為App註冊一個監控網路狀態變動的Event Handler,

在網路變動時告知目前用戶的操作情境…等範例,這些都是常見於App或過去WinForm程式之中。

 

然而,在Windows Phone 7裡針對Device網路狀態(可用或使用中)可以透過<Microsoft.Phone.Net.NetworkInformation>命名空間

來加以處理,以下將針對裡面重要的類別加以說明:

 

DeviceNetworkInformation

    該類別包括了Windows Phone設備特定的網路資訊,也就是可取得特定的網路類型,例如:行動網路(Cellular)、無線網路(WIFI)。

除此之外,透過該類別的屬性與方法可以取目前可用/使用網路的類型、主機名稱、IP Address等,還可以註冊事件來監控網路狀態的

改變,其中幾個重要的屬性與方法,如下說明:

    a. 重點屬性:(這些屬性都是Ready-Only)

        a-1. CellularMobileOperator:取得行動網路營運商的名稱。

        a-2. IsCellularDataEnabled:取得是否正啟動Cellular Data(行動網路)。

        a-3. IsCellularDataRoamingEnabled:取得是否允許Cellular Data Roaming(數據漫遊)。

        a-4. IsNetworkAvailable:取得是否有網路功能可用。

        a-5. IsWiFiEnabled:取得是否正啟動WiFi網路。

 

    b. NetworkAvailabilityChanged

        註冊處理當網路狀態改變時觸發的事件。例如註冊處理網路狀態由Cellular Data轉成WiFi時使用訊息通知。

        該事件註冊後要處理的參數有二個,一個是object,一個是NetworkNotificationEventArgs,其中以NetworkNotificationEventArgs

        最為重要,因為該參數夾帶了二個重要的資訊:NetworkInterfaceInfo、NetworkNotificationType。

        b-1. NetworkInterfaceInfo:取得目前設備網路介面的所有可用資訊。例如:Bandwidth(網路的速度)、NetworkCharacteristics

                                                     InterfaceName、InterfaceState(網路狀態)、InterfaceType(介面類型)…等。

        b-2. NetworkNotificationType:取得目前網路介面狀態的變更類型。其變更類型分成三種:

                                                     ‧InterfaceConnected:通知網路介面已為連線狀態。

                                                     ‧InterfaceDisconnected:通知網路介面已為斷線狀態。

                                                     ‧CharacteristicUpdate:當網路介面變動時發出通知,例如轉入漫遊。

  

    c. 範例程式:實作註冊監控網路狀態的變動事件與識別變動後的網路狀態。

   1: // Constructor
   2: public MainPage()
   3: {
   4:     InitializeComponent();
   5:     Initialization(false);
   6: }
   7:  
   8: private void Initialization(bool pIsRegist)
   9: {
  10:     //識別是否啟動行動網路
  11:     tgsIcde.IsChecked = DeviceNetworkInformation.IsCellularDataEnabled;
  12:     //識別是否啟動數據漫游
  13:     tgsIcdr.IsChecked = DeviceNetworkInformation.IsCellularDataRoamingEnabled;
  14:     //識別設備網路是否有網路功能
  15:     tgsIna.IsChecked = DeviceNetworkInformation.IsNetworkAvailable;
  16:     //識別是否啟動WiFi
  17:     tgsIwifi.IsChecked = DeviceNetworkInformation.IsWiFiEnabled;
  18:  
  19:     //避免測試狀態為airplane mode
  20:     if (DeviceNetworkInformation.CellularMobileOperator!= null)
  21:     {
  22:         //識別CellularMobileOperator的類型
  23:         switch (DeviceNetworkInformation.CellularMobileOperator.ToLower())
  24:         {
  25:             case "chunghwa":
  26:                 tblCellularOperator.Text = "中華";
  27:                 break;
  28:             case "taiwanmobile":
  29:                 tblCellularOperator.Text = "台哥大";
  30:                 break;
  31:             case "fetnet":
  32:                 tblCellularOperator.Text = "遠傳";
  33:                 break;
  34:         }
  35:     }
  36:  
  37:     if (pIsRegist == false)
  38:     {
  39:         //註冊監控網路狀態            
  40:         DeviceNetworkInformation.NetworkAvailabilityChanged += 
  41:             new EventHandler<NetworkNotificationEventArgs>(NetworkAvailabilityChanged);
  42:     }
  43: }
  44:  
  45: void NetworkAvailabilityChanged(object sender, NetworkNotificationEventArgs e)
  46: {
  47:     //取得info來識別目前網路資訊
  48:     NetworkInterfaceInfo tInfo = e.NetworkInterface;
  49:  
  50:     //取得網路狀態通知類型
  51:     NetworkNotificationType tNotification = e.NotificationType;
  52:     string tType = string.Empty;
  53:     switch (tNotification)
  54:     {
  55:         case NetworkNotificationType.CharacteristicUpdate:
  56:             tType += "CharacteristicUpdate \n";
  57:             break;
  58:         case NetworkNotificationType.InterfaceConnected:
  59:             tType += "InterfaceConnected \n";
  60:             break;
  61:         case NetworkNotificationType.InterfaceDisconnected:
  62:             tType += "InterfaceDisconnected \n";
  63:             break;               
  64:     }
  65:     Dispatcher.BeginInvoke(() =>
  66:     {
  67:         tblNetworkState.Text = tType;
  68:         Initialization(true);
  69:     });
  70: }
  71:  
  72: private void ApplicationBarIconButton_Click(object sender, EventArgs e)
  73: {
  74:     //利用ConnectionSettingsTask修改網路狀態來測試監控網路狀態事件
  75:     ConnectionSettingsTask tConnectionSettings = new ConnectionSettingsTask();
  76:     tConnectionSettings.ConnectionSettingsType = ConnectionSettingsType.AirplaneMode;
  77:     tConnectionSettings.Show();
  78: }

     執行結果:

     DeviceNetworkInfo (變更前)DeviceNetworkInfo (2) (變更後)

[範例程式]

 

[補充]

NetworkInterface

過去撰寫過Silverlight程式的話,其實Silverlight本身也有提供識別目前網路介面的可用性資訊。非常容易操作。可以直接使用以下程式:

   1: public static void IsNetworkAvailable()
   2: {
   3:     if (NetworkInterface.GetIsNetworkAvailable())
   4:     {
   5:         //有網路狀態
   6:      }
   7:     else
   8:     {
   9:         //沒有網路狀態
  10:     }
  11: }

 

======

以上是分享在WP7如何取得目前Deivce使用網路的狀態與可用的類型,並進一步去監控網路狀態的改變來調整App操作網路資源的方式。

由於自己比較多經驗在撰寫App與網路服務的互動,因此網路狀態的改變與使用的類型對於App呼叫服務的呈現方法就有所不同。

特別撰寫該篇內容來了解目前WP7中如何處理這一段的機制。如果有寫錯的地方也請大家指導。謝謝。

 

References:

Microsoft.Phone.Net.NetworkInformation Namespace

Network and Network Interface Information for Windows Phone

How to: Determine the Mobile Operator for Windows Phone

How to: Determine the Network Capabilities for Windows Phone

 

 

How To: Detect Network Changes for Windows Phone (必讀)

How to check if you have an network connection on WP7?

WP7 Development Tip of the Day: Checking for an internet connection

Network Security Access Restrictions in Silverlight (重點觀念)

Windows Phone 7 (Mango) Tutorial - 27 - How to Detect whether the Network is Available?

Windows Phone 7 (Mango) Tutorial - 14 - Detecting Network Information of the Device

 

Dotblogs Tags: