NFC로 첨단 앱 개발

NFC(Near Field Communication, 단거리 무선 통신)는 새로운 단거리 무선 기술입니다. 정확히 2cm 거리에 있는 사람들끼리 물리적으로 장치를 함께 탭하여 콘텐츠를 주고받을 수 있습니다. 탭 방식을 사용하면 대상을 빠르게 선택할 수 있을 뿐만 아니라 이해하기도 쉽습니다. 보면 바로 이해되므로 설명서도 필요 없습니다.

예를 들어 친구와 함께 사진을 보다가 친구가 사진을 달라고 할 때 NFC가 있으면 장치를 친구의 PC에 대고 탭하여 간단히 사진을 보낼 수 있습니다. 너무 간단하게 설명했지만 장치 간에 콘텐츠를 간편하게 공유할 수 있다는 것이 핵심입니다.

'Nokia 360 스피커가 Windows Phone과 Bluetooth 연결 정보를 공유하는 모습

그림 1: Nokia 360 스피커가 Windows Phone과
Bluetooth 연결 정보를 공유하는 모습

Bluetooth 또는 Wi-Fi와 비슷한 NFC는 NFC Forum에서 정의한 표준 무선 프로토콜입니다. PC에서 NFC를 사용하려면 NFC 라디오가 필요합니다. Windows 8 PC에는 NFC 라디오가 직접 통합된 경우가 많이 있습니다. NFC가 통합되어 있지 않다면 NFC 동글을 구입하여 PC에 연결하면 됩니다.

NFC는 멋진 기능을 제공합니다. 사진을 탭하여 전송하거나, 레스토랑에서 메뉴를 탭하여 음식을 주문하거나, Bluetooth 장치를 탭하여 연결할 수도 있습니다. 전혀 다른 이야기 같지만 모두 '탭' 방식으로 시작한다는 데 공통점이 있습니다. NFC는 PC, 전화, 스피커, 헤드셋, 무선 디스플레이 등과 같은 다양한 장치에서 사용되며, 매우 직관적인 장치 연결을 지원합니다. 또한 NFC는 RFID 태그를 사용합니다. RFID 태그는 매우 저렴하고 가벼운 패시브 안테나로, 꽤 많은 양의 데이터가 들어가고 거의 모든 곳에 부착할 수 있기 때문에 포스터에 주로 사용됩니다. 예를 들어 영화 포스터를 탭하기만 하면 영화표를 간단하게 구매할 수 있습니다. 이러한 것들을 NFC 태그라고 합니다. 이제 NFC 태그를 탭하는 기본적인 예를 알아보면서 NFC API의 핵심 개념을 몇 가지 설명하도록 하겠습니다.

하지만 그 전에 장치를 함께 탭한다는 것이 무슨 의미인지 자세히 살펴보도록 하겠습니다.

'탭' 정의

Bluetooth 마우스를 탭하여 연결하든, 사진을 탭하여 공유하든, 장치를 같은 방법으로 함께 탭하는 것이 중요합니다. 그리고 탭한다는 것은 잘 알고 있는 개념이지만 PC를 다른 장치에 가까이 대고 탭한다는 개념은 대부분 생소할 것입니다. 탭과 관련하여 알아야 할 몇 가지 유용한 지침은 다음과 같습니다.

  1. 장치를 함께 탭하는 지점 - '탭하여 실행' 비주얼 마크라고도 하는 터치마크를 사용여 NFC 안테나가 있는 위치를 표시합니다. PC 모델에 따라 탭하는 부분도 다릅니다. 예를 들어 태블릿의 경우 후면을 탭해야 하지만 올인원의 경우 전면을 탭해야 합니다. NFC 기능이 있는 Windows 8 PC에서 볼 수 있는 마크는 다음과 같은 모양입니다.

    탭하여 실행 비주얼 마크

    그림 2: 탭하여 실행 비주얼 마크

  2. 장치가 서로 통신 중 - 탭할 때 전송되는 데이터가 직접 보이지는 않아도 무언가 진행 중이라는 것을 사용자가 확신할 수 있어야 하므로 범위 내의 장치끼리 통신 중일 때는 Windows에서 소리가 재생됩니다.

이 부분은 Windows에서 자동으로 처리하므로 신경 쓰지 않아도 됩니다. 사용자 환경 요소에 대한 자세한 내용은 Windows 8 근거리 근접 연결 구현 사양을 참조하십시오. 이를 바탕으로 NFC로 경험할 수 있는 멋진 시나리오 몇 가지를 살펴보겠습니다.

NFC를 사용하는 경우

