안드로이드/정리

[Android] NFC에 관해...

NFC

  • 가까운 거리에서 동작하는 근거리 무선 통신 기술
  • RFID의 기술을 확장한 것
    - RFID : 태그에 있는 데이터만 읽기 가능
  • 최대 848Kpbs의 Data 전송 가능
  • 양방향 실시간 데이터 통신이 가능
  • 블루투스 보다 전송속도는 느리나, 통신설정 시간이 짧아 인식과 반응속도 빠름

 

NFC 운용모드

태그 읽기/쓰기 - 태그의 데이터를 읽기와 쓰기 가능

P2P 통신 - 디바이스끼리 P2P 데이터 통신 가능

HCE 모드 (Host Card Emulation) - Tag Emulation Mode

 

Android 표준 Tag Dispatch System 절차

NFC Tag Dispatch System 우선순위

  • ACTION_NDEF_DISCOVERED
    - NDEF 페이로드가 포함된 태그 또는 태그의 유형이 인식될 경우
    - 우선 순위가 가장 높음
  • ACTION_TECH_DISCOVERED
    - MIME 유형 또는 URI 매핑을 할 수 없는 NDEF 데이터가 포함된 경우
    - 태그에 NDEF 데이터가 포함되어 있지 않은 경우
  • ACTION_TAG_DISCOVERED
    - 위 2가지 인텐트에 필터링이 안 된 경우에 사용

NDEF

  • NFC Forum Data Exchange Format의 약자, NFC Tag에 NFC data를 저장하기 위한 컨테이너 포맷
  • 정의된 여러 타입이 있음(Record) : URI, TextRecord, AAR(Android Application Record)
  • NdefMessage는 여러 개의 NdefRecord로 구성됨
  • NFC Tag를 구성하는 Data는 그 유형에 따라 구분되며, 가장 많이 사용되는 유형은 일반 텍스트와 URI

NdefRecord 구성

  • Payload type : record format 설명 :: T:Text, U:Uri, SP:Smart Poster
  • Payload Identifier : record의 고유한 식별자
  • Payload length : payload의 크기
  • Payload : application에서 사용하는 Data

TNF(Typed Named Format)

  • EMPTY (0x00000000)
  • WELL_KNOWN (0x00000001)
  • MIME_MEDIA (0x00000002)
  • ABSOLUTE_URI (0x00000003)
  • EXTERNAL_TYPE (0x00000004)
  • UNKNOWN (0x00000005)

 

NFC API

NFCManager

- NFCAdapter를 얻을 때 사용하는 class

 

NFCAdapter

- NFC 하드웨어에 접근하는 기능을 제공하는 class

- getDefaultAdapter() 함수를 통해 얻어옴

- 제공 주요함수 (getDefaultAdapter() : NFCAdapter를 얻을 때 사용)

 

주요함수

enableForegroundDispatch() / disableForegroundDispatch()

: 포그라운드 기능 활성화, 비활성화

ex) nAdapter!!.enableForegroundDispatch(this, pIntent, filters, null)

filters = Manifest에 설정하는 값

null = tech list

 

setNdefPushMessage / setNdefPushMessageCallback()

: Android Beam에서 NDEF Message 전송시 사용

 

setBeamPushUris() / setBeamPushUrisCallback() -> P2P 통신 (Android Beam)

: Android Beam 에서 NFC와 Bluetooth를 활용해 데이터 전송시 사용

 

NdefMessage

- NFC 포럼에서 정의한 Data 형식을 만드는 class

- Intent에서 getParcelableArrayExtra() 함수 이용해 raw Data를 얻어낸다.

ex) val rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)

 

NdefRecord

- NdefMessage를 구성하는 단위 calss로 N 개의 NdefRecord로 구성

- getPayload() : NdefRecord에 포함된 앱 Data 정보를 얻을 때 사용

- 각각의 Data Type에 해당하는 NdefRecord를 생성할 때 사용 

:: createUri(), createMime(), createApplicationRecord()

 

Ndef

- Tag 관련 기본정보(Tag type, size)나 tag를 읽고 쓰는 기능을 제공

- 주요함수

.connect() : 태그와 태그 정보를 write할 기기간 연결 설정

.writeNdefMessage() : Tag에 NdefMessage를 write 함

.getMaxSize() : Tag에 write할 수 있는 최대 NdefMessage 크기 (단위 byte)

.makeReadOnly() : Tag를 읽기 전용 모드로 변경

.canMakeReadOnly() : makeReadOnly() 함수를 이용해 읽기 전용 태그로 변경이 가능한지 여부를 알렺무

.isWriteble() : Tag가 쓰기가 가능한지 여부를 알려줌

 

Tag

- Tag가 지원하는 기술 포맷을 정의하는 클래스

- 주요함수

.getTechList() : Tag가 지원하는 사용 가능한 기술셋 정보 조회

.getId() : Tag의 ID 정보 조회

 

Intent로 부터 정보 획득

- 필요한 정보를 가져오기 위한 action 이름

.EXTRA_TAG : 스캔된 Tag 객체의 정보 조회시

.EXTRA_NDEF_MESSAGE : Tag에 저장된 NDEF Message 조회시

.EXTRA_ID : Tag ID