정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 근접성

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1만

 

근접성이란 서로 가까운 거리에 있는 장치 간의 연결을 지원하는 Windows 런타임 클래스 집합을 지칭합니다. 앱은 이 API를 사용하여 탭을 통해 연결을 설정하거나 무선 범위 내에서 앱을 실행 중인 다른 단말기(피어 앱)를 검색해 연결을 설정할 수 있습니다. 예를 들어 이러한 앱 중 하나는 두 사용자가 각자의 휴대폰을 동시에 탭하여 공유 게임 세션을 설정하는 멀티플레이어 게임일 수 있습니다. 또는 앱은 컴퓨터를 탭하고 추가 정보를 얻거나 항목을 구매할 수 있는 위치 링크를 수신하는 기능을 사용자에게 제공합니다. Windows Phone 8 에서는 NFC(근거리 통신)를 사용하는 근접성 통신을 지원합니다. 이 항목에서는 Windows Phone 용 근접 API에 대한 개요를 제공합니다.

참고참고:

이 항목에서는 의도적으로 단말기라는 용어를 사용하여 근접 통신이 Windows Phone 8 을 실행하는 휴대폰 간에 발생하고 Windows Phone 8 휴대폰과 다른 종류의 단말기(예: Windows 실행 컴퓨터) 간에 발생할 수 있음을 나타냅니다.

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

 

다음과 같은 방법으로 Windows Phone 8 에 대한 근접성 를 사용할 수 있습니다.

  • 단말기 연결. 예를 들어 근접성 를 사용하여 Wi-Fi 또는 Bluetooth를 통해 한 단말기의 앱을 다른 단말기의 다른 앱 인스턴스로 연결하는 프로세스를 간소화할 수 있습니다.

  • 콘텐츠 가져오기. 예를 들어 근접성 를 통해 휴대폰을 사용하여 포함된 NFC 태그에 디지털 콘텐츠가 포함된 “스마트” 포스터를 읽을 수 있습니다.

  • 디지털 개체 교환. 예를 들어 휴대폰을 사용하여 전자 명함 또는 vCard를 교환할 수 있습니다.

NFC(근거리 통신)는 전자 단말기 간에 직관적이고 단순하고 안전한 통신을 제공하는 단거리 무선 연결에 대한 국제 표준입니다. NFC는 휴대폰에서 근접성 시나리오를 가능하게 만드는 기술입니다. NFC에는 다음과 같은 주요 특징이 있습니다.

  • 단말기가 서로 3 ~ 4cm(1 ~ 1.5인치) 내에 있으면 통신이 발생합니다.

  • 사용자가 의도적으로 연결할 단말기를 함께 모으므로 통신이 매우 선택적이고 의도적입니다.

  • 이론적인 최대 데이터 전송 속도는 424kbits/s입니다 일반적인 데이터 전송 속도의 범위는 30kbits/s ~ 60kbits/s입니다

  • 통신은 NFC 단말기와 무전원 NFC 칩 또는 태그 간에 발생할 수도 있습니다.

다음 표에는 근접 시나리오에서 사용되는 기본 Windows 런타임 클래스가 나열됩니다.

클래스

설명

PeerFinder

주변 단말에서 앱의 다른 인스턴스를 검색하고 누르기 제스처 또는 탐색을 사용하여 피어 앱 간에 소켓 연결을 만들 수 있습니다. 피어 앱은 다른 단말기에서 실행 중인 앱의 다른 인스턴스입니다.

ProximityDevice

앱이 근사 범위 3 ~ 4cm 내에서 다른 단말기와 통신하고 탭하는 동안 데이터의 작은 페이로드를 교환할 수 있도록 합니다.

PeerInformation

피어를 식별하는 정보를 포함합니다.

ProximityMessage

구독에서 수신된 메시지를 나타냅니다.

ConnectionRequestedEventArgs

ConnectionRequested 이벤트와 함께 응용프로그램으로 전달되는 속성을 포함합니다.

TriggeredConnectionStateChangedEventArgs

TriggeredConnectionStateChanged 이벤트가 응용프로그램에 전달하는 속성을 포함합니다.

NFC 근접 시나리오에는 다음 기능이 필요합니다. 이러한 기능이 WMAppManifest.xml에 지정되지 않으면 응용프로그램이 제대로 작동하지 않거나 스토어 에 대한 제출 프로세스가 실패할 수 있습니다.

  • ID_CAP_NETWORKING

  • ID_CAP_PROXIMITY