사용자가 앱에서 어떤 대상을 선택해야 할 때는 NFC를 사용하십시오. NFC를 사용하면 직관적인 방식으로 선택할 수 있으며 수동으로 검색하는 것보다 빠르고 더 근사하게 보입니다. 탭은 앱에 따라 다르지만 사진 수신부터 재생 목록 시작까지 다양한 경험을 촉발하는 일종의 트리거가 될 수 있습니다. 탭 이후에 발생하는 일은 전적으로 앱이 결정합니다. 따라서 Microsoft는 이러한 경험의 범위를 간단히 '탭하여 실행' 경험으로 분류하고 있습니다.

다음은 NFC를 사용하여 앱에서 무언가를 선택하는 예입니다. 탭하여 다음을 실행할 수 있습니다.

  • 포스터의 정보 확인: NFC 태그는 가볍고 저렴한 RFID 태그입니다. 가격은 0.15달러에서 1달러 정도이며 인쇄 비용에 따라 가격이 달라집니다. NFC 태그는 QR 코드와 비슷하지만 더 쉽고, 더 빠르게 사용할 수 있습니다. 카메라 각도를 맞추면서 바코드 사진을 찍는 것보다는 태그를 탭하는 것이 훨씬 더 간편합니다. 공항, 지하철 역, 버스 정류장과 같이 사람들이 붐비는 곳에 태그가 포함된 포스터를 광고하는 제조업체들이 점점 늘어나고 있습니다. NFC 태그에는 48B~4KB 데이터가 저장될 수 있으며 앱의 특정 페이지를 실행하는 태그도 프로그래밍할 수 있습니다.
  • 연락처 정보 교환: 내 연락처 정보를 알려줄 때 친구가 잘못 받아적을까 봐 걱정할 필요 없이 장치를 탭하여 연락처 정보를 교환해 보십시오. 마찬가지로 NFC 명함/태그에 정보를 프로그래밍하거나 앱을 통해 정보를 직접 교환할 수 있습니다.
  • 좋아하는 음악 방송 재생: 운동하러 갈 때, 차에 시동을 걸 때, 또는 집에서 쉴 때, NFC 태그를 사용하여 라디오 방송을 들어보십시오. 헬스장용 태그, 휴식용 태그, 취침용 태그 등 다양한 태그에 음악 방송을 프로그래밍할 수도 있습니다.
  • 붐비는 레스토랑에서 저녁 식사 주문: 저녁 시간에 손님이 많은 레스토랑에서는 주문하는 데만도 엄청 오래 기다려야 합니다. 기다리지 말고 테이블에서 태그를 탭하여 음식을 주문하십시오.
  • 친구와 함께 게임: 장치를 함께 탭하여 배틀쉽, 체스 또는 스크래블과 같이 여럿이 같이 하는 게임을 친구와 함께 즐길 수 있습니다. 탭 후에는 Bluetooth 또는 Wi-Fi Direct와 같이 대역이 넓고 처리량이 많은 대역 외 전송을 통해 연결이 유지됩니다.

지금까지 NFC를 사용해야 하는 경우에 대한 유용한 아이디어를 알아보았습니다. 이제 Windows 8 근접 연결(NFC) API를 사용하는 앱을 개발하는 방법을 알아보는 재미있는 시간을 갖겠습니다.

NFC를 구현하는 방법

지금까지 알아본 것처럼 NFC는 일상에서 느끼는 여러 가지 불편을 덜어 줍니다. 알람을 설정하는 예를 보겠습니다. 우리 모두 아침 알람 시간을 잘못 맞춰본 적이 있을 겁니다. 늦은 시각 잠들기 직전에는 누구나 분별력이 약간 떨어지기 마련인데, 이때 NFC를 사용하면 아주 쉽게 미리 설정된 태그를 탭하고 확인한 후 아무런 걱정 없이 잠들 수 있습니다. 그러면 사용자들의 일상적인 불편을 덜어 주기 위해 사용자가 NFC 태그를 사용하여 알람을 설정할 수 있는 기본 알람 앱을 한번 작성해 보겠습니다. 이는 두 가지 시나리오로 나눌 수 있습니다.

  1. 태그에 직접 알람 설정: NFC 태그는 재사용이 가능하므로 앱에 사용자가 알람을 프로그래밍할 수 있는 기능이 있어야 합니다. 예를 들어 평일과 주말을 구분해서 알람을 프로그래밍하는 경우가 있습니다. 이것을 태그에 데이터를 게시한다고 합니다.
  2. 태그를 통해 알람 설정: 사용자가 태그를 탭하면 앱이 실행되어 알람 설정을 확인해야 합니다. 즉, 상황에 따라 또는 인수를 사용하여 앱을 실행할 수 있습니다.

