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

Windows Phone 8의 Bluetooth

2014-06-18

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

 

이 항목에서는 앱이 Windows Phone 에서 Bluetooth를 사용하는 방법에 대한 개요를 제공합니다.

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

 

Bluetooth는 10m 거리 안에 있는 장치가 서로 통신하는 데 사용할 수 있는 무선 통신 기술입니다. 검색/조회하는 동안 장치는 검색 가능한 상태에 있는, 범위 내 다른 장치를 열거할 수 있습니다. 그런 다음 장치가 특정 장치에서 지원하는 서비스 목록을 쿼리하고 장치에서 해당 서비스에 대한 연결을 설정할 수 있습니다. 이 기술을 통해 단말기는 실제 연결 없이도 통신할 수 있습니다. Bluetooth 기술을 사용하는 단말기 및 앱의 예로는 무선 헤드셋, 원격 제어 장난감, 멀티플레이어 게임 등이 있습니다.

Windows Phone 8 에는 Bluetooth를 사용하여 앱을 개발하는 데 사용할 수 있는 API가 제공됩니다. 이 API를 사용하여 앱에서 다른 앱이나 장치에 연결할 수 있습니다. 이러한 핵심 시나리오는 앱을 더 많이 연결하는 데 사용할 수 있는 다양한 기회를 제공합니다.

Windows Phone 8 에서는 앱 - 앱 연결 및 앱 - 장치 연결의 두 가지 Bluetooth 시나리오를 지원합니다. 각 시나리오에서 앱이나 장치 간에 StreamSocket 연결이 설정됩니다.

앱 - 앱

앱 - 앱 통신에서 앱은 Bluetooth를 사용하여 앱에서 액세스할 서비스를 광고하는 다른 앱을 검색합니다. 앱이 범위 내에서 해당 서비스를 제공하는 다른 앱을 검색하면 앱에서 연결 요청을 시작합니다. 두 앱이 모두 연결을 수락하면 앱 간 스트림 소켓이 열리고 이를 통해 앱이 통신할 수 있습니다.

앱 - 장치

앱 - 장치 통신에서 앱은 Bluetooth를 사용하여 앱에서 액세스할 서비스를 제공하는 장치를 검색합니다. 앱이 범위 내에서 해당 서비스를 제공하는 장치를 검색하면 앱에서 연결 요청을 시작합니다. 앱과 장치가 모두 연결을 수락하면 앱과 장치 간 스트림 소켓이 열리고 이를 통해 앱과 장치가 통신할 수 있습니다.

검색은 상호 작용할 서비스를 광고하는 Bluetooth 장치나 앱을 찾는 프로세스입니다. 앱 - 장치 시나리오에서는 앱이 실행 중인 휴대폰과 이미 페어링된 장치만 검색할 수 있습니다. 페어링은 휴대폰에서 Bluetooth 제어판을 사용하여 Bluetooth 장치를 찾아 서로 연결하는 프로세스입니다. 페어링에는 일반적으로 PIN 또는 연결하도록 동의한 양쪽을 공유하는 작업이 수행됩니다. 앱 - 앱 Bluetooth 연결의 경우 특정 앱이 다른 휴대폰에서 스스로 다른 인스턴스를 찾습니다. 이러한 휴대폰에서는 검색을 위해 페어링 작업을 수행할 필요가 없습니다.

Windows Phone 8 에서는 타사 Bluetooth 개발자 시나리오를 지원하기 위해 StreamSocketPeerFinder Windows 런타임 API가 확장되었습니다. 이러한 접근 방식은 Windows 8 네트워킹 개발 모델 간 일관성을 유지할 수 있도록 도와줍니다.

클래스

설명

PeerFinder

인근의 장치에서 앱의 또 다른 인스턴스를 검색하고 이러한 피어 앱 간 소켓 연결을 만들 수 있는 기능을 제공합니다. 피어 앱은 다른 장치에서 실행 중인 앱의 또 다른 인스턴스입니다.

