이 항목은 아직 평가되지 않았습니다.- 이 항목 평가

Windows Phone의 네트워크 변경 내용을 검색하는 방법

2013-12-05

적용 대상: Windows Phone 8 | Windows Phone OS 7.1

 

Windows Phone 앱을 만들 때는 사용 가능한 네트워크가 변경되는 시기를 파악해야 할 수 있습니다. 앱이 알려진 Wi-Fi 네트워크 범위 안에 진입하는 등의 경우 네트워크가 변경될 수 있습니다. 그러면 해당 네트워크를 바로 사용할 수 있게 되어 앱이 고대역폭의 네트워크 인터페이스를 통신에 사용할 수 있습니다. NetworkAvailabilityChanged 이벤트에 등록하면 네트워크 가용성의 변경 내용을 수신할 수 있습니다. 이 항목에서는 이 이벤트에 등록하는 방법과 네트워크 변경 내용의 의미 및 이벤트 발생 시기를 해석하는 방법을 설명합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

 

이 섹션에서는 네트워크 가용성의 변경 내용을 수신 및 표시하는 방법을 설명하기 위한 UI를 만듭니다. 앱은 시작할 때 사용 가능한 모든 네트워크 인터페이스의 목록을 표시합니다. 또한 네트워크 가용성의 변경 내용에 대한 알림 수신도 구독합니다. 네트워크가 변경되면 NetworkAvailabilityChanged 이벤트가 발생합니다. 앱은 이 이벤트를 처리하고 변경 내용을 UI의 목록에 문자열로 출력합니다. 이 앱을 사용하면 ConnectionSettingsTask를 실행하여 네트워크 설정을 수동으로 켜거나 끌 수도 있습니다.

앱 UI를 만들려면

  1. Visual Studio 에서 파일 | 새 프로젝트 메뉴 명령을 선택하여 새 프로젝트를 만듭니다.

  2. 새 프로젝트 창이 표시됩니다. Visual C# 템플릿을 확장한 다음 Windows Phone 템플릿을 선택합니다.

  3. Windows Phone 앱  템플릿을 선택합니다. 선택한 이름을 이름에 입력합니다.

  4. 확인을 클릭합니다. 새 프로젝트가 만들어지고 MainPage.xaml이 Visual Studio 디자이너 창에서 열립니다.

  5. MainPage.xaml에서 "LayoutRoot"라는 Grid의 XAML 코드를 제거하고 다음 코드로 바꿉니다.

    
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
    
        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="Network Change Detector" Style="{StaticResource PhoneTextNormalStyle}"/>
        </StackPanel>
    
        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Text="Available Network Interfaces" FontSize="{StaticResource PhoneFontSizeLarge}"/>
            <ListBox Grid.Row="1" x:Name="lbNetworkInterfaces" ItemsSource="{Binding}" Background="LightGray" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding}" Margin="5,5,0,5" Foreground="Black"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <TextBlock Grid.Row="2" Text="Events" FontSize="{StaticResource PhoneFontSizeLarge}"/>
            <ScrollViewer Grid.Row="3" Background="LightGray" BorderThickness="1">
                <ListBox x:Name="lbNetworkChanges" ItemsSource="{Binding}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}" Foreground="Black" 
                                        FontSize="{StaticResource PhoneFontSizeNormal}" TextWrapping="Wrap" Margin="5,10,0,10"  />
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </ScrollViewer>
            <TextBlock Grid.Row="4" Text="Networking Status" FontSize="{StaticResource PhoneFontSizeLarge}"/>
            <Grid Grid.Row="5" Background="LightGray" >
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="IsNetworkAvailable" Foreground="Black" Margin="5,5,0,5" />
                <TextBlock Grid.Row="0" Grid.Column="1" x:Name="tbIsNetworkAvailable" HorizontalAlignment="Center" Foreground="Black" />
                    
                <TextBlock Grid.Row="1" Grid.Column="0" Text="IsWiFiEnabled" Foreground="Black" Margin="5,5,0,5" />
                <TextBlock Grid.Row="1" Grid.Column="1" x:Name="tbIsWiFiEnabled" HorizontalAlignment="Center" Foreground="Black"/>
                    
                <TextBlock Grid.Row="2" Grid.Column="0" Text="IsCellularDataEnabled" Foreground="Black" Margin="5,5,0,5" />
                <TextBlock Grid.Row="2" Grid.Column="1" x:Name="tbIsCellularDataEnabled" HorizontalAlignment="Center" Foreground="Black"/>
            </Grid>
            <Button Grid.Row="6" x:Name="btnChangeNetworkSettings" Content="Change Network Settings" Click="btnChangeNetworkSettings_Click"/>
        </Grid>
    </Grid>
    
    
    

    위의 XAML 코드는 다음 스크린샷과 같은 간단한 사용자 인터페이스를 만듭니다.

    Network Detector User Interface

    UI는 네 부분으로 나뉩니다. 화면 맨 위에는 사용 가능한 모든 네트워크 인터페이스가 표시됩니다. 이 데이터는 NetworkInterfaceList 컬렉션에서 검색되며, 앱이 시작될 때와 앱에서 NetworkAvailabilityChanged 이벤트를 받을 때마다 로드됩니다. 다음 화면 섹션에는 앱에서 받은 NetworkAvailabilityChanged 이벤트에 대한 정보가 표시됩니다. 화면의 그 다음 부분에는 장치 네트워크 기능의 전반적인 상태가 표시됩니다. 마지막으로 화면 맨 아래에는 ConnectionSettingsTask를 실행할 수 있는 버튼이 배치됩니다. 이 버튼은 네트워크 설정을 수동으로 변경하고 NetworkAvailabilityChanged 이벤트를 발생시킵니다. 다음 섹션에서는 이 UI를 구동하는 코드에 대해 설명합니다.

