Статьи

31 Дней Манго | День № 10: Информация о сети

Эта статья является Днем № 10 в серии под названием 31 Дней Манго .

Day10-NetworkInformation

Сегодня мы рассмотрим пространство имен 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 и то, как мы можем сейчас создавать и редактировать их из наших приложений. Увидимся позже!

toolsbutton5

Источник:
http://www.jeffblankenburg.com/2011/11/10/31-days-of-mango-day-10-network-information/