Android 프로그래밍 2

본문 바로가기
사이트 내 전체검색


Android 프로그래밍 2
Android 프로그래밍 2

1. NFC 기초

페이지 정보

작성자 관리자 댓글 0건 조회 3,552회 작성일 20-06-11 11:30

본문

1. NFC 기초

NFC 및 NDEF
애플은 2017년 9월 iOS 11에서 NFC 태그를 읽는 기능을 지원했다 . 

iPhone 7 부터 모든 iPhone 은 NFC 태그를 읽는 API 를 제공 한다. 

안드로이드는 오래동안 NFC을 포함했지만 NFC 태그 시나리오를 제공하지는 않았다.


NFC란

근거리 무선 통신 기술 : 

NFC는 1cm 미만의 거리에서 데이터를 즉시 전송합니다. 따라서 무언가를“탭”한다고 느낄 것이다. 

또한 전송 속도가 느립니다. 최대 값은 424kbit / sec입니다. 

NFC를 통해 이미지를 전송하는 데 몇 분이 걸립니다. 

따라서 NFC는 짧은 거래 (인증, 방 액세스, 지불) 및 기타 작업 (열린 웹 사이트, Bluetooth 또는 Wi-Fi와의 쌍)에 대한 트리거로만 사용됩니다.


NFC 작동 모드
완전 NFC 가능 전화는 3 가지 작동 모드를 지원합니다.


리더 / 라이터 : 전화기가 NFC 태그에서 데이터를 읽거나 데이터를 다시 씁니다. Apple 의 핵심 NFC API는 NDEF 메시지가 포함 된 공개 NFC 태그 읽기만 지원합니다. 

Android 휴대 전화는 일반적으로 읽고 쓸 수 있으며 태그에 대한 전체 액세스 권한을 부여합니다.


피어 투 피어 : 한 전화기에서 다른 전화기로 직접 데이터를 전송합니다. 

Android는 표준화 된 SNEP 프로토콜 (Simple NDEF Exchange Protocol)을 사용합니다. 

이를 위해 Google은 'Android Beam'이라는 브랜드를 만들었습니다.


카드 에뮬레이션 : 휴대 전화는 NFC 태그 / 스마트 카드를 시뮬레이션합니다. 

외부 리더 장치에서는 NFC 지원 신용 카드처럼 보일 수 있습니다. 기존에는 전용 하드웨어 가 필요했습니다. 

지금은 앱에서 카드를 시뮬레이션 할 수도 있습니다.




1.PNG


NFC 태그 및 NDEF
 

NFC 포럼에서는 5 가지의 다른 NFC 태그 유형을 표준화했습니다 . 

요한 것은 기능 (암호화), 메모리 크기, 속도 및 비용과 같은 다양한 요소에 따라 다릅니다.

표준 사용 사례에 대한 일반적인 선택 은 NFC 폼 유형 2 태그 인 NXP NTAG 입니다. 

144에서 888 바이트의 사용자 메모리 구성으로 사용할 수 있습니다. 


13.PNG 

 


NDEF 메시지 및 레코드


NFC 태그에는 바이트를위한 작은 저장 영역이 있습니다. 

NFC 포럼은 NDEF ( "NFC Data Exchange Format")라는 콘텐츠 형식을 표준화했습니다. 

iPhone 은 NDEF 메시지가 포함 된 NFC 태그 만 지원합니다. 

Android는 NDEF 메시지를 완벽하게 지원하지만 추가 옵션 (예 : 하위 수준 태그 액세스)도 제공합니다.


태그는 하나 이상의 NDEF 메시지를 포함 할 수 있습니다 . 

저장 공간이 작다는 것을 감안할 때 실제로 태그에서 두 개 이상의 메시지를 본 적이 없습니다.


NDEF 메시지는 1+ NDEF 레코드 로 구성 됩니다. 

여기에는 페이로드가 포함됩니다. 

레코드 유형에 따라 URL, 텍스트, MIME 유형 또는 핸드 오버 정보와 같은 표준화 된 컨텐츠 일 수 있습니다. 

또한 사용자 정의 컨텐츠 형식을 정의 할 수 있습니다.


Android 에뮬레이터는 NFC를 지원하지 않습니다. 앱을 테스트하려면 실제 전화가 필요합니다. 

 

 

NFC Demo 프로젝트 생성

 

프로젝트명 : NFCDemo



2.PNG



