Formato del messaggio di azione - Action Message Format

Formato del messaggio di azione (AMF)
Tipo di supporto Internet
application / octet-stream
Sviluppato da Adobe Systems
Tipo di formato Formato di scambio dati
Contenitore per Dati strutturati

Action Message Format ( AMF ) è un formato binario utilizzato per serializzare oggetti grafici come oggetti ActionScript e XML o per inviare messaggi tra un client Adobe Flash e un servizio remoto, solitamente un Flash Media Server o alternative di terze parti. Il linguaggio Actionscript 3 fornisce classi per la codifica e la decodifica dal formato AMF.

Il formato viene spesso utilizzato insieme all'RTMP di Adobe per stabilire connessioni e comandi di controllo per la distribuzione di contenuti multimediali in streaming. In questo caso, i dati AMF sono incapsulati in un blocco che ha un'intestazione che definisce cose come la lunghezza e il tipo di messaggio (se si tratta di un "ping", "comando" o dati multimediali).

Analisi del formato

AMF è stato introdotto con Flash Player 6 e questa versione è denominata AMF0. Rimase invariato fino al rilascio di Flash Player 9 e ActionScript 3.0, quando nuovi tipi di dati e funzioni del linguaggio richiedevano un aggiornamento, chiamato AMF3. Flash Player 10 ha aggiunto i tipi di dati vettoriali e di dizionario documentati in una specifica rivista del gennaio 2013.

Adobe Systems ha pubblicato la specifica del protocollo di dati binari AMF nel dicembre 2007 e ha annunciato che supporterà la comunità degli sviluppatori per rendere questo protocollo disponibile per tutte le principali piattaforme server.

Pacchetto autonomo AMF

Il seguente pacchetto amf è per la trasmissione di messaggi al di fuori di contenitori o trasporti Adobe / Macromedia definiti come Flash Video o Real Time Messaging Protocol .

amf-packet-struttura
Lunghezza Nome genere Predefinito
16 bit versione uimsbf 0 o 3
16 bit conteggio delle intestazioni uimsbf 0
conteggio intestazioni * 56 + bit struttura del tipo di intestazione binario forma libera
16 bit conteggio messaggi uimsbf 1
conteggio messaggi * 64 + bit struttura del tipo di messaggio binario forma libera
struttura del tipo di intestazione
Lunghezza Nome genere Predefinito
16 bit intestazione-nome-lunghezza uimsbf 0
lunghezza nome-intestazione * 8 bit intestazione-nome-stringa UTF-8 vuoto
8 bit deve-capire uimsbf 0
32 bit lunghezza dell'intestazione simsbf variabile
lunghezza dell'intestazione * 8 bit AMF0 o AMF3 binario forma libera
struttura del tipo di messaggio
Lunghezza Nome genere Predefinito
16 bit target-uri-length uimsbf variabile
target-uri-length * 8 bit target-uri-string UTF-8 variabile
16 bit risposta-uri-lunghezza uimsbf 2
response-uri-length * 8 bit risposta-uri-stringa UTF-8 "/ 1"
32 bit lunghezza del messaggio simsbf variabile
lunghezza del messaggio * 8 bit AMF0 o AMF3 binario forma libera

Se la lunghezza dell'intestazione o la lunghezza del messaggio sono sconosciute, vengono impostate su -1 o 0xFFFFFFFF

uimsbf: intero senza segno, prima il bit più significativo

simsbf: numero intero con segno, prima il bit più significativo

AMF0

Il formato specifica i vari tipi di dati che possono essere utilizzati per codificare i dati. Adobe afferma che AMF viene utilizzato principalmente per rappresentare grafici di oggetti che includono proprietà denominate sotto forma di coppie chiave-valore, in cui le chiavi sono codificate come stringhe ei valori possono essere di qualsiasi tipo di dati come stringhe o numeri, nonché array e altri oggetti. XML è supportato come tipo nativo. Ogni tipo è indicato da un singolo byte che precede i dati effettivi. I valori di quel byte sono i seguenti (per AMF0):

  • Numero - 0x00 (codificato come numero in virgola mobile a doppia precisione IEEE a 64 bit )
  • Boolean - 0x01 (codificato come un singolo byte di valore 0x00 o 0x01)
  • String - 0x02 (lunghezza stringa intera a 16 bit con stringa UTF-8)
  • Oggetto - 0x03 (set di coppie chiave / valore)
  • Null - 0x05
  • Array ECMA - 0x08 (conteggio voci a 32 bit)
  • Object End - 0x09 (preceduto da una lunghezza di stringa vuota a 16 bit)
  • Strict Array - 0x0a (conteggio voci a 32 bit)
  • Data - 0x0b (codificato come numero in virgola mobile a precisione doppia IEEE a 64 bit con offset di fuso orario intero a 16 bit)
  • Stringa lunga - 0x0c (lunghezza stringa intera a 32 bit con stringa UTF-8)
  • Documento XML - 0x0f (lunghezza stringa intera a 32 bit con stringa UTF-8)
  • Oggetto digitato - 0x10 (lunghezza del nome intero a 16 bit con nome UTF-8, seguito da voci)
  • Passa a AMF3 - 0x11