근접 및 NFC를 사용하면 단말기를 탭하거나 서로 몇 밀리미터 내로 모아서 2개 단말기를 연결할 수 있습니다.  이 시나리오는 Windows Phone 8 및 Windows 8 단말기에서만 작동합니다.  탭이 성공하면 다른 단말기와 통신할 수 있는 소켓을 복원합니다. Windows Phone 8 에서 이 소켓은 TCP/IP(Wi-Fi) 연결 또는 Bluetooth 연결에서 설정됩니다. 근접 API는 PeerFinder.AllowBluetoothPeerFinder.AllowInfrastructure 속성의 값에 따라 설정할 연결을 결정합니다(기본적으로 true). 어디서나 탭하고 연결할 수 있다는 점에서 가장 일관적인 사용자 환경은 연결할 단말기에서 Bluetooth를 사용하는 경우 제공됩니다. 양쪽 단말기가 동일한 인프라 네트워크(동일 네트워크 또는 라우터, IP 충돌 없음, 방화벽 없음, 단말기가 서로 ping할 수 있음)에 있는 경우 Wi-Fi 연결이 가능합니다. 따라서 양쪽 단말기에서 Bluetooth가 사용되는지 확인하기 위해 탭하기 전에 앱이 사용자에게 메시지를 표시하는 것이 좋습니다. 페이지에 메시지를 표시하거나 MessageBox를 표시하여 이와 같이 할 수 있습니다. 이 방법은 해당 단말기를 통해 가장 좋은 탭 환경을 가져오는 방법을 사용자에게 알리는 투명한 방법입니다.

NFC 메시지 보내기 및 받기

이 예제에서는 2개 NFC 사용 단말기를 실행하는 앱 간에 데이터를 교환하는 방법을 보여 줍니다. ProximityDevice 클래스를 사용하여 앱 간에 단순 문자열을 전달합니다. API는 기본 형식을 제공하므로 이 시나리오는 매우 쉽게 구현할 수 있습니다.

메시지를 보내려면

Windows Phone 은 한 번에 하나의 WriteTag 메시지만 지원합니다. 새 WriteTag 메시지를 게시하기 전에 기존 메시지 게시를 중지해야 합니다.


ProximityDevice device = ProximityDevice.GetDefault();

// Make sure NFC is supported
if (device!= null)
{
  long Id = device.PublishMessage("Windows.SampleMessageType", "Hello World!");
  Debug.WriteLine("Published Message. ID is {0}", Id);

  // Store the unique message Id so that it 
  // can be used to stop publishing this message
}

메시지를 받으려면


ProximityDevice device = ProximityDevice.GetDefault();

// Make sure NFC is supported
if (device!= null)
{
  long Id = device.SubscribeForMessage ("Windows.SampleMessageType", messageReceived);
  Debug.WriteLine("Published Message. ID is {0}", Id);

  // Store the unique message Id so that it 
  // can be used to stop subscribing for this message type
}

private void messageReceived(ProximityDevice sender, ProximityMessage message)
{
  
  Debug.WriteLine("Received from {0}:'{1}'", sender.DeviceId, message.DataAsString);
}

Windows Phone 피어 앱 찾기

이 예제에서는 PeerFinder 클래스를 사용하여 피어 앱을 검색하는 방법을 보여 줍니다.

피어 검색을 시작하려면


ProximityDevice device = ProximityDevice.GetDefault();

// Make sure NFC is supported
if (device!= null)
{



     PeerFinder.TriggeredConnectionStateChanged += OnTriggeredConnectionStateChanged;

      // Start finding peer apps, while making this app discoverable by peers
      PeerFinder.Start();

}

연결 상태 변경을 처리하려면


StreamSocket _streamSocket;
        
void OnTriggeredConnectionStateChanged(object sender, TriggeredConnectionStateChangedEventArgs args)
{
    switch (args.State)
    {
        case TriggeredConnectState.Listening:
            // Connecting as host
            break;
         case TriggeredConnectState.PeerFound:
            // Proximity gesture is complete and user can pull their devices away. Remaining work is to 
            // establish the connection using a different transport, like TCP/IP or Bluetooth
             break;
         case TriggeredConnectState.Connecting:
            // Connecting as a client
            break;
          case TriggeredConnectState.Completed:
            // Connection completed, retrieve the socket over which to communicate
            _streamSocket = args.Socket;
             break;
         case TriggeredConnectState.Canceled:
              break;
         case TriggeredConnectState.Failed:
             // Connection was unsuccessful
             break;
       }
}

Windows 8 피어 앱 찾기

Windows 8과 같은 다른 플랫폼에서 피어 앱을 찾으려면 먼저 해당 플랫폼에서 앱의 대체 앱 ID를 정의해야 합니다.


ProximityDevice device = ProximityDevice.GetDefault();
if (device != null)
{
  PeerFinder.AlternateIdentities.Add("Windows", "my Win8 appID");
  PeerFinder.TriggeredConnectionStateChanged += OnTriggeredConnectionStateChanged;

  // Start finding peer apps, while making this app discoverable to peers
  PeerFinder.Start();
}

근접 앱이 백그라운드로 전환되는 경우(예: 호출에 응답하는 경우) 모든 게시된 메시지 및 구독이 일시 중단됩니다. 앱이 백그라운드에서 실행될 때 단말기 간에는 활동이 없으며 이는 앱이 포그라운드에서 다시 실행될 때 처리 대기 중인 메시지가 없음을 의미합니다. 앱이 포그라운드에서 다시 실행되면 게시 및 구독이 자동으로 계속됩니다.