NFC API로 이러한 시나리오를 구현하는 방법은 여러 가지가 있는데 그 중 가장 간단한 방법을 살펴보겠습니다.

NFC 태그에 직접 알람을 설정하는 과정을 알아보겠습니다.

  1. 민수가 알람 앱을 실행하고 시간을 오전 7시로 설정합니다. 아직 NFC가 연결되지 않은 일반 알람 설정입니다.
  2. 민수가 'NFC 태그에 알람 설정' 옵션을 선택합니다. 그러면 앱이 NFC API를 호출하여 NFC 라디오에 앱 식별자 문자열과 07:00이라는 정보를 게시합니다. NFC 태그는 표준화된 메시지 형식인 NDEF(NFC Defined Exchange Format)를 사용합니다. Windows에서 알아서 처리하므로 앱에서 별도로 데이터의 형식을 NDEF 메시지로 지정할 필요가 없습니다. 이제 사용자가 NFC 태그를 탭할 수 있습니다.
  3. 민수가 태그를 PC에 가까이 대고 탭하면 앱이 태그 프로그래밍을 확인합니다. 태그를 탭한 후 사용자에게 앱이 태그 프로그래밍을 완료했음을 알려주는 것이 중요합니다. 앞서 말했다시피 PC를 탭하는 것은 대부분의 사람들에게 생소한 개념이므로 확인을 통해 사용자에게 탭이 완료되었다고 안심시켜 주어야 합니다. 메시지 전송 처리기를 등록하면 앱이 메시지가 전송되었다는 것을 알게 됩니다.

NFC API는 Windows.Networking.Proximity 네임스페이스에 있으며 사용자가 'NFC 태그에 알람 설정' 옵션을 선택한 후에 진행되는 2단계에서 실행됩니다. 먼저 앱은 근접 연결 개체를 초기화합니다. 근접 연결 개체는 태그(또는 장치)가 범위 내에 있거나 범위를 벗어났을 때 알려주는 데 사용됩니다. 다음으로, DeviceArrival 이벤트 처리기를 추가하겠습니다. 이 처리기는 태그를 탭한 시점, 즉 태그에 정보를 기록할 수 있는 시점을 인식합니다. 태그에 정보를 기록 중일 때 사용자에게 이를 알려주면 범위를 벗어나지 않게 할 수 있으므로 유용합니다. 또한 근접 연결 장치를 탭한 시점도 인식할 수 있습니다.

다음은 DeviceArrival 이벤트 처리기를 초기화하고 추가하는 방법을 보여주는 코드 예제입니다.

JavaScript

 var proximityDevice;

function initializeProximityDevice() {
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.getDefault();

    if (proximityDevice) {
        proximityDevice.addEventListener("devicearrived", proximityDeviceArrived);
       
}
   else {
        // No NFC radio on the PC, display an error message
    }


function proximityDeviceArrived(device) {
        // Let the user know we’re ‘Writing to Tag’

}
}

C#

 private void InitializeProximityDevice()
{

Windows.Networking.Proximity.ProximityDevice proximityDevice;
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

    if (proximityDevice != null) {
        proximityDevice.DeviceArrived += ProximityDeviceArrived;
    
    }
    else
    {
        // No NFC radio on the PC, display an error message
    }
}

private void ProximityDeviceArrived(Windows.Networking.Proximity.ProximityDevice device)
{
            // Let the user know we’re ‘Writing to Tag’

}

이제 태그에 정보를 게시합니다. 앱은 앱 ID와 앱 플랫폼으로 이루어진 앱 식별자 문자열과 실행 인수를 게시합니다. Windows 8의 경우 앱 ID는 <패키지 제품군 이름>!<앱 ID>이며 앱 플랫폼은 ‘Windows’입니다. 앱의 패키지 매니페스트에 있는 Application 요소의 ID 특성에서 앱 ID 값을 복사해야 합니다. 실행 인수는 사용자가 설정한 알람인 ’07:00’입니다. 이것을 메시지라고 하겠습니다.

앱이 다양한 플랫폼에서 작동하는 경우 대체 앱 ID 및 앱 플랫폼을 게시할 수 있습니다. 즉, Windows Phone 8과 같이 NFC를 지원하는 다른 장치에서 동일한 태그를 탭할 수 있습니다. 대체 ID에 대한 자세한 내용은 MSDN을 참조하십시오.