PeerInformation

피어 앱이나 장치를 식별하는 정보를 포함합니다.

StreamSocket

TCP 스트림 소켓을 사용한 네트워크 통신을 지원합니다.

ConnectionRequestedEventArgs

ConnectionRequested 이벤트에 의해 앱에 전달된 속성을 포함합니다.

다음 표에는 Windows Phone 8 에서 지원되는 Bluetooth 시나리오를 사용하도록 설정하는 데 필요한 기능이 나와 있습니다. 이러한 기능이 WMAppManifest.xml에 지정되지 않으면 앱이 제대로 작동하지 않거나 Windows Phone 스토어 에 대한 제출 프로세스가 실패할 수 있습니다. 자세한 내용은 Windows Phone 8의 앱 기능 및 하드웨어 요구 사항을 참조하세요.

시나리오

필요한 기능

앱 - 앱

ID_CAP_PROXIMITY

앱 - 장치

ID_CAP_PROXIMITY, ID_CAP_NETWORKING

Windows Phone 8 은 Bluetooth 3.1을 지원합니다. 이 버전은 Windows Phone 8 과, 휴대폰 헤드셋, 자동차 오디오 시스템, 스피커 도크, NFC 페어링과 같은 Bluetooth 장치 간의 페어링 프로세스를 자동화하는 향상된 Bluetooth 버전입니다. 다음 Bluetooth 사용자 프로필이 지원됩니다.

  • A2DP(Advanced Audio Distribution Profile) 1.2

  • AVRCP(Audio/Video Remote Control Profile) 1.4

  • HFP(Hands Free Profile) 1.5

  • PBAP(Phone Book Access Profile) 1.1

  • OPP(Object Push Profile) 1.1

  • OOB(Out of Band) 및 NFC(Near Field Communications)

다음 코드 예제는 Bluetooth API를 사용하여 피어 앱과 장치를 연결하고 연결 요청을 수신 대기하며 Bluetooth 사용 가능 여부를 확인하는 방법을 보여 줍니다.

피어 앱에 연결


        async void AppToApp()
        {
            
            // PeerFinder.Start() is used to advertise our presence so that peers can find us. 
            // It must always be called before FindAllPeersAsync.
            PeerFinder.Start();

            var peers = await PeerFinder.FindAllPeersAsync();

            if (peers.Count == 0)
            {
                Debug.WriteLine("Peer not found.");
            }
            else
            {
                // Select a peer. In this example, let's just pick the first peer.
                PeerInformation selectedPeer = peers[0];

                // Attempt a connection
                var streamSocket = await PeerFinder.ConnectAsync(selectedPeer);

                DoSomethingUseful(streamSocket);
            }
            

        }

단말기에 연결

Bluetooth를 통해 장치에 연결하려면 먼저 장치가 앱이 실행 중인 휴대폰과 페어링되어 있어야 합니다. PeerFinder.FindAllPeersAsync를 사용하여 페어링된 장치를 찾을 수 있습니다. 다음 표의 키-값 쌍 중 하나로 PeerFinder.AlternateIdentities를 설정할 수 있습니다.

AlternateIdenties 설정

참고

PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";

모든 페어링된 장치들을 열거합니다. PeerInformation.ServiceName은 이 경우 비어 있게 됩니다. 많은 장치들의 경우, 통신에 사용할 Bluetooth 포트는 하드 코딩되므로 ConnectAsync 호출에서 바로 사용할 수 있습니다. 장치가 서비스를 광고하고 있다면, 페어링된 옵션을 사용하여 열거할 수 있지만 ConnectAsync 호출은 사용할 서비스의 GUID로 할 수 있습니다. 

PeerFinder.AlternateIdentities["Bluetooth:SDP"] = "<SDP service guid>";