NFC에 대해 설정된 기본 소켓은 보호되지 않습니다. 데이터 채널은 기본적으로 암호화되지 않습니다. 이 소켓을 통해 전달되는 데이터를 암호화하여 무단 변경의 위험을 줄이려면 StreamSocketSessionKey 속성 값을 대칭 키로 사용합니다. System.Security.Cryptography.AesManaged 등의 암호화 라이브러리에서 사용할 수 있습니다. 이 키는 서로 근접해 있는 단말기에만 인식됩니다.

휴대폰의 리소스 제약 조건으로 인해 특정 시점에 앱이 삭제 표식될 수 있습니다. 이 동작은 정상적이며 휴대폰에서 원활한 환경을 유지하는 데 도움이 됩니다. 앱은 수신 전화, 사용자의 앱 전환, 수신 텍스트 메시지 등의 다양한 이유로 백그라운드로 푸시될 수 있습니다. 앱이 삭제 표식되면 리소스가 손실되고 소켓 연결이 끊어집니다. 사용자가 위치를 옮기면 사용 가능한 무선 연결에 따라 앱에서 소켓 연결이 끊어질 수 있습니다. 이 동작은 정상적이며 사용자에게 양호한 사용자 환경이 있는지 확인하려고 했기 때문에 Windows Phone 8 에 다시 연결이 도입되었습니다. 다시 연결을 통해 소켓 연결이 잠시 끊어진 후 연결이 자동으로 다시 설정될 수 있습니다.

참고참고:

Windows Phone 8 의 다시 연결은 Bluetooth 및 TCP/IP(Wi-Fi) 연결에만 지원됩니다.

소켓 연결이 실패한 후 다시 연결하려면

  1. 연결을 설정할 때 RemoteHostNameRemoteServiceName 속성 값을 저장합니다.

  2. 활성 소켓 연결이 있는 경우 이는 앱이 계속될 때 다시 연결하려고 함을 의미하기 때문에 앱의 Application_DeActivated 이벤트에서 RemoteHostName.RawNameRemoteServiceName 값을 유지합니다.

    
    string storedRemoteHostRawName = socket.Information.RemoteHostName.RawName;
    string storeRemoteServiceName = socket.Information.RemoteServiceName;
    
    // Persist these two values
    
    
  3. 앱이 다시 활성화되고 계속되면 일반적으로 PeerFinder.Start 메서드를 호출합니다.

  4. 2단계에서 유지한 storedRemoteHostRawName 값을 사용하여 새 RemoteHostName 개체를 만듭니다.

    HostName newRemoteHostName = new HostName(storedRemoteHostRawName);
    
    
  5. 새 소켓을 만들고 ConnectAsync를 호출하여 storedRemoteServiceName 및 새로 만들어진 newRemoteHostName을 전달합니다.

    await socket.ConnectAsync(newRemoteHostName, storedRemoteServiceName);
    
    

사용자와 피어가 이 절차를 따르면 ConnectAsync 호출이 성공적으로 완료되어야 하고 휴대폰을 함께 다시 탭하지 않아도 앱이 다시 연결됩니다.

참고참고:

보류 중인 ConnectAsync 호출에 대한 호출을 취소해도 아무런 영향이 없습니다. 다시 연결 작업은 다시 연결을 시도하기 전에 전체 제한 시간 동안 대기합니다.

참고참고:

Windows Phone 8 단말기가 Windows 8 단말기와 다시 연결하려고 시도하면 이 다시 연결 작업은 Windows 8 에서 지원되지 않기 때문에 작업이 실패합니다.

ProximityDevice.GetDefault()Windows.Networking.Proximity.ProximityDevice 클래스의 인스턴스를 만들고 기본 근접 공급자를 활성화합니다. 그러나 이 리소스는 시스템 전체에 적용되지 않고 항상 사용할 수 있는 것이 아니므로 실수로 범위를 벗어나지 않도록 이 개체를 클래스 멤버 변수 또는 정적 변수로 저장해야 합니다.

근거리 컴퓨터 연결 테스트

Windows Phone 에뮬레이터 에는 근거리 컴퓨터 연결을 테스트하기 위한 기본 지원 사항이 없으므로 NFC를 지원하는 Windows Phone 8 을 사용하여 NFC 기능을 테스트해야 합니다. 에뮬레이터를 사용하여 테스트하고, 한 쌍의 에뮬레이터를 함께 탭하는 것을 시뮬레이션하려는 경우, 커뮤니티에서 사용할 수 있는 도구를 사용해 볼 수 있습니다. 예를 보려면 http://proximitytapper.codeplex.com에 있는 근접 태퍼를 참조하세요. 이 도구는 커뮤니티 프로젝트로서, Microsoft에서 공식적으로 지원하지는 않습니다.

표시: