2015-06-02 8 views
10

Sto lavorando a un progetto, dove sto utilizzando uno smartphone Android e un chip USB PN532 (elechouse) che ha una modalità peer to peer come una delle sue caratteristiche. Ho provato a inviare messaggi NDEF dal modulo PN532 allo smartphone e viceversa e funziona perfettamente.Android Beam: lanciare un'applicazione con record di tipo MIME

Quello che voglio è che quando il modulo PN532 trova lo smartphone, la mia applicazione viene avviata automaticamente.

So che una soluzione utilizza un record di tipo MIME.

ho questo nel mio manifesto:

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

sul lato del modulo che posso trasmettere MIME, ma non so in quale forma questo MIME deve essere. Ho provato a trasmettere stringhe ma non succede nulla.

Quindi, come posso creare un record di tipo MIME sul mio modulo? C'è un altro modo per avviare la mia app attraverso la comunicazione peer-to-peer?

risposta

8

Prima di tutto, è necessario implementare il protocollo stack di peer-to-peer:

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

È già sembrano avere questo installato e funzionante, come si indica che si "tentato di inviare messaggi NDEF dal modulo PN532 allo smartphone e viceversa e funziona benissimo. "

Così, la prossima si avrebbe bisogno di creare un messaggio NDEF con un record di tipo MIME (o meglio ancora un record NFC Forum External) come suo prima disco. Per utilizzare la funzione Android AAR (Android Application Record) per associare il messaggio NDEF a solo l'app (l'app viene avviata o, se non installata, la pagina Play Store della tua app è aperta), puoi aggiungere anche una RAA a la fine del tuo messaggio NDEF.

messaggio Un NDEF costituita da solo un record tipo 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"            | 
+-------------------------------------------------------------+ 

Come un array di byte questo sarebbe simile

{ 
    /* 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 
} 

È quindi possibile registrare l'applicazione per essere lanciato utilizzando un filtro intento come questo nel file manifest:

<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>  

Per la variante AAR, è necessario aggiungi un AAR per la tua app a quel messaggio. Per esempio, se la vostra applicazione ha il nome del pacchetto "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"        | 
+-------------------------------------------------------------+ 

Come un array di byte questo sarebbe simile

{ 
    /* 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 
}