네트워크 가용성의 변경 내용을 검색할 수 있도록 앱을 사용하여 NetworkAvailabilityChanged 이벤트에 등록합니다.

네트워크 가용성의 변경 내용을 받도록 등록하려면

  1. MainPage의 코드 숨김 파일을 열고 페이지 맨 위에 다음 using 지시문을 추가합니다.

    
    using System.Collections.ObjectModel;
    using Microsoft.Phone.Net.NetworkInformation;
    using Microsoft.Phone.Tasks;
    
    
  2. MainPage 클래스 맨 위에 다음 변수 선언을 추가합니다.

    
    // List of all changes detected while the app is running.
    public ObservableCollection<string> Changes { get; set; }
    
    // List of all currently available network interfaces
    public ObservableCollection<string> NetworkInterfaces { get; set; }
    
    
    
  3. 코드 숨김 클래스의 MainPage 생성자를 다음 코드로 바꿉니다. 이 메서드는 페이지를 초기화하고, 이전 단계에서 선언한 목록에 UI를 바인딩하며, NetworkAvailabilityChanged 이벤트를 구독합니다. 이 이벤트의 콜백 메서드는 ChangeDetected로 정의됩니다. 이 메서드에 대해서는 이후 단계에서 설명합니다. 이 메서드는 마지막으로 두 개의 메서드를 호출하여 네트워크 인터페이스네트워킹 상태 영역을 초기화합니다. 이 두 메서드는 다음 단계에서 정의합니다. 이제 네트워크 가용성의 변경 내용을 받도록 등록했습니다. 다음 섹션에서는 검색된 변경 내용을 해석하는 방법을 설명합니다.

    
    // Constructor
    public MainPage()
    {
        InitializeComponent();
    
        // Initialise the Changes list.
        Changes = new ObservableCollection<string>();
    
        // Bind the ListBox to the Changes list
        lbNetworkChanges.DataContext = Changes;
    
        NetworkInterfaces = new ObservableCollection<string>();
        lbNetworkInterfaces.DataContext = NetworkInterfaces;
    
        // Subscribe to the NetworkAvailabilityChanged event
        DeviceNetworkInformation.NetworkAvailabilityChanged += new EventHandler<NetworkNotificationEventArgs>(ChangeDetected);
    
        UpdateNetworkInterfaces();
        UpdateNetworkStatus();
    }
    
    
    

이전 섹션에서는 NetworkAvailabilityChanged 이벤트에 등록했습니다. 따라서 변경 내용이 검색될 때마다 이 이벤트에 등록할 때 정의한 콜백이 호출됩니다. 이 섹션에서는 해당 콜백 메서드에서 수신된 데이터를 처리하는 방법을 설명합니다.

