如何从 Android 发送 SNEP GET 请求

How to a send SNEP GET request from Android

我有一个 NFC reader ACS ACR122U,我想从我的 Android phone 向它发送数据。

我找到了很多关于如何以 P2P 模式连接我的两个设备以及如何将数据从我的 phone 发送到 ACR122U 的示例,但是我的桌面服务器 (ACR122U) 总是收到 SNEP PUT 请求。我会发送 GET 请求,但我只能找到使用 Android 内置 NDEF 系统的示例,而无需指定 PUT 或 GET 请求。

如何打包并从我的 Android 设备向 ACR122U 发送 SNEP GET 请求?

简答:你不能。

Android API 不允许您实施自定义 LLCP 服务。在 Android 设备上实现的唯一 LLCP 服务是 NFC 论坛默认 SNEP 服务器(服务名称 urn:nfc:sn:snep,服务访问点地址 4),并且由于遗留原因,Android NDEF 推送协议(类似于 SNEP,但可以追溯到 SNEP 规范发布之前的时代)。

虽然 SNEP 协议规范定义了一个 GET 请求以从另一个设备提取 NDEF 消息,但 NFC 论坛默认 SNEP 服务器被定义为仅接受 PUT 请求。 GET 请求必须 被该 SNEP 服务器拒绝。

来自 NFC 论坛简单 NDEF 交换协议技术规范(1.0 版):

The default SNEP server provides a logical inbox. A client connected to the default server can place NDEF messages into the inbox using Put request messages. [...]

The default server SHALL NOT accept Get requests. The appropriate response for a Get request message is Not Implemented.

因此您只能将 NDEF 消息推送到 NFC 论坛默认 SNEP 服务器,而不是相反。

因此,如果您想通过对等模式发送 NDEF 消息 Android 设备,需要在ACR122U端实现一个SNEP client。然后,您可以让该客户端连接到 Android 设备上的 SNEP 服务器(服务名称 urn:nfc:sn:snep),并使用 PUT 请求将 NDEF 消息推送给它。

如果你想通过对等模式从Android设备接收NDEF消息,你需要在 ACR122U 侧实现 SNEP server。 Android SNEP 客户端将连接到您的 SNEP 服务器,并再次使用 PUT 请求将等待的 NDEF 消息(例如通过 NfcAdapter.setNdefPushMessage() 注册)推送给它。