Android Beam: запуск приложения с записью типа MIME

Я работаю над проектом, где я использую Android-смартфон и USB-чип PN532 (elechouse), который имеет одноранговый режим в качестве одной из своих функций. Я попытался отправить NDEF-сообщения из модуля PN532 на смартфон и наоборот, и он отлично работает.

Что я хочу, так это то, что когда модуль PN532 находит смартфон, мое приложение запускается автоматически.

Я знаю, что одно решение использует запись типа MIME.

У меня это в моем манифесте:

 <data android:mimeType="application/vnd.test.com.openapp"/>

На стороне модуля я могу передавать MIME, но я не знаю, в какой форме это MIME должно быть. Я пытался передать строки, но ничего не происходит.

Итак, как я могу сделать запись типа MIME на моем модуле? Есть ли другой способ запустить мое приложение через одноранговую связь?

Ответ 1

Прежде всего, вам необходимо реализовать одноранговый протокол:

+--------------------------------------+
|   NDEF (NFC Data Exchange Format)    |
+--------------------------------------+
| SNEP (Simple NDEF Exchange Protocol) |
+--------------------------------------+
| LLCP (Logical Link Control Protocol) |
+--------------------------------------+
|               NFCIP-1                |
+--------------------------------------+

У вас уже есть этот запуск и запуск, поскольку вы указываете, что вы "пытались отправить NDEF-сообщения из модуля PN532 на смартфон, и наоборот, и он отлично работает".

Итак, вам нужно будет создать сообщение NDEF с записью типа MIME (или даже лучше, чем запись внешнего типа NFC Forum) в качестве первой записи. Чтобы использовать приложение Android AAR (приложение приложения Android), чтобы связать сообщение NDEF только с вашим приложением (приложение запустилось или, если оно не установлено, откроется страница вашего Play Play Store), вы можете дополнительно добавить AAR в конец вашего сообщения NDEF.

Сообщение NDEF, состоящее только из записи типа MIME:

+------+------+------+------+------+--------------------------+
| MB=1 | ME=1 | CF=0 | SR=1 | IL=0 | TNF=2 (MIME type record) |
+------+------+------+------+------+--------------------------+
| TYPE LENGTH=32 (0x20)                                       |
+-------------------------------------------------------------+
| PAYLOAD LENGTH=5 (0x05)                                     |
+-------------------------------------------------------------+
| TYPE="application/vnd.test.com.openapp"                     |
+-------------------------------------------------------------+
| PAYLOAD="Hello"                                             |
+-------------------------------------------------------------+

В качестве байтового массива это будет выглядеть как

{
    /* Header byte    */ 0xD2,
    /* TYPE LENGTH    */ 0x20,
    /* PAYLOAD LENGTH */ 0x05,
    /* TYPE           */ 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74,
                         0x69, 0x6F, 0x6E, 0x2F, 0x76, 0x6E, 0x64, 0x2E,
                         0x74, 0x65, 0x73, 0x74, 0x2E, 0x63, 0x6F, 0x6D,
                         0x2E, 0x6F, 0x70, 0x65, 0x6E, 0x61, 0x70, 0x70,
    /* PAYLOAD        */ 0x48, 0x65, 0x6C, 0x6C, 0x6F
}

Затем вы можете зарегистрировать свое приложение для запуска с использованием фильтра намерений, подобного этому в вашем манифесте:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="application/vnd.test.com.openapp" />
</intent-filter>    

Для варианта AAR вы должны добавить AAR для своего приложения к этому сообщению. Например, если ваше приложение имеет имя пакета "com.your.app.package":

+------+------+------+------+------+--------------------------+
| MB=1 | ME=0 | CF=0 | SR=1 | IL=0 | TNF=2 (MIME type record) |
+------+------+------+------+------+--------------------------+
| TYPE LENGTH=32 (0x20)                                       |
+-------------------------------------------------------------+
| PAYLOAD LENGTH=5 (0x05)                                     |
+-------------------------------------------------------------+
| TYPE="application/vnd.test.com.openapp"                     |
+-------------------------------------------------------------+
| PAYLOAD="Hello"                                             |
+-------------------------------------------------------------+
+------+------+------+------+------+--------------------------+
| MB=0 | ME=1 | CF=0 | SR=1 | IL=0 | TNF=4 (External type)    |
+------+------+------+------+------+--------------------------+
| TYPE LENGTH=15 (0x0F)                                       |
+-------------------------------------------------------------+
| PAYLOAD LENGTH=20 (0x14)                                    |
+-------------------------------------------------------------+
| TYPE="android.com:pkg"                                      |
+-------------------------------------------------------------+
| PAYLOAD="com.your.app.package"                              |
+-------------------------------------------------------------+

В качестве байтового массива это будет выглядеть как

{
    /* MIME type record */
    /* Header byte    */ 0x92,
    /* TYPE LENGTH    */ 0x20,
    /* PAYLOAD LENGTH */ 0x05,
    /* TYPE           */ 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74,
                         0x69, 0x6F, 0x6E, 0x2F, 0x76, 0x6E, 0x64, 0x2E,
                         0x74, 0x65, 0x73, 0x74, 0x2E, 0x63, 0x6F, 0x6D,
                         0x2E, 0x6F, 0x70, 0x65, 0x6E, 0x61, 0x70, 0x70,
    /* PAYLOAD        */ 0x48, 0x65, 0x6C, 0x6C, 0x6F,
    /* Android Application Record */
    /* Header byte    */ 0x54,
    /* TYPE LENGTH    */ 0x0F,
    /* PAYLOAD LENGTH */ 0x14,
    /* TYPE           */ 0x61, 0x6E, 0x64, 0x72, 0x6F, 0x69, 0x64, 0x2E,
                         0x63, 0x6F, 0x6D, 0x3A, 0x70, 0x6B, 0x67
    /* PAYLOAD        */ 0x63, 0x6F, 0x6D, 0x2E, 0x79, 0x6F, 0x75, 0x72,
                         0x2E, 0x61, 0x70, 0x70, 0x2E, 0x70, 0x61, 0x63,
                         0x6B, 0x61, 0x67, 0x65
}