开始Android和Linux之间的NFC P2P通信(libnfc)

开始Android和Linux之间的NFC P2P通信(libnfc),android,linux,nfc-p2p,lib-nfc,Android,Linux,Nfc P2p,Lib Nfc,最后,我需要在Android设备和Linux主机之间实现一个加密协议,该主机具有使用libfc的NFC适配器 我以前从未在Android上使用过NFC。目前,我的想法是在被动变体中以对等模式使用NFC,例如,linux主机上的智能卡读卡器扮演启动器的角色,并提供HF字段,而智能手机是目标 据我所知,回调createNdefMessage可用于响应NFC请求并发回回复消息。然而,我不明白我是如何在我的Android程序中获得请求消息的 目前,作为一个玩具示例,我尝试实现以下目标:linux主机通过

最后,我需要在Android设备和Linux主机之间实现一个加密协议,该主机具有使用libfc的NFC适配器

我以前从未在Android上使用过NFC。目前,我的想法是在被动变体中以对等模式使用NFC,例如,linux主机上的智能卡读卡器扮演启动器的角色,并提供HF字段,而智能手机是目标

据我所知,回调
createNdefMessage
可用于响应NFC请求并发回回复消息。然而,我不明白我是如何在我的Android程序中获得请求消息的

目前,作为一个玩具示例,我尝试实现以下目标:linux主机通过NFC发送一个随机数,android设备提取一个随机数,然后用总和进行回复

我有

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 );
    }
}

我最基本的问题是底部方法中的注释:如何获取请求消息?

根本没有请求消息。Android Beam(这是Android上使用NFC点对点模式的唯一方式)基于SNEP(通过LLCP)。调用方法
createNdefMessage()
,以在设备上构建SNEP客户端提供的NDEF消息。将两台设备放在一起(点击Beam UI后),Android会尝试在另一台设备上定位SNEP服务器,并将NDEF消息推送到其收件箱


因此,在Android Beam中唯一起作用的“请求”是设备用来发送消息的PUT请求。该过程由NFC发现启动,没有收到来自另一方的特定请求。

根本没有请求消息。Android Beam(这是Android上使用NFC点对点模式的唯一方式)基于SNEP(通过LLCP)。调用方法
createNdefMessage()
,以在设备上构建SNEP客户端提供的NDEF消息。将两台设备放在一起(点击Beam UI后),Android会尝试在另一台设备上定位SNEP服务器,并将NDEF消息推送到其收件箱


因此,在Android Beam中唯一起作用的“请求”是设备用来发送消息的PUT请求。该过程由NFC发现启动,没有收到来自另一方的特定请求。

OK。如果我理解正确,智能手机一旦发现另一台设备,
createNdefMessage()
返回的消息就会被发送。因此,这在很大程度上是一种“先开火,然后提问”的方法。但是,我应该如何建立一个“反应式”的多轮沟通,即下一条信息依赖于过去的信息?更正式地说,让a1,a2。。。是来自Alice、b1、b2。。。如果是来自Bob的消息,让Alice启动,让f作为下一个消息函数。然后b1=f(a1),a2=f(a1,b1),b2=f(a1,b2,a2)等等。我怎么会在NFC上实现这样的事情呢?@user2690527你不是。至少在安卓系统上没有点对点模式。不过,有一些方法可以克服这一点:(1)如果你真的想使用P2P模式,你可以设计另一端,让它断开(关闭射频场)ad与Android设备的连接。但可用性相当有限。(2) 您可以让Android设备充当非接触式卡(HCE),并在另一端使用读卡器模式。(3) 您可以让Android作为读卡器,另一端作为卡(如果您连接到Linux系统的NFC设备支持这一点)。如果我理解正确,智能手机一旦发现另一台设备,
createNdefMessage()
返回的消息就会被发送。因此,这在很大程度上是一种“先开火,然后提问”的方法。但是,我应该如何建立一个“反应式”的多轮沟通,即下一条信息依赖于过去的信息?更正式地说,让a1,a2。。。是来自Alice、b1、b2。。。如果是来自Bob的消息,让Alice启动,让f作为下一个消息函数。然后b1=f(a1),a2=f(a1,b1),b2=f(a1,b2,a2)等等。我怎么会在NFC上实现这样的事情呢?@user2690527你不是。至少在安卓系统上没有点对点模式。不过,有一些方法可以克服这一点:(1)如果你真的想使用P2P模式,你可以设计另一端,让它断开(关闭射频场)ad与Android设备的连接。但可用性相当有限。(2) 您可以让Android设备充当非接触式卡(HCE),并在另一端使用读卡器模式。(3) 您可以让Android作为读卡器,另一端作为卡(如果您连接到Linux系统的NFC设备支持此功能)。