1

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

我以前从未在 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 );
    }
}

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

4

1 回答 1

0

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

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

于 2017-12-04T11:15:08.493 回答