Как отправить запрос SNEP GET с Android

У меня есть считыватель NFC ACS ACR122U, и я хочу отправить на него данные со своего телефона Android.

Я нашел много примеров того, как подключить два моих устройства в режиме P2P и как отправить данные с моего телефона на ACR122U, но мой настольный сервер (ACR122U) всегда получает запрос SNEP PUT. Я бы отправил запрос GET, но я могу найти только примеры, которые используют Android, встроенный в систему NDEF, без указания запроса PUT или GET.

Как я могу упаковать и отправить запрос SNEP GET с моего устройства Android на ACR122U?


person firegloves    schedule 30.12.2016    source источник


Ответы (1)


Краткий ответ: вы не можете.

Android API не позволяет реализовывать пользовательские службы LLCP. Единственными службами LLCP, реализованными на устройствах Android, являются сервер NFC Forum SNEP по умолчанию (имя службы urn:nfc:sn:snep, адрес точки доступа к службе 4) и, по устаревшим причинам, протокол push-уведомлений Android NDEF (аналогичный SNEP, но восходящий к временам, предшествующим спецификации SNEP). был опубликован).

В то время как спецификация протокола SNEP определяет запрос GET для извлечения сообщения NDEF с другого устройства, сервер SNEP по умолчанию NFC Forum определен только для приема запросов PUT. Запросы GET должны отклоняться этим сервером SNEP.

Из технической спецификации протокола обмена NFC Forum Simple NDEF (версия 1.0):

Сервер SNEP по умолчанию предоставляет логический почтовый ящик. Клиент, подключенный к серверу по умолчанию, может помещать сообщения NDEF в папку «Входящие», используя сообщения запроса на размещение. [...]

Сервер по умолчанию НЕ ДОЛЖЕН принимать запросы Get. Соответствующий ответ на сообщение запроса Get — Not Implemented.

Таким образом, вы можете отправлять сообщения NDEF только на сервер NFC Forum SNEP по умолчанию, а не наоборот.

Следовательно, если вы хотите отправить сообщение NDEF на устройство Android через одноранговый режим, вам необходимо реализовать SNEP клиент< /em> на стороне ACR122U. Затем вы можете позволить этому клиенту подключиться к серверу SNEP на устройстве Android (с именем службы urn:nfc:sn:snep) и передать ему сообщение NDEF с помощью запроса PUT.

Если вы хотите получать сообщение NDEF от устройства Android через одноранговый режим, вам необходимо внедрить SNEP сервер на стороне ACR122U. Затем клиент Android SNEP подключится к вашему серверу SNEP и отправит на него ожидающее сообщение NDEF (например, зарегистрированное через NfcAdapter.setNdefPushMessage()), используя, опять же, запрос PUT.

person Michael Roland    schedule 02.01.2017
comment
Хорошо, но если я реализую сервер SNEP на стороне ACR122U? - person firegloves; 02.01.2017
comment
Я думаю, что при связи между двумя устройствами Android одно из них должно действовать как сервер, а другое - как клиент, верно? Итак, если устройство Android может выступать в качестве клиента SNEP, почему в моем случае я не могу использовать свой ACR122U в качестве сервера, а свой телефон Android в качестве клиента? В противном случае, знаете ли вы какой-либо пример того, как начать реализацию моего сервера SNEP на Android? - person firegloves; 02.01.2017
comment
@firegloves Помимо LLCP, оба могут выступать в качестве серверов и клиентов по одной и той же ссылке. На самом деле Android мешает и клиенту, и серверу для SNEP. Как я писал в своем посте выше, если вы хотите передать сообщение NDEF с ACR122U на Android, вам необходимо реализовать клиент SNEP на стороне ACR122U, который подключается и выполняет PUT на сервер SNEP, который уже есть на устройствах Android. - person Michael Roland; 02.01.2017
comment
Хорошо, спасибо за ваш ответ, но я хочу отправить данные с Android и получить ответ от ACR122U. По этой причине я не хочу использовать PUT и не хочу использовать Android в качестве сервера. Итак, ответ заключается в том, что с Android я не могу упаковать запрос GET, также имея собственный сервер SNEP на моем ACR122U? - person firegloves; 02.01.2017
comment
@firegloves В этом случае вам необходимо реализовать как сервер SNEP, так и клиент. Сначала получите сообщение NDEF от Android через сервер SNEP, затем подключитесь с помощью клиента SNEP к серверу SNEP на стороне Android и отправьте на него свое ответное сообщение. - person Michael Roland; 02.01.2017
comment
Ок, спасибо, попробую так. Но я не могу понять, почему они заблокировали эту функцию - person firegloves; 02.01.2017
comment
@firegloves Можно только догадываться, почему форум NFC ограничил это (возможно, Stephen Tiedemann читает это и может дать более определенный ответ). На мой взгляд, они, вероятно, сделали это для упрощения реализации. В конце концов, спецификация SNEP не определяет никаких действий для обработки полученных сообщений NDEF (следовательно, нет необходимости в двунаправленном обмене NDEF связанным образом). - person Michael Roland; 02.01.2017
comment
Я понял ваши рассуждения, но не могу понять, почему я не могу отправлять запросы GET с Android. Я могу прочитать в спецификации NFC Forum Snep, что запрос GET уже определен. Я думаю, что сервер по умолчанию ДОЛЖЕН реализовать как минимум управление запросами PUT, потому что общая реализация бесполезна, но ее можно реализовать. Поэтому, если я могу управлять запросами GET со своего сервера, я могу отправить этот запрос. Может быть, есть универсальное Java-решение для их создания и отправки? - person firegloves; 02.01.2017
comment
@firegloves Не на стороне Android, так как нет API для одноранговой связи (LLCP). - person Michael Roland; 02.01.2017
comment
Я нашел этот ресурс android.googlesource.com/platform/packages/apps/Nfc/+/ вы видели это? - person firegloves; 02.01.2017
comment
@firegloves Да, это клиент SNEP для Android, который отправляет сообщения на сервер SNEP на другом устройстве (например, для сообщений, зарегистрированных через NfcAdapter.setNdefPushMessage()), как я писал в своем посте. Он используется из P2pLinkManager. . - person Michael Roland; 02.01.2017
comment
Причина, по которой эта версия также реализует запросы GET, объясняется здесь: P2pLinkManager.java#896. Но это, похоже, можно использовать только для передачи соединения. - person Michael Roland; 02.01.2017
comment
Работал с несколькими запросами PUT. Это немного сложнее, потому что мне пришлось увеличить сложность моего протокола обмена, но это работает. Спасибо - person firegloves; 05.01.2017
comment
Я хочу отправить несколько сообщений ndef с помощью put из Android? Удалось ли вам сделать это с помощью пользовательского кода или просто с помощью NfcAdapter.setNdefPushMessage()? - person user257980; 15.01.2020