네트워크 가용성의 변경 내용을 처리하려면

  1. 코드 숨김 파일에서 다음 메서드를 추가합니다. 이 메서드는 NetworkAvailabilityChanged 이벤트를 구독할 때 제공한 콜백 메서드입니다. NetworkNotificationEventArgs 매개 변수는 알림을 받게 될 변경 내용과 관련된 모든 정보를 포함합니다. 이 예제에서는 검색된 변경 내용의 종류와 해당 변경이 발생한 인터페이스의 이름 및 유형을 사용자에게 알려 주는 정보 문자열을 생성합니다. UI의 이벤트 영역에 바인딩되는 Changes 목록에 이 정보 문자열을 추가합니다. 그러므로 이 문자열을 추가하는 즉시 UI의 이벤트 영역이 해당 추가 정보로 업데이트됩니다. 네트워크 인터페이스 목록과 UI의 네트워킹 상태 영역도 이 시점에 업데이트됩니다. 이러한 작업은 UI 상호 작용에 따른 것인데 UI 스레드에서는 이벤트가 발생하지 않으므로, BeginInvoke에서 상호 작용을 래핑하여 UI 스레드에서 UI 상호 작용이 수행되도록 합니다. 이렇게 하지 않으면 앱에서 크로스 스레드 위반 예외가 발생할 수 있습니다.

    
    // In this callback, we examine the change that was detected. In this example, we are 
    // creating a simple information string and adding that to the event list on the UI. 
    // In a real application, this is where you might adjust your communication connection 
    // in order to take advantage of a network availability change. 
    void ChangeDetected(object sender, NetworkNotificationEventArgs e)
    {
        string change = string.Empty;
        switch (e.NotificationType)
        {
            case NetworkNotificationType.InterfaceConnected:
                change = "Connected to ";
                break;
            case NetworkNotificationType.InterfaceDisconnected:
                change = "Disconnected from ";
                break;
            case NetworkNotificationType.CharacteristicUpdate:
                change = "Characteristics changed for ";
                break;
            default:
                change = "Unknown change with ";
                break;
        }
    
        string changeInformation = String.Format(" {0} {1} {2} ({3})",
                    DateTime.Now.ToString(), change, e.NetworkInterface.InterfaceName,
                    e.NetworkInterface.InterfaceType.ToString());
    
        // We are making UI updates, so make sure these happen on the UI thread.
        Dispatcher.BeginInvoke(() =>
        {
            Changes.Add(changeInformation);
            UpdateNetworkStatus();
            UpdateNetworkInterfaces();
                    
        });
               
    }
    
    
    
  2. MainPage 클래스에 다음 메서드를 추가합니다. 이러한 메서드는 UI의 네트워크 인터페이스네트워킹 상태 영역을 업데이트합니다. 앱이 시작될 때와 네트워크 가용성이 변경될 때마다 이러한 메서드를 호출합니다. UpdateNetworkInterfacesNetworkInterfaceList 개체를 인스턴스화하여 이 클래스의 클래스 수준 범위에서 정의한 NetworkInterfaces 목록을 채웁니다. UI의 네트워크 인터페이스 영역은 이 목록에 바인딩되고 목록은 ObservableCollection<T>이므로, 변경되는 즉시 UI가 해당 변경 내용으로 업데이트됩니다. UpdateNetworkStatus 메서드는 DeviceNetworkInformation 개체의 정적 속성을 사용하여 UI의 네트워킹 상태 영역을 업데이트합니다. 이러한 정적 속성은 부울 값이지만 여기서는 편의상 인라인 속성을 "Yes" 및 "No" 문자열로 변환합니다. 또는 string typeconverterboolean을 사용하는 방법도 있습니다.

    
    private void UpdateNetworkInterfaces()
    {
    
        NetworkInterfaces.Clear();
        NetworkInterfaceList networkInterfaceList = new NetworkInterfaceList();
        foreach (NetworkInterfaceInfo networkInterfaceInfo in networkInterfaceList)
        {
            NetworkInterfaces.Add(networkInterfaceInfo.InterfaceName);
        }
    }
    
    private void UpdateNetworkStatus()
    {
        tbIsCellularDataEnabled.Text = (DeviceNetworkInformation.IsCellularDataEnabled) ? "Yes" : "No";
        tbIsNetworkAvailable.Text = (DeviceNetworkInformation.IsNetworkAvailable) ? "Yes" : "No";
        tbIsWiFiEnabled.Text = (DeviceNetworkInformation.IsWiFiEnabled) ? "Yes" : "No";
    }
    
    

이 섹션에서는 앱에서 NetworkAvailabilityChanged 이벤트가 발생하도록 네트워크를 변경하는 방법을 설명합니다. 여기서는 ConnectionSettingsTask를 사용하여 장치에서 AirplaneMode를 설정 및 해제합니다. 이 작업을 완료한 후 앱 기본 페이지로 돌아오면 화면의 이벤트 영역에서 발생한 이벤트를 확인할 수 있습니다. 이와 같이 네트워크의 변경 내용을 설명하는 방법에는 제한이 있습니다. 특히 ConnectionSettingsTask를 실행하면 앱이 백그라운드에 배치됩니다. 응용프로그램이 백그라운드에 있는 동안에는 이벤트가 수신되지 않습니다. 앱으로 다시 이동하면 앱이 다시 포그라운드에 배치됩니다. 즉, 일부 네트워크 가용성의 변경 내용이 catch되지 않는 시간이 있습니다. 그러나 앱 동작을 설명하는 데에는 이 메서드로도 충분합니다. 실제 앱에서는 Wi-Fi 연결이 설정/해제되거나 네트워크 연결 범위 외부로 이동할 때마다, 또는 연결 특성이 변경되는 경우 네트워크가 변경됩니다. 네트워크 특성이 변경되는 예로는 셀룰러 네트워크에서 로밍하는 경우를 들 수 있습니다.

