2017-12-01 16 views
1

最終的に、Androidデバイスとlibfcを使用するNFCアダプタを搭載したLinuxホストの間で暗号化プロトコルを実装する必要があります。AndroidとLinux(libnfc)間のNFC P2P通信を開始する

私はかつてAndroidでNFCを使ったことがありません。現時点では、私の考えは、パッシブ型のピアツーピアモードで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メッセージが構築されます。 2つのデバイスをまとめて(そしてBeam UIをタップした後)、AndroidはSNEPサーバーを他のデバイスに配置しようとし、NDEFメッセージをその受信ボックスにプッシュします。

Android Beamで役割を果たす唯一の「リクエスト」は、デバイスがメッセージを送信するために使用するPUTリクエストです。プロセスはNFCディスカバリによって開始され、特定の要求は相手側から受信されません。

+0

OK。私が正しく理解していれば、 '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モードを使用したい場合は、Androidデバイスへの再接続を切断する(RFフィールドをオフにする)方法で相手先を設計することができます。しかし、使いやすさには限りがあります。 (2)Androidデバイスを非接触カード(HCE)として動作させ、相手側でリーダーモードを使用させることができます。 (3)あなたはAndroidを読者にし、もう片方をカードとして使うことができます(Linuxシステムに接続しているNFCデバイスがこれをサポートしている場合)。 –

関連する問題