화면 디자인 수정(activity_main.xml)

 


3.PNG



Android NFC의 권한 및 필수 기능

 

앱에 NFC 지원을 추가하려면 AndroidManifest.xml을 엽니다 . 다음 두 줄을 추가하십시오.


권한 : 휴대 전화의 NFC 하드웨어에 액세스하려면 다음이 필요합니다.
<uses-permission android:name="android.permission.NFC" />


하드웨어 기능 선언 : 앱이 NFC에 의존한다는 외부 엔티티 (특히 Google Play 스토어)에 알립니다. required 를 true로 설정 하면 전화의 NFC 지원이 필수입니다. 스토어는 NFC 지원 전화에만 앱을 표시합니다.
<uses-feature android:name="android.hardware.nfc" android:required="true" />


NFC 지원 요청


매니페스트에 요구 사항 및 종속성을 지정하더라도 앱은 여전히 ​​지원되지 않는 장치에 연결할 수 있습니다.

사용자 가 Google Play 스토어를 통하지 않고 수동으로 앱을 설치했습니다 . 

이 경우 uses-feature 정의가 적용되지 않습니다.
전화가 NFC를 지원하더라도 설정에서 현재 비활성화되어 있을 수 있습니다 .
따라서 앱이 시작될 때 NFC 지원을 확인하는 것이 좋습니다. 


MainActivity의 onCreate () 에 다음 행을 추가하십시오 .


var nfcAdapter = NfcAdapter.getDefaultAdapter(this)
logMessage("NFC supported", (nfcAdapter != null).toString())
logMessage("NFC enabled", (nfcAdapter?.isEnabled).toString())


nfcAdapter가 null 이면 , 전화는 NFC를 지원하지 않습니다. 

nfcAdapter.isEnabled가 true를 반환하면, NFC가 준비가 된것입니다.


NFC 인텐트 등록

 

다음으로 앱을 Android에 등록합니다. 

태그에서 특정 NDEF 레코드를 찾을 때마다 앱을 시작하려고합니다. 

이 인텐트 필터 를 매니페스트 의 activity에 추가하십시오.

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <!-- Default category is required for the intent filter to work -->
    <category android:name="android.intent.category.DEFAULT"/>
    <!-- Browsable also enables opening this app through a link on a website -->
    <category android:name="android.intent.category.BROWSABLE" />
    <!-- Intent filters without data will never be triggered on NFC devices.
    Always define the specific data you expect to be present. -->
    <data android:scheme="https" android:host="www.andreasjakl.com" />
    <!-- Additionally support http scheme. See:
    https://developer.android.com/training/app-links/verify-site-associations.html -->
    <data android:scheme="http" />
</intent-filter>

인텐트 필터를 자세히 살펴 보겠습니다.


NDEF 형식의 태그를 사용하는 경우 

android.nfc.action.NDEF_DISCOVERED를 사용합니다 .


모든 인텐트필터는 카테고리가 필요합니다. 

최소한 android.intent.category.DEFAULT 카테고리를 제공해야 합니다..


Android는 모든 NDEF 메시지에 대한 일반 가입을 허용하지 않습니다. 

대신 관심있는 특정 NDEF 메시지에 대한 자세한 정보를 제공합니다. 

이는 데이터 요소를 통해 수행됩니다 .

최소한 웹 사이트 의 구성표 와 호스트 를 제공하십시오. 보다 

일반적인 필터를 만들려면 https 와 http 모두를 필터링하는 것이 좋습니다 . 



4.PNG


 

NFC 인텐트 받기

 

이제 NFC를 사용할 수있는 권한이 있습니다.
또한 언제 어플리케이션을 시작할지 Android에 알렸습니다.
NFC 태그 내용에 대한 자세한 내용은 어떻게 알 수 있을까요?

예를 들어, 각 전시회에 고유한 태그가있는 박물관 사용 사례에서는 URL의 고유한 부분을 추출합니다.
URL에서 찾은 항목 이름 또는 ID를 사용하여 앱에 관련 정보를 표시합니다.


Android에서 NDEF_DISCOVERED 인텐트의 내용

 

인텐트의 두 가지 속성

Action : 관련 인텐트는 Action을 가진다
NfcAdapter.ACTION_NDEF_DISCOVERED

Data : NDEF 메시지의 raw contents은 parcelable array extra안에 포함된다.
NfcAdapter.EXTRA_NDEF_MESSAGES


