Firefox OS에서의 NFC

이 글은 이 쓴 NFC in Firefox OS의 한국어 번역본입니다.

Firefox OS는 모질라의 파트너들과 커뮤니티가 개방된 형태로 협업하며 개발하고 있습니다. 개방 정신 아래서, 1년 넘는 기간동안, 모질라와 Deutsche Telekom (DT)은 Firefox OS가 플랫폼 레벨에서 NFC를 지원할 수 있게 하기 위해 긴밀히 협조하며 개발해왔습니다. 이 기간 동안, 양 팀은 개발 사이클 내내 정기적으로 만나 제품 협의와 엔지니어링 협의를 진행했습니다.

NFC API를 제안하는 것부터, 전반적인 아키텍처를 정의하는 것, 프로토타입을 만드는 것과 제품 출시를 위해 개발 결과물을 제품 수준으로 완성하는 것에 이르기까지, 이번 협력 모델은 무척 괜찮게 굴러갔습니다. 그래서 웹을 진보시키는 “개방” (개방된 기술과 개방된 기여 모델)의 힘을 제대로 보여줬습니다. 궁극적으로 개방이야말로 모질라와 Firefox OS가 상징하는 것입니다.

이번 글을 통해, Firefox OS에 구현된 NFC 기능에 대해 기본적인 설명을 하려고 합니다.

NFC 로드맵

현재 2.0 버전에서, Firefox OS는 NFC를 이용한 컨텐츠 (연락처, 이미지, 비디오, URL) 공유기능을 제공합니다. 뿐만 아니라 NFC 태그에 저장된 정보를 무선으로 읽어오는 기능 (tag reading)도 제공합니다. 우리의 공유 유즈-케이스는 다른 안드로이드/윈도우즈 기기의 NFC 기능과도 호환됩니다. 그래서 이런 기기들 사이에서 컨텐츠를 공유하는 것이 가능합니다. (v1.3에서 처음 소개된) Firefox OS의 NFC API는 v2.0 코어 앱 (Core App)이 필요로 하는 NFC 공유 유즈-케이스를 지원할 수 있도록 더욱 보강됐습니다.

B2G 로드맵의 개략적인 내용을 위키에서 확인할 수 있습니다.

WebNFC API

Firefox NFC APIs는 NDEF (NFC Data Type Exchange format) 데이터 포맷을 지원하는 모든 디바이스 사이에서 피어-투-피어 (Peer to Peer: P2P) 통신을 가능하게 해줍니다. 자기 자신을 NDEF 호환 태그로 공지할 수 있는 NFC 수동형 태그 (NFC passive tags)도 읽거나 쓸 수 있습니다. 현재는 Firefox OS의 인증된 앱 (Certified App)만 NFC API를 사용할 수 있습니다. 하지만 이미 발표한 바와 같이, API는 더 많은 유즈-케이스와 데이터 포맷을 지원할 수 있게 발전할 것이며 마켓플레이스 앱 (Marketplace App)에게도 공개될 것입니다.

이 API의 사용 예제

아래 예제 코드는 2개의 NFC 디바이스 사이에서 P2P 통신을 수행하기 위한 것입니다. (MDN의 NFC API 문서에서 발췌).

// UTF-8 문자열을 Unit8Array로 변환하는 유틸리티 함수.
// 만약 가능하다면, NfcUtils를 이용하기 위해 다음 코드를 당신의 웹앱 HTML에 추가하세요.:
// <script defer src="shared/js/nfc_utils.js"></script>

function fromUTF8(str) {
  if (!str) {
    return null;
  }
  var enc = new TextEncoder('utf-8');
  return enc.encode(str);
}
 
var tnf     = 1;                                             // NFC 포럼의 유명한 타입
var type    = new Uint8Array(fromUTF8("U"));                 // URL type
var id      = new Uint8Array(fromUTF8(""));                  // id
var payload = new Uint8Array(fromUTF8("\u0003mozilla.org")); // URL data, http://를 record prefix 0x3으로 대치함
 
var ndefRecords = [new MozNDEFRecord(tnf, type, id, payload)];
var nfcdom = window.navigator.mozNfc;
 
nfcdom.onpeerready = function(event) {
  // event.detail은 세션 토큰
  var nfcPeer = navigator.mozNfc.getNFCPeer(event.detail);
  var req = nfcpeer.sendNDEF(ndefRecords); // NDEF 메시지를 다른 NFC 기기로 전송.
  req.onsuccess = function(e) {
    console.log("Successfully pushed P2P message");
  };
  req.onerror = function(e) {
    console.log("P2P push failed!");
  };
};

Firefox OS와 함께 공개된 이런 종류의 보다 많은 예제를 NCF API 이용하기에서 찾아볼 수 있습니다.

현재 지원되는 데이터 타입

WebNFC API는 현재 NDEF (NFC Data Exchange Format) 데이터 포맷을 지원하고 있습니다. 향후에는 NDEF 이외의 포맷도 지원할 계획이 있습니다. 위의 예제를 보면, NDEF 포맷은 4개의 필드를 갖고 있으며 3개의 생략 가능한 Unit8Array 타입 데이터로 정의된 것을 알 수 있습니다. TNF와 type 필드는 등록된 적절한 웹앱으로 메시지를 전달하기 위해 사용됩니다.