앱은 publishBinaryMessage라는 메서드를 사용하여 태그에 데이터를 게시합니다. 이 메서드는 messageType, message 및 messageTransmittedHandler라는 3개의 매개 변수를 받습니다. messageType을 ‘LaunchApp:WriteTag’로 설정해 보겠습니다. 이는 앱이 NFC 태그에 정보를 기록하겠다는 것을 Windows에 알립니다. message는 앞서 정의한 그 메시지입니다(앱 식별 문자열 및 실행 인수). message는 버퍼에 이진 메시지로 저장해야 합니다. messageTransmittedHandler 함수는 콜백에 등록됩니다. 그러면 message가 태그에 기록되었다는 것을 앱에서 알 수 있습니다. 이것은 사용자에게 태그에 메시지가 기록되었고 태그가 더 이상 범위 내에 있지 않아도 된다는 것을 알려줍니다.

메시지는 StopPublishingMessage 함수를 호출하거나 ProximityDevice 개체가 해제될 때까지 계속 게시됩니다. 이 예에서는 중지 함수를 사용하겠습니다. PublishBinaryMessage는 게시 ID를 반환합니다. 이 게시 ID를 사용하여 메시지가 NFC 라디오에 게시되지 못하게 중지하겠습니다.

다음은 NFC 태그에 데이터를 기록하는 방법을 보여주는 코드 예제입니다.

JavaScript

 var proximityDevice;

function getAlarmTime(){

    // Grab time set by the user, call this variable ‘Alarm’
    return Alarm;

}

function publishLaunchApp() {
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

if (proximityDevice) {
        // The format of the app launch string is: "<args>\tWindows\t<AppName>".
        // The string is tab or null delimited.

        // The <args> string can be an empty string ("").
        var launchArgs = getAlarmTime();

        // The format of the AppName is: PackageFamilyName!PRAID.
        var praid = "AlarmApp"; // The Application Id value from your package.appxmanifest.

        var appName = Windows.ApplicationModel.Package.current.id.familyName + "!" + praid;

        var launchAppMessage = launchArgs + "\tWindows\t" + appName;

        var dataWriter = new Windows.Storage.Streams.DataWriter();
        dataWriter.unicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.utf16LE;
        dataWriter.writeString(launchAppMessage);
        var launchAppPubId =
             proximityDevice.publishBinaryMessage(
                 "LaunchApp:WriteTag", 
                 dataWriter.detachBuffer(), 
                 proximityWriteTagLaunchAppMessageTransmitCallback);
        
    if (launchAppPubId != -1) {
            // Stop publishing the message on NFC radio
        proximityDevice.stopPublishingMessage(launchAppPubId);
    }

     }
}

function proximityWriteTagLaunchAppMessageTransmitCallback() {
    // Inform the user that: the message has been successfully written to a tag & the tag no longer needs to be in range
}

C#

 Windows.Networking.Proximity.ProximityDevice proximityDevice;

private string GetAlarmTime(){

    // Grab time set by the user, call this variable ‘Alarm’
    return Alarm;
}

private void PublishLaunchApp()
{
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

if (proximityDevice != null)
    {
        // The format of the app launch string is: "<args>\tWindows\t<AppName>".
        // The string is tab or null delimited.

        // The <args> string can be an empty string ("").
        string launchArgs = getAlarmTime();

        // The format of the AppName is: PackageFamilyName!PRAID.
        string praid = "MyAppId"; // The Application Id value from your package.appxmanifest.

        string appName = Windows.ApplicationModel.Package.Current.Id.FamilyName + "!" + praid;

        string launchAppMessage = launchArgs + "\tWindows\t" + appName;

        var dataWriter = new Windows.Storage.Streams.DataWriter();
        dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;
        dataWriter.WriteString(launchAppMessage);
        var launchAppPubId =
        proximityDevice.PublishBinaryMessage(
            "LaunchApp:WriteTag", dataWriter.DetachBuffer(), 
            proximityWriteTagLaunchAppMessageTransmitCallback);
    
    if (launchAppPubId!= -1)
    {
        proximityDevice.StopPublishingMessage(launchAppPubId);
    // Stop publishing the message on NFC radio
    }

    }
}

private void proximityWriteTagLaunchAppMessageTransmitCallback(
    Windows.Networking.Proximity.ProximityDevice sender,
    long messageId)
{
        // Inform the user that: the message has been successfully written to a tag & the tag no longer needs to be in range
}