Gli oggetti AMF iniziano con un (0x03) seguito da un insieme di coppie chiave-valore e terminano con un (0x09) come valore (preceduto da 0x00 0x00 come voce di chiave vuota). Le chiavi sono codificate come stringhe con il byte (0x02) "definizione del tipo" implicito (non incluso nel messaggio). I valori possono essere di qualsiasi tipo, inclusi altri oggetti e interi oggetti grafici possono essere serializzati in questo modo. Sia le chiavi degli oggetti che le stringhe sono precedute da due byte che ne indicano la lunghezza in numero di byte. Ciò significa che le stringhe sono precedute da un totale di tre byte che include il byte di tipo 0x02. I tipi nulli contengono solo la loro definizione del tipo (0x05). I numeri sono codificati come virgola mobile a doppia precisione e sono composti da otto byte.

Ad esempio, quando si codifica l'oggetto di seguito nel codice ActionScript 3.

var person:Object = {name:'Mike', age:'30', alias:'Mike'};
var stream:ByteArray = new ByteArray();
stream.objectEncoding = ObjectEncoding.AMF0; // ByteArray defaults to AMF3
stream.writeObject(person);

I dati contenuti nel ByteArray sono:

Codice esadecimale ASCII
03 00 04 6e 61 6d 65 02 00 04 4d 69 6b 65 00 03 61 67 65 00 40 3e 00 00 00 00 00 00 00 05 61 6c 69 61 73 02 00 04 4d 69 6b 65 00 00 09

. . . nome . . . Mi piace . . età . @> . . . . . . . . alias . . . Mi piace . . .

Nota: le proprietà degli oggetti possono essere ordinate in un ordine diverso da quello in cui sono inserite in actioncript. Per la colorazione / markup, fare riferimento alla legenda di seguito.

Il codice sopra funzionerà solo per classi incorporate come Object . Per serializzare e deserializzare le classi personalizzate, l'utente deve dichiararle utilizzando il comando registerClassAlias ​​altrimenti verrà generato un errore dal giocatore.

// for a hypothetical class Person
registerClassAlias("personTypeAlias", Person);

Sebbene, in senso stretto, AMF sia solo un formato di codifica dei dati, di solito si trova incapsulato in un messaggio RTMP o in una chiamata Flex RPC. Di seguito un esempio del primo (è il messaggio "_result" restituito in risposta al comando "connect" inviato dal client flash):

Codice esadecimale ASCII
03 00 00 00 00 01 05 14 00 00 00 00 02 00 07 5F 72 65 73 75 6C 74 00 3F F0 00 00 00 00 00 00 03 00 06 66 6D 73 56 65 72 02 00 0E 46 4D 53 2F 33 2C 35 2C 35 2C 32 30 30 34 00 0C 63 61 70 61 62 69 6C 69 74 69 65 73 00 40 3F 00 00 00 00 00 00 00 04 6D 6F 64 65 00 3F F0 00 00 00 00 00 00 00 00 00 09 03 00 05 6C 65 76 65 6C 02 00 06 73 74 61 74 75 73 00 04 63 6F 64 65 02 00 1D 4E 65 74 43 6F 6E 6E 65 63 74 69 6F 6E 2E 43 6F 6E 6E 65 63 74 2E 53 75 63 63 65 73 73 00 0B 64 65 73 63 72 69 70 74 69 6F 6E 02 00 15 43 6F 6E 6E 65 63 74 69 6F 6E 20 73 75 63 63 65 65 64 65 64 2E 00 04 64 61 74 61 08 00 00 00 01 00 07 76 65 72 73 69 6F 6E 02 00 0A 33 2C 35 2C 35 2C 32 30 30 34 00 00 09 00 08 63 6C 69 65 6E 74 49 64 00 41 D7 9B 78 7C C0 00 00 00 0E 6F 62 6A 65 63 74 45 6E 63 6F 64 69 6E 67 00 40 08 00 00 00 00 00 00 00 00 09 . . . . . . . . . . . . . . . _ risultato. ? . . . . . . . . . . fms V er. . . FMS / 3, 5, 5, 2 0 0 4. . capacità. @? . . . . . . . . modalità . ? . . . . . . . . . . . . . livello. . . stato. . codice . . . N et C onnection. Collegare . Successo. . descrizione. . . Connessione riuscita. . . dati. . . . . . . versione. . . 3, 5, 5, 2 0 0 4. . . . . Identificativo cliente . A. . X . . . . . . oggetto E ncoding. @. . . . . . . . . .