(출처: http://git.mozilla.org/?p=releases/gecko.git;a=blob_plain;f=dom/webidl/MozNDEFRecord.webidl;hb=refs/heads/v2.0)

[Constructor(octet tnf, optional Uint8Array type, optional Uint8Array id, optional Uint8Array payload)]
interface MozNDEFRecord
{
  /**
   * Type Name 필드 (3-bits) - 일반적인 NDEF 레코드 타입을 명시함.
   *   tnf_empty: 0x00
   *   tnf_well_known: 0x01
   *   tnf_mime_media: 0x02
   *   tnf_absolute_uri: 0x03
   *   tnf_external type: 0x04
   *   tnf_unknown: 0x05
   *   tnf_unchanged: 0x06
   *   tnf_reserved: 0x07
   */
  [Constant]
  readonly attribute octet tnf;
 
  /**
   * type - payload에 담길 컨텐츠를 설명함. mime type으로 표시할 수 있음.
   */
  [Constant]
  readonly attribute Uint8Array? type;
 
  /**
   * id - 식별자, 어플리케이션이 정한 바에 따름.
   */
  [Constant]
  readonly attribute Uint8Array? id;
 
  /**
   * payload - Binary data blob. 이 필드의 의미는 어플리케이션이 정한 바에
   * 따름.
   */
  [Constant]
  readonly attribute Uint8Array? payload;
};

일러둘 것이 하나 있습니다. 다음번 Firefox OS 출시 때, 우리는 데이터 타입 서술 방식을 약간 바꿀 것입니다. 그래서 TNF를 octet이 아니라 enum 타입으로 수정할 계획입니다.

모질라 Flame 폰이 NFC를 지원합니다, 앞으로 출시될 더 많은 디바이스가 NFC를 지원할 것입니다

모질라 Flame 폰이 NFC를 지원합니다. 곧이어 우리 파트너들이 NFC를 지원하는 더 많은 상용 디바이스를 출시할 것입니다. Flame 폰은 NXP의 NFC 칩셋 (PN547C2)을 지원합니다.

비디오

여기 Firefox OS의 NFC 공유 기능을 설명하는 데모 비디오가 있습니다.

Flame 폰에서 NFC를 활용하는 코어 앱 (Core App)의 목록은 다음과 같습니다.

  • 갤러리 (Gallery)
  • 비디오 (Video)
  • 음악 (Music)
  • 설정 (Settings)
  • 시스템 브라우저 (System browser)

샘플 써드 파티 앱 (3rd party App)

여기 모질리안 Dietrich Ayala가 NFC 태그 읽기 API를 활용해서 만든 앱이 있습니다. BikeCommute는 모질라의 포틀랜드 사무실에 자전거로 출퇴근하는 사람들을 추적하기 위해 NFC 태그를 활용하는 앱입니다. 이 앱은 Firefox OS 2.2가 설치된 Nexus 4 폰 위에서 동작합니다. UI를 위해 Famo.us를 사용했습니다. 그리고 데이터 저장소와 원격지 CouchDB의 싱크를 위해 PouchDB를 사용했습니다. 현재, 이 앱은 태그에 기록된 문자 레코드로부터 사용자의 이메일 주소만 읽어들입니다.

다음 버전에서는 모든 사용자의 폰에서 앱이 실행되도록 지원할 것입니다. 그래서 평범한 문자열 레코드 대신 사용자의 개인 연락처 정보를 이용할 것입니다. 자기 폰으로 NFC 태그를 설정하는 기능도 지원할 것입니다. 그리고 CouchDB 데이터를 이용해서 상위권 멤버 게시판을 만들어서 Mozillians.org에 통합할 계획입니다. 그러면 우리는 이 앱을 이용해서 다른 모질라 사무실 뿐만 아니라 전세계에 있는 모든 모질리안들과 경쟁할 수 있을 것입니다! GitHub에 소스코드가 공개되어 있습니다. 풀-리퀘스트 (pull requests)를 환영합니다!

이 앱이 동작하는 모습을 담은 데모 비디오가 여기 있습니다.

보다 많은 NFC 문서들

여기 문서들이 있습니다!

우리는 점점 커져가는 Firefox OS의 API와 기능 목록에 또다른 추가 소식을 전하게 되어 정말 기쁩니다! 우리는 개발자들이 NFC의 디바이스-투-디바이스 (device-to-device) 공유기능과 미래에 예정된 비접촉 결제 (contactless payment) 기능을 완벽하게 활용했으면 좋겠습니다.

개발자들이 API를 이용할 수 있는 시기는?

현재 이 API는 인증된 앱 (Certified App)만 이용할 수 있습니다. 현재 진행 중인 작업이 끝나면 권한있는 앱 (Privileged App)도 이 API를 사용할 수 있게 됩니다. 그러면 모든 개발자들이 이 API를 사용할 수 있습니다. 그 일이 끝나는 것을 정말이지 기다릴 수 없군요. 만약 당신이 일의 진도를 확인하고 싶거나 우리의 일을 돕고 싶다면, 언제든지 Bug 1042851을 체크해주세요. 우리는 다음 v2.2 출시 때까지 완료하는 것을 목표로 하고 있습니다.

NFC 관련 다음 계획

다음번 릴리즈에서, 우리는 파트너들의 도움으로, NFC의 지원범위 확대에 집중할 것입니다. 그래서 NFC 기반 결제를 위한 보안 장치와 서비스를 제공할 것입니다. 이에 대해서는 별도의 기사를 통해 설명하겠습니다. 관심 있게 지켜봐주세요.

오픈 웹을 위하여!

작성자: ingeeKim

"누구에게나 평등하고 자유로운 웹"에 공감하는 직장인.

ingeeKim가 작성한 문서들…


댓글이 없습니다.

댓글 쓰기