중요중요:

이 앱은 에뮬레이터가 아닌 실제 단말기에서 테스트하는 것이 좋습니다. 에뮬레이터에서는 이러한 이벤트가 발생하지 않기 때문입니다. 에뮬레이터 대신 URB 연결을 사용하여 실제 장치를 데스크톱에 연결하는 방식을 통해 디버깅을 수행하세요.

앱을 테스트하려면

  1. 앱에서 MainPage의 코드 숨김 파일에 다음 이벤트 처리기를 추가합니다. 이 메서드는 비행기 모드에서 ConnectionSettingsTask를 실행합니다. 이 작업을 사용하여 비행기 모드를 설정하고 해제할 수 있습니다. 비행기 모드가 설정되면 모든 네트워크 연결이 꺼집니다. 비행기 모드가 해제되면 네트워크 연결이 모두 복원됩니다. 이 방법을 사용하는 경우 비행기 모드 설정을 변경하고, 앱을 다시 탐색하며, 비행기 모드로 변경하여 발생한 네트워크 가용성의 변경 내용을 확인할 수 있습니다.

    
    // For testing purposes, we provide a way to change the network connection
    // settings by launching the ConnectionSettingsTask. However, because we are moving 
    // our application to the background and then to the foreground when we navigate back from
    // the ConnectionSettingTask, there is a chance we may not receive all NetworkAvailabilityChanged events.
    // Alternatively, you can test by physically disconnecting a Wi-Fi connection, by connecting and disconnecting
    // your device to your desktop, or by moving out of range of your Wi-Fi network.
    private void btnChangeNetworkSettings_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("This action will launch the ConnectionSettingsTask where you can change the network settings." + 
                            " As soon as you have made your changes, use the hardware Back button to get back to this page so that you can observe the NetworkAvailabilityChanged events.");
    
        //Use the ConnectionSettingsTask to bring up the connection settings
        ConnectionSettingsTask connectionSettings = new ConnectionSettingsTask();
    
        // We are using the Connection Settings page for AirplaneMode.
        connectionSettings.ConnectionSettingsType = ConnectionSettingsType.AirplaneMode;
        connectionSettings.Show();
    
        // Note: Once you have changed the settings (switched from On to Off for example)
        // use the hardward Back button on your device to go back to this page and catch
        // the NetworkAvailabilityChanged events.
    }
    
    
    
  2. 디버그 | 디버깅 시작(F5) 메뉴 명령을 선택하여 앱을 실행합니다. 그러면 앱이 실행되고 현재 사용 가능한 네트워크 인터페이스가 UI의 네트워크 인터페이스 영역에 표시됩니다. 현재 네트워킹 상태도 UI의 네트워킹 상태 영역에 표시됩니다.

  3. 실제 장치를 사용하는 경우에는 물리적으로 Wi-Fi 네트워크를 끄거나, 네트워크 범위 외부로 이동하거나, 장치에서 USB 연결을 해제(데스크톱에 테더링된 경우)하는 등 다른 여러 가지 방법으로 네트워크 변경 작업을 시작할 수 있습니다. 또는 앱에서 네트워크 설정 변경 버튼을 눌러 ConnectionSettingsTask를 실행할 수 있습니다. 비행기 모드 켜기/끄기를 전환한 다음 단말기 하드웨어의 뒤로 버튼을 사용해 앱으로 최대한 빨리 돌아옵니다.

  4. 네트워크 가용성이 변경되면 앱의 이벤트 영역에서 해당 변경 내용을 확인할 수 있습니다. 변경 내용이 수신될 때마다 네트워크 인터페이스네트워킹 상태 영역도 업데이트됩니다.

    팁팁:

    비행기 모드를 사용해 테스트하지 않으려는 경우에는 위의 코드를 변경하여 셀룰러 또는 Wi-Fi에서 ConnectionSettingsTask를 실행할 수 있습니다.

이 정보가 도움이 되었습니까?
(1500자 남음)
의견을 주셔서 감사합니다.
표시:
© 2014 Microsoft. All rights reserved.