2017-12-01 3 views
1

결국 Android 기기와 libfc를 사용하는 NFC 어댑터가있는 Linux 호스트 사이에 암호화 프로토콜을 구현해야합니다.Android와 Linux (libnfc) 간의 NFC P2P 통신 시작

Android와 함께 NFC를 사용한 적이 없습니다. 현재 나의 생각은 피어 - 투 - 피어 (peer-to-peer) 모드에서 NFC를 수동 변종 (예 : Linux 호스트의 스마트 카드 리더는 초기 자의 역할을 수행하고 스마트 폰이 목표 일 때 HF 필드를 제공합니다.

나는 콜백 createNdefMessage을 사용하여 NFC 요청에 응답하고 응답 메시지를 다시 보낼 수 있음을 이해합니다. 그러나 Android 프로그램에서 요청 메시지를받는 방법을 이해할 수 없습니다.

현재로서는 장난감의 예로서 다음을 시도합니다. linux 호스트가 NFC를 통해 임의의 숫자를 보내면 안드로이드 장치가 임의의 숫자를 그려 합계로 응답합니다.

나는

package edu.kit.iti.crypto.nfctest1; 

import android.app.Activity; 
import android.content.Intent; 
import android.nfc.*; 
import android.os.Bundle; 
import android.provider.Settings;  
import java.nio.ByteBuffer; 

public class MainActivity extends Activity implements NfcAdapter.CreateNdefMessageCallback { 

    protected NfcAdapter nfcAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     nfcAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext()); 
     nfcAdapter.setNdefPushMessageCallback(this, this); 
    } 

    protected void onResume() { 
     super.onResume(); 
     if(!nfcAdapter.isEnabled()) { 
      startActivity(new Intent(Settings.ACTION_NFC_SETTINGS)); 
     } else if(!nfcAdapter.isNdefPushEnabled()) { 
      startActivity(new Intent(Settings.ACTION_NFCSHARING_SETTINGS)); 
     } 
    } 

    public NdefMessage createNdefMessage(NfcEvent event) { 
     int randomNumber = 42; 
     // How to obtain the request message here? 
     ByteBuffer buffer = ByteBuffer.allocate(4); 
     buffer.putInt(randomNumber); 
     NdefRecord replyRecord = NdefRecord.createExternal("edu.kit.iti.crypto.nfctest1", "app-randomness", buffer.array()); 
     return new NdefMessage(replyRecord); 
    } 
} 

내 아주 기본적인 질문은 아래에있는 방법의 코멘트입니다있다 : 어떻게 요청 메시지를받을 수 있나요?

답변

0

요청 메시지가 없습니다. Android Beam (Android에서 NFC 피어 - 투 - 피어 모드를 사용하는 유일한 방법)은 SNCP (LLCP 이상)를 기반으로합니다. createNdefMessage() 메서드가 호출되어 장치의 SNEP 클라이언트가 제공하는 NDEF 메시지를 작성합니다. 두 개의 장치를 가져오고 (Beam UI를 누른 다음) Android는 다른 장치에서 SNEP 서버를 찾으려고 시도하고 NDEF 메시지를받은 편지함으로 푸시합니다.

Android Beam에서 역할을하는 유일한 "요청"은 기기에서 메시지를 보내는 데 사용되는 PUT 요청입니다. 이 프로세스는 NFC 검색에 의해 시작되며 상대방으로부터 특정 요청이 수신되지 않습니다.

+0

확인. 내가 올바르게 이해하면,'createNdefMessage()'에 의해 반환 된 메시지는 스마트 폰이 다른 장치를 발견하자 마자 전달됩니다. 그래서 그것은 "화재 우선, 묻다"접근 방식의 많은 부분입니다. 그러나 다음 메시지가 과거 메시지에 의존하는 "반응 적"다중 순환 통신을 어떻게 구축해야합니까? 더 공식적으로, a1, a2, ...를 Alice, b1, b2, ...의 메시지라고하고, Bob의 메시지 라하면 Alice가 시작하고 f가 다음 메시지 기능이되도록합니다. 그러면 b1 = f (a1), a2 = f (a1, b1), b2 = f (a1, b2, a2) 등이된다. NFC로 어떻게 그런 것을 실현할 수 있습니까? – user2690527

+0

@ user2690527 당신은 ** 아닙니다 **. 적어도 Android에서는 피어 투 피어 모드가 아닙니다. 그러나 이것을 극복 할 수있는 방법이 있습니다. (1) P2P 모드를 사용하려면 상대방과의 연결을 끊고 (RF 필드를 끄고) Android 단말기에 다시 연결하는 방식으로 디자인합니다. 유용성은 다소 제한적입니다. (2) Android 기기를 비접촉식 카드 (HCE)로 사용하고 반대쪽에서 리더 모드를 사용할 수 있습니다. (3) Android 시스템을 독자로 사용하고 다른 끝을 카드로 사용할 수 있습니다 (Linux 시스템에 연결 한 NFC 장치가이를 지원하는 경우). –