아주 간단하지 않습니까? 이제 Windows 스토어 앱에서 NFC 태그에 기록하는 방법을 알았습니다. 너무 간단해서 더 이상 설명이 필요 없으므로 다음 시나리오인 태그를 통해 알람을 설정하는 시나리오로 넘어가 보겠습니다. NFC 태그에서 알람을 읽는 과정을 알아보겠습니다.

  1. 민수는 TV 감상 중/전자 메일 작성 중/게임 플레이 중/Windows 사용 중에 월요일 아침 알람을 설정해야겠다고 생각합니다. '수요일 알람' 태그를 PC 가까이 대고 탭합니다. 알람 앱을 실행하라는 알림이 표시됩니다. 이때까지는 Windows가 모든 것을 알아서 처리하므로 앱에서 별도로 할 일이 없습니다.
  2. 민수가 수락하면 앱이 실행되고 오전 7시로 설정된 '알람을 확인하시겠습니까?' 화면이 열립니다. 민수가 알림을 수락하면 활성화 과정에서 Windows가 앞서 말한 것과 동일한 실행 인수를 앱에 전달합니다. 이를 상황별 실행이라고 하며, 앱이 특정 페이지에서 실행되게 하는 것과 동일합니다.
  3. 민수가 알람을 설정합니다. NFC가 없는 일반 알람 설정입니다.

NFC 태그에서 실행 인수를 받기는 매우 쉽습니다. 앱은 NFC 태그에서 상황별 실행을 처리해야 합니다. 상황별 실행은 앱을 특정 페이지에서 실행하는 것과 동일합니다. 실행 인수가 오전 7시 알람을 지정하고, 앱이 이를 통해 제안된 알람을 표시합니다. 또한 PC에 앱이 설치되지 않은 경우 Windows 스토어에서 앱을 설치하라는 알림을 자동으로 표시합니다.

다음은 상황별 실행을 구현하는 방법을 보여주는 코드 예제입니다.

JavaScript

 app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket") {
            //do nothing here.
        }
        else {
    // Use args.detail.arguments to parse out ’07.00’ string, and display to the user
        }

        args.setPromise(WinJS.UI.processAll());
    }
}

C#

 async protected override void OnLaunched(LaunchActivatedEventArgs args)
        {
            if (args.Arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket")
            {
                _isLaunchedByTap = true;
            }
            else
            {
// Use args.Arguments to parse out ’07.00’ string, and display to the user

            }
            Window.Current.Activate();
        }

앱이 NFC 태그를 읽고 NFC 태그에 기록하는 것을 지원하기 위해 해야 할 일은 이것이 전부입니다. 최첨단 시나리오치고는 매우 단순합니다. 마지막으로 매우 유용한 오류 처리 방법에 대해 알아보겠습니다.

오류 처리

앱에는 자주 발생하는 오류가 몇 가지 있습니다.

  • 탭한 태그가 NDEF 형식이 아닙니다. Windows 8은 태그를 다시 자동으로 NDEF 형식으로 지정하도록 지원하지 않으므로 NDEF 포매터를 다운로드하고 설치해야 합니다.
  • 탭한 태그가 읽기 전용입니다. 일부 NFC 태그는 읽기 전용으로 잠겨 있을 수 있습니다(기존의 VHS 테이프와 유사).
  • 탭한 태그가 너무 작고 데이터가 다 들어가지 않습니다.
  • 사용자 PC에 NFC가 없습니다. 처음에 말한 것처럼 NFC는 새로운 기술이며 보급률이 점차 높아지고 있습니다. PC가 근접 연결을 지원하는지 확인하려면 ProximityDevice.getDefault() 메서드를 사용하십시오. NFC 라디오가 설치되지 않은 경우 이 메서드에서 NULL을 반환합니다.

재미있고 직관적입니다!

Windows는 마침내 주요 소비자를 위한 NFC를 도입하여 에코시스템과 잘 만들어진 포괄적인 UX를 갖추게 되었습니다. 이 기술은 앱과 장치 환경을 놀랍도록 직관적으로 만들어줄 많은 잠재력을 가지고 있습니다. 재미있고 직관적입니다.

NFC는 광범위한 분야이므로 다른 멋진 Windows 8 NFC 개발자 환경에 대해서도 다양한 블로그 게시물이 기대됩니다.

NFC 및 근접 연결에 대한 자세한 내용은 아래 리소스를 참조하십시오.

리소스

링크

형식

근접 연결을 사용한 개발에 대한 지침

문서

근접 API

문서

앱의 근접 연결 테스트 및 문제 해결

문서

게시 및 구독(자세한 내용)

문서

근접 연결 앱 샘플

샘플

근접 연결에 대해 궁금한 점이 있습니까? 여기에서 물어보십시오.

포럼

감사합니다.

Priya Dandawate

장치 및 네트워킹 프로그램 관리자

도움을 주신 분: Max Morris, Marzena Makuta, Mike Loholt, Jake Sabulsky, Vishal Mhatre