legenda: oggetto inizio / fine oggetto chiavi valori oggetto ecma_array

Il messaggio AMF inizia con un 0x03 che denota un pacchetto RTMP con tipo di intestazione 0 , quindi dovrebbero seguire 12 byte. È di tipo messaggio 0x14, che denota un comando sotto forma di una stringa di valore "_result" e due oggetti serializzati come argomenti. Il messaggio può essere decodificato come segue:

(command) "_result"
(transaction id) 1
(value)
[1] { fmsVer: "FMS/3,5,5,2004"
        capabilities: 31.0
        mode: 1.0 },
[2] { level: "status",
        code: "NetConnection.Connect.Success",
        description: "Connection succeeded.",
        data: (array) {
               version: "3,5,5,2004" },
        clientId: 1584259571.0,
        objectEncoding: 3.0 }

Qui si può vedere un array (in turchese) come valore della chiave "data" che ha un membro. Possiamo vedere che il valore objectEncoding è 3. Ciò significa che i messaggi successivi verranno inviati con il tipo di messaggio 0x11, che implicherà una codifica AMF3.

AMF3

L'ultima versione del protocollo specifica modifiche significative che consentono un formato più compresso. Gli indicatori di dati sono i seguenti:

  • Non definito - 0x00
  • Null - 0x01
  • Boolean False - 0x02
  • Boolean True - 0x03
  • Intero - 0x04 (numero intero espandibile 8+ bit)
  • Double - 0x05 (codificato come numero a virgola mobile a precisione doppia IEEE a 64 bit )
  • Stringa - 0x06 (lunghezza stringa intera espandibile a 8 bit con una stringa UTF-8)
  • XMLDocument - 0x07 (lunghezza stringa intera 8+ bit espandibile e / o flag con una stringa UTF-8)
  • Data - 0x08 (flag interi espandibili a 8 bit con un tempo di offset UTC a virgola mobile a doppia precisione IEEE a 64 bit )
  • Array - 0x09 (numero di voci di numeri interi espandibili a 8+ bit e / o flag con lunghezze dei nomi di numeri interi espandibili a 8+ bit con nomi UTF-8)
  • Oggetto - 0x0A (numero di voci di numeri interi a 8+ bit espandibili e / o flag con lunghezze di nomi di numeri interi a 8+ bit espandibili con nomi UTF-8)
  • XML - 0x0B (flag interi espandibili a 8 bit)
  • ByteArray - 0x0C (flag di numero intero 8+ bit espandibili con lunghezza byte 8 bit opzionale)

I primi 4 tipi non sono seguiti da alcun dato (i booleani hanno due tipi in AMF3).

I marcatori aggiuntivi utilizzati da Flash Player 10 (il formato è ancora denominato AMF3) sono i seguenti:

  • VectorInt - 0x0D
  • VectorUInt - 0x0E
  • VectorDouble - 0x0F
  • VectorObject - 0x10
  • Dizionario - 0x11

AMF3 mira a una maggiore compressione e uno dei modi in cui ottiene ciò è evitare la duplicazione delle stringhe salvandole in un array rispetto al quale vengono controllate tutte le nuove stringhe. Il byte che segue il marcatore di stringa non indica più la lunghezza pura ma è un byte complesso in cui il bit meno significativo indica se la stringa è 'inline' (1), cioè non nell'array o 'reference' (0), nel qual caso il viene salvato l'indice dell'array. La tabella include chiavi e valori.

Nelle versioni precedenti di Flash player esisteva un tipo di numero chiamato "Numero" che era una codifica a doppia precisione a 64 bit. Nelle ultime versioni sono presenti un int e un uint inclusi in AMF3 come tipi separati. I tipi di numero sono identici alla codifica AMF0 mentre i numeri interi hanno una lunghezza variabile da 1 a 4 byte dove il bit più significativo di byte 1-3 indica che sono seguiti da un altro byte.

Supporto per AMF

I vari protocolli AMF sono supportati da molti linguaggi e tecnologie lato server, sotto forma di librerie e servizi che devono essere installati e integrati dallo sviluppatore dell'applicazione.

Piattaforme:

Quadri:

Guarda anche

Riferimenti

  1. ^ "Formato messaggio di azione - AMF 3" (PDF) . Gennaio 2013 . Estratto 2021/05/01 .
  2. ^ "Formato messaggio di azione - AMF 0" (PDF) . 2007 . Estratto 2021/05/01 .
  3. ^ "Adobe apre AMF, libera la sorgente per il framework di remoting utilizzato nelle ricche app web" . Ars Technica . Estratto 2017/12/31 .
  4. ^ Caratteristiche | Adobe ColdFusion 9 Standard

GB