주어진 GUID로 서비스를 광고하고 있는 SDP(Service discovery protocol)를 사용하여 장치를 찾습니다. 찾은 장치가 있으면, PeerInformation.ServiceName이 지정된 GUID와 같게 됩니다.


// Note: You can only browse and connect to paired devices!
private async void AppToDevice()
{
   // Configure PeerFinder to search for all paired devices.
   PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";
   var pairedDevices = await PeerFinder.FindAllPeersAsync();

   if (pairedDevices.Count == 0)
   {
      Debug.WriteLine("No paired devices were found.");
   }
   else
   {
      // Select a paired device. In this example, just pick the first one.
      PeerInformation selectedDevice = pairedDevices[0];
      // Attempt a connection
      StreamSocket socket = new StreamSocket();
      // Make sure ID_CAP_NETWORKING is enabled in your WMAppManifest.xml, or the next 
      // line will throw an Access Denied exception.
      // In this example, the second parameter of the call to ConnectAsync() is the RFCOMM port number, and can range 
      // in value from 1 to 30.
      await socket.ConnectAsync(selectedDevice.HostName,"1");
      DoSomethingUseful(socket);
   }
}

"Bluetooth:Paired"로 열거할 경우 PeerInformation.ServiceName 필드가 비어있게 됩니다.  "Bluetooth:SDP"를 사용하여 열거할 경우에만 이 필드가 채워집니다. 이 경우 PeerInformation.ServiceName에서 반환된 값은 사용자가 설정한 GUID 값입니다.  이전 예제에 표시된 것처럼 많은 장치들의 경우, 통신에 사용할 Bluetooth 포트는 하드 코딩되므로 ConnectAsync 호출에서 바로 사용할 수 있습니다. 장치가 서비스를 광고하고 있다면, 페어링된 옵션을 사용하여 열거할 수 있지만 ConnectAsync 호출은 사용할 서비스의 GUID로 할 수 있습니다. 

연결 요청 수신 대기


        // Page Constructor
        public MainPage()
        {
            InitializeComponent();
            Loaded += MainPage_Loaded;
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            PeerFinder.ConnectionRequested += PeerFinder_ConnectionRequested;
        }
         void PeerFinder_ConnectionRequested(object sender, ConnectionRequestedEventArgs args)
        {
            if (ShouldConnect())
            {
                // Go ahead and connect
                ConnectToPeer(args.PeerInformation);
            }
            
        }

        async void ConnectToPeer(PeerInformation peer)
        {
            StreamSocket socket = await PeerFinder.ConnectAsync(peer);
            DoSomethingUseful(socket);
           
        }

        private bool ShouldConnect()
        {
            // Determine whether to accept this connection request and return
            return true;
        }

휴대폰에서 Bluetooth 무선 상태 감지

Bluetooth가 꺼져 있으면 FindAllPeersAsync 호출에서 예외가 발생합니다. 일반적으로 다음과 같이 코드에서 이 예외를 확인함으로써 휴대폰에서 Bluetooth가 꺼져 있음을 감지하게 됩니다.


   private async void FindPaired()
        {
          
            // Search for all paired devices
            PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";

            try
            {
                var peers = await PeerFinder.FindAllPeersAsync();

                // Handle the result of the FindAllPeersAsync call
            }
            catch (Exception ex)
            {
                if ((uint)ex.HResult == 0x8007048F)
                {
                    MessageBox.Show("Bluetooth is turned off");
                }
            }
        }

문제

해결 방법

PeerFinder를 시작, 중지한 후 다시 시작할 경우 Bluetooth P2P(Peer-to-Peer) 광고가 사용하도록 설정되지 않습니다.

앱을 백그라운드로 전송한 후 다시 포그라운드로 가져옵니다.

Windows Phone 에뮬레이터 를 사용하여 Bluetooth를 테스트할 수 없습니다.

Windows Phone 8 장치를 사용하여 Bluetooth를 테스트합니다.

표시: