Эта статья является Днем № 10 в серии под названием 31 Дней Манго .
Сегодня мы рассмотрим пространство имен NetworkInformation в Windows Phone 7.1 SDK. Этот набор API-интерфейсов дает нам представление о большом количестве данных на устройстве пользователя, так как он связан с доступностью, типом и другими данными сетевого подключения.
Что такое пространство имен NetworkInformation?
В конечном счете, это коллекция классов для Windows Phone, которые дают вам массу информации о сетевом подключении определенного устройства. В этой статье мы рассмотрим два раздела этого пространства имен:
- DeviceNetworkInformation — набор свойств, которые позволяют нам проверить, какие подключения включены на устройстве пользователя.
- NetworkInterfaceList — фактический список всех сетей, к которым подключено устройство пользователя. Это включает в себя их перевозчик, а также беспроводные сети.
Хотя есть очевидные причины знать о подключении пользователя, я слышал несколько довольно интересных способов использования этой информации в вашем приложении. Например, подумайте о приложении, которое выполняет какой-то академический тест. Вы не хотите, чтобы пользователь мог использовать Интернет для ответа на вопросы, поэтому вы можете обнаружить, что у телефона нет сетевых подключений. Или, возможно, у вас есть приложение, которое позволяет пользователям загружать новые электронные книги. Знание того, есть ли у пользователя соединение, может дать вам подсказку, что ему нужно подключиться к Интернету, прежде чем он сможет просматривать ваш каталог.
Использование DeviceNetworkInformation
DeviceNetworkInformation — это набор из пяти логических и строковых значений, которые мы можем использовать, чтобы определить, какие типы сетевых подключений доступны в данный момент пользователю. Список и описание каждого из этих значений ниже:
| CellularMobileOperator | Дает вам имя сотового провайдера, к которому в данный момент подключено устройство. | строка | 
| IsNetworkAvailable | Наиболее распространенное значение, которое вы будете использовать, это только определяет, имеет ли устройство сетевое подключение. Это не определяет доступ в интернет, только то, что телефон подключен к сети. | логический | 
| IsCellularDataEnabled | Показывает, есть ли на устройстве пользователя сотовые данные. | логический | 
| IsCellularDataRoamingEnabled | Показывает, разрешает ли пользователь роуминг сотовых данных. По умолчанию это обычно значение false. | логический | 
| IsWifiEnabled | Определяет, включен ли на устройстве Wi-Fi. | логический | 
| NetworkAvailabilityChanged | Это обработчик событий, который мы можем использовать для распознавания изменений в сетевом подключении устройства. | 
Чтобы начать создавать наше приложение, на этот раз я сделал пользовательский интерфейс невероятно простым. Мы только добавляем TextBlock внутри элемента управления ScrollViewer. Если вы создавали приложения вместе с предыдущими статьями, вы знакомы с инструкцией. Следующий код является вашим XAML-интерфейсом для файла MainPage.xaml.
<phone:PhoneApplicationPage
   x:Class="Day10_NetworkInformation.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
   xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
   FontFamily="{StaticResource PhoneFontFamilyNormal}"
   FontSize="{StaticResource PhoneFontSizeNormal}"
   Foreground="{StaticResource PhoneForegroundBrush}"
   SupportedOrientations="Portrait" Orientation="Portrait"
   shell:SystemTray.IsVisible="True">
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="31 DAYS OF MANGO - DAY #10" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="network information" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ScrollViewer>
                <TextBlock x:Name="ContentBox" FontSize="20" />
            </ScrollViewer>
        </Grid>
    </Grid>
</phone:PhoneApplicationPage> 
Мы будем записывать все наши значения в этот TextBlock в этом приложении, поэтому мы не будем пересматривать пользовательский интерфейс. На самом деле довольно скучно, но это позволяет нам сосредоточиться на цели этой статьи, которая использует C # для определения сетевых возможностей устройства нашего пользователя.
В приведенном ниже примере вы увидите, что я регистрирую обработчик события NetworkAvailabilityChanged в методе MainPage (), а затем извлекаю все значения из класса DeviceNetworkInformation. Вы можете использовать этот код в вашем файле MainPage.xaml.cs.
using System;
using System.Text;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Net.NetworkInformation;
namespace Day10_NetworkInformation
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
            DeviceNetworkInformation.NetworkAvailabilityChanged += new EventHandler<NetworkNotificationEventArgs>(DeviceNetworkInformation_NetworkAvailabilityChanged);
            GetData();
        }
        private void GetData()
        {
            StringBuilder info = new StringBuilder();
            
            if (DeviceNetworkInformation.CellularMobileOperator != null)
                info.AppendLine("carrier: " + DeviceNetworkInformation.CellularMobileOperator.ToLower());
            info.AppendLine("network: " + DeviceNetworkInformation.IsNetworkAvailable.ToString());
            info.AppendLine("roaming: " + DeviceNetworkInformation.IsCellularDataRoamingEnabled.ToString());
            info.AppendLine("cellular: " + DeviceNetworkInformation.IsCellularDataEnabled.ToString());
            info.AppendLine("wifi: " + DeviceNetworkInformation.IsWiFiEnabled.ToString());
            ContentBox.Text = info.ToString();
        }
        void DeviceNetworkInformation_NetworkAvailabilityChanged(object sender, NetworkNotificationEventArgs e)
        {
            GetData();
        }
    }
}
 
Если вы писали код вместе с этой статьей, вы можете запустить свой проект на этом этапе. Вы увидите экран, похожий на изображение ниже, если вы используете эмулятор Windows Phone.
В следующем разделе мы рассмотрим NetworkInterfaceList, который содержит информацию о каждой из сетей, к которым в данный момент подключено устройство.
Использование NetworkInterfaceList
NetworkInterfaceList содержит список каждой из отдельных сетей, к которым подключено устройство пользователя. Это включает в себя беспроводные сети, сотовые сети и даже Ethernet-соединение, которое используют телефоны Windows при подключении к ПК.
В нашем примере мы собираемся перебрать всю коллекцию сетей, но, поскольку NetworkInterfaceList является IEnumerable, вы можете анализировать его практически любым способом, каким вы хотите использовать LINQ. В приведенном ниже коде вы увидите, что я просто перебираю весь список, записывая каждый из них на экран, чтобы пользователь мог видеть все, к чему он в данный момент подключен. Я включил только метод GetData () из предыдущего примера, поэтому обязательно замените его в коде, который вы пишете.
private void GetData()
{
    StringBuilder info = new StringBuilder();
    if (DeviceNetworkInformation.CellularMobileOperator != null)
        info.AppendLine("carrier: " + DeviceNetworkInformation.CellularMobileOperator.ToLower());
    info.AppendLine("network: " + DeviceNetworkInformation.IsNetworkAvailable.ToString());
    info.AppendLine("roaming: " + DeviceNetworkInformation.IsCellularDataRoamingEnabled.ToString());
    info.AppendLine("cellular: " + DeviceNetworkInformation.IsCellularDataEnabled.ToString());
    info.AppendLine("wifi: " + DeviceNetworkInformation.IsWiFiEnabled.ToString());
    info.AppendLine();
    foreach (var n in new NetworkInterfaceList())
    {
        info.AppendLine(n.InterfaceName.ToLower());
        info.AppendLine(n.InterfaceType.ToString());
        info.AppendLine(n.InterfaceState.ToString());
        info.AppendLine();
    }
    ContentBox.Text = info.ToString();
}
 
Используя эмулятор, вы получите следующие сети, перечисленные в вашем приложении:
На реальном устройстве вы, вероятно, получите около 4 сетей в вашем списке. Например, у меня есть беспроводное соединение, интернет-соединение моего оператора, MMS-соединение моего оператора и программный интерфейс обратной связи (о котором вы можете прочитать здесь ).
Резюме
Сегодня я показал пространство имен NetworkInformation и то, как мы можем использовать его в наших приложениях, чтобы определить, подключено ли пользовательское устройство к сети или, в некоторых случаях, не подключено.
Если вы хотите загрузить полный пример приложения, созданного в этой статье, вы можете загрузить его с помощью кнопки «Загрузить код» ниже.
Завтра мы рассмотрим Live Tiles и то, как мы можем сейчас создавать и редактировать их из наших приложений. Увидимся позже!
Источник: 
http://www.jeffblankenburg.com/2011/11/10/31-days-of-mango-day-10-network-information/
                




