Android Beam и SNEP для pn532

пытаемся отправить большой файл с андроид телефона на микропроцессор через nfc-p2p, android-beam и snep.

Это то, что мы имеем до сих пор. Я могу подключить pn532 (цель) к телефону (инициатору). Мое приложение для Android использует setNdefPushMessage для отправки NdefMessage через nfc. Как только я касаюсь телефона (Beam-UI), он начинает подключаться к SAP 4 на моем pn532, и после команды чтения (tgGetData) я получаю следующее:

00 FF 86 7A D5 87 00 13 20 00 10 02 00 00 03 BD C1 01 00 00 03 B6 54 30 68 61 6C 6C 6F 20 64 61 73 20 69 73 74 20 65 69 6E 20 74 65 73 74 31 68 61 6C 6C 6F 20 64 61 73 20 69 73 74 20 65 69 6E 20 74 65 73 74 32 68 61 6C 6C 6F 20 64 61 73 20 69 73 74 20 65 69 6E 20 74 65 73 74 33 68 61 6C 6C 6F 20 64 61 73 20 69 73 74 20 65 69 6E 20 74 65 73 74 34 68 61 6C 6C 6F 20 64 61 73 20 69 73 74 20 65 69 6E 20 74 65 73 74

Чтобы очистить его: Заголовок PN532: 00 FF 86 7A D5 87 00 бит MI не установлен!
Заголовок LLCP: 13 20 00 I-Package из SAP 32 в 4
Заголовок SNEP: 10 02 00 00 03 BD версия 10 запрос PUT len 0x3bd
Заголовок NDEF: C1 01 00 00 03 B6 54 c1 : start+EndMessage
Сообщение ... остальное

Я сделал соединение полным с MUI 128.

моя проблема: он говорит, что пакет SNEP имеет длину 0x3BD байт, но я получил только эту короткую часть. Нигде в этом сообщении не указано, является ли оно разделенным сообщением.

где остальные мои данные? Я пытался прочитать больше пакетов от pn532, но их не было.

** редактировать: после ночи попыток я наконец-то добился чего-то. Что хотя бы иногда работало:(все с точки зрения PN532)
получить: Соединение
отправить: Соединение завершено[MUI=128]
получить: SYMM
отправить: SYMM
получить: I сначала фрагментированные данные (как показано выше)
отправить: RR
получить: SYMM
отправить: I SNEP:ответ CONTINUE
получить: RR
отправить: I SNEP:запрос CONTINUE
получить: I второй фрагмент данных
отправить: RR
получить: RR
отправить: I SNEP:запрос CONTINUE
получить: I третий фрагмент данных

Как я уже сказал, это работает только несколько раз. Большую часть времени мой PN532 просто отвечает кодом ошибки 0x29 -> Инициатор разорвал соединение. Итак, вопрос в том, может ли это быть проблема синхронизации или что еще приводит к разрыву соединения перед отправкой остальных данных.


person Black-Devel    schedule 25.02.2015    source источник
comment
Какова остальная часть сообщения LLCP? Точнее, о каком MIU договорились ваш микроконтроллер и Android-устройство? Может это 128 байт?   -  person Michael Roland    schedule 25.02.2015
comment
Да, 128 байт. Я также пробовал другие, но это почти всегда дает тот же результат: соединение разрывается (PN532 дает код ошибки 0x29)   -  person Black-Devel    schedule 26.02.2015


Ответы (1)


SNEP разработан как простой протокол запроса/ответа, работающий поверх соединения канала передачи данных LLCP (пара исходного и целевого SAP, установленная с помощью CONNECT). Клиент запрашивает операцию для выполнения сервером, и сервер возвращает ответ. С помощью операции PUT клиент прикрепляет данные к запросу. Если затем запрос превышает максимальный размер информационного блока информационного PDU LLCP, клиент передает запрос соответствующими фрагментами. Первый фрагмент информирует сервер о количестве октетов, которые он должен быть готов получить от клиента. Если сервер может получить данные, он отвечает на первый фрагмент ответом Continue, если размер данных превышает возможности сервера, он может остановить обмен ответом Reject. После того, как клиент получил ответ «Продолжить», он отправит все оставшиеся фрагменты, не ожидая промежуточных ответов. Наконец, сервер отправляет ответ «Успех» после получения всех данных запроса, как указано значением длины. Тот же принцип применяется к большим ответам SNEP, за исключением того, что «Продолжить» или «Отклонить» являются сообщениями-запросами (поскольку они отправляются клиентом).

person Stephen Tiedemann    schedule 26.02.2015
comment
так вы говорите, что мои запросы на продолжение неверны? когда я пытался просто отправить symm. вместо. но без запроса клиент (телефон) так и не продолжил отправку фрагментов. - person Black-Devel; 26.02.2015
comment
Будучи на стороне сервера, вы должны отправить один ответ «Продолжить» после получения первого фрагмента. Затем клиент отправит оставшиеся фрагменты, и после последнего вы отправите ответ «Успех». - person Stephen Tiedemann; 27.02.2015