android - Android 和 Linux 之间的 NFC P2P 通信入门 (libnfc)

标签 android linux nfc-p2p lib-nfc

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

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

我最基本的问题是底部方法中的注释:How do I get the request message?

最佳答案

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

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

关于android - Android 和 Linux 之间的 NFC P2P 通信入门 (libnfc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47597882/

相关文章:

java - 如何防止方法被调用两次?

linux - 内核模块使用周期性内核定时器(jiffies 或 hrtimer)从 UART 收集数据

php - 更改 Apache 配置目录?

android - 在没有 Android Beam 的情况下使用 NFC 与两部 Android 手机通信

android - 图片标签在 Android 版 Chrome 上使用了错误的来源

java - Android中Content Provider的Uri中的 "content://"可以替换吗?

mysql - perl 和 MySQL 中的互斥量

android - 如何读取另一台 Android 设备的 NFC ID?

java - 从通过 NFC 接收的 NDEF 消息中获取文本

java - 在附加的堆栈跟踪中获取了资源,但从未释放。内存泄漏