인텐트 및 안드로이드 앱 실행

 

Android는 앱에 인텐트를 어떻게 전달할까?


안드로이드에서 NFC 인텐트 받기

12.PNG

 

onCreate() : 앱이 NFC 태그를 통해 시작되면 Android는 새로운 인스턴스를 만듭니다.
Activity의 intent 속성을 통해 NDEF 데이터를 검색합니다 .


onNewIntent() : 액티비티가 이미 열려 있으면 어떻게될까?
기본적으로 Android는 새 액티비티 인스턴스를 시작합니다.
이 동작을 방지하려면 매니페스트에서 launchMode 를 singleTop 으로 설정한다.
그런 다음 기존 기존 액티비티의  onNewIntent()를 통해 인텐트를 얻습니다.
더 이상 다시 시작되지 않습니다.


Incoming NFC 인텐트 처리

 

인텐트가 앱에 도달하기 위해 어떤 방법을 사용하든, 중앙 집중식으로 처리하는 것이 좋습니다.
processIntent() 라는 새 함수를 작성하고 두 진입 점에서 호출하십시오.


override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    if (intent != null) {
        processIntent(intent)
    }
}

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)

    if (intent != null) {
        processIntent(intent)
    }
}

onCreate()에서 액티비티의 인텐트 프로퍼티를 얻는다.
onNewIntent()에서 인텐트 파라메터를 사용한다.


인텐트에서 NDEF 메시지 검색

 

사용자 정의 processIntent() 함수에서 마지막으로 NFC 태그 내용을 조사합니다.
다음 스 니펫은 의도 유형을 확인하고 원시 NDEF 메시지 배열을 추출합니다.


private fun processIntent(checkIntent: Intent) {
    // Check if intent has the action of a discovered NFC tag
    // with NDEF formatted contents
    if (checkIntent.action == NfcAdapter.ACTION_NDEF_DISCOVERED) {

        // Retrieve the raw NDEF message from the tag
        val rawMessages = checkIntent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)

        // ...

    }
}


NFC / NDEF 메시지 내용

 

메시지에 단일 레코드가 포함되어 있음을 알 수 있습니다.
가장 중요한 것은 페이로드(바이트 배열)입니다

위의 이미지에서 첫 번째 바이트는 0x02 입니다.
NFC 태그에 쓰기 가능한 공간이 부족합니다.
가장 일반적인 URI 체계는 표준화 된 목록을 기반으로 단일 바이트로 약칭됩니다.
0x02 는 "https : // www"를 의미합니다 . . 12 바이트 대신 1 바이트 만 필요합니다.
전체 태그에 48 바이트의 저장 메모리 만 있으면 큰 차이가 있습니다.
NDEF 라이브러리에서 전체 목록 또는 URI 스킴을 확인하십시오 .

나머지 바이트는 NFC 태그에 쓰여진 URL의 직접 ASCII 코드입니다.
레코드 내부의 URL은 UTF-8로 인코딩됩니다.


NDEF 메시지에서 데이터 추출

 

필요한 모든 데이터는 위의 인스펙터 창의 스크린 샷에서 볼 수 있습니다.
URL을 추출하는 코드를 작성해 봅시다.

첫 번째 NDEF 메시지 추출 :
앞에서 언급했듯이 대부분의 NDEF 태그에는 하나의 메시지 만 있습니다.
우리는 단순히 첫 번째를 취합니다.

var ndefMsg = rawMessages[0] as NdefMessage


메시지의 첫 번째 레코드 가져 오기 :
Android는 이미 메시지 컨텐츠를 레코드 배열로 구문 분석했습니다.
다시, 우리는 첫 번째 기록에 관심이 있습니다.
var ndefRecord = ndefMsg.records[0]


정보 추출 :
Android에는 URI 구문 분석 기능이 내장되어 있습니다.
따라서 앞에서 설명한 효율적인 바이트 인코딩에 대해 걱정할 필요가 없습니다.
다른 모든 레코드 유형의 경우 원시 페이로드를 기록합니다.

if (ndefRecord.toUri() != null) {
    // Use Android functionality to convert payload to URI
    logMessage("URI detected", ndefRecord.toUri().toString())
} else {
    // Other NFC Tags
    logMessage("Payload", ndefRecord.payload.contentToString())
}
 



MainActivity.kt 수정

 5.PNG

6.PNG

7.PNG

8.PNG

9.PNG

10.PNG

11.PNG

댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.