Formato del messaggio di azione - Action Message Format
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 .
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 |
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 |
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:
- ColdFusion -
- Haxe - Haxe Remoting hxformat
- Java - Adobe BlazeDS , Adobe LiveCycle Data Services (precedentemente noto come Flex Data Services) , Exadel Flamingo , RED 5 , Cinnamon , OpenAMF , Pimento , Granite , WebORB per Java
- NET - WebORB per NET , FluorineFX (LGPL), DotAmf (MS-PL), AMF.NET (sviluppo arrestato)
- PHP - AmfPHP , SabreAMF , WebORB per PHP , Zend_Amf , estensione php-amf3 , Baguette AMF (estensione php)
- Python - amfast
- Perl - AMF :: Perl , Storable :: AMF , AMF :: Connection
- Curl - Servizi dati Curl
- Ruby - RubyAMF , WebORB for Rails , Rocket AMF
- Erlang - Erlang-AMF
- ActionScript : Flash Player ByteArray (integrato), CourseVector Library
- JavaScript - JSAMF CourseVector Library CourseVector .minerva
- Lua - lua-amf3
- ABAP - ABAP AMF (fase iniziale)
- Delphi - kbmMW (ampio supporto AMF0 / AMF3)
- iOS - CocoaAMF
- PowerShell - Powershell AMF
Quadri:
- Comunicazione di Apache Royale con AMF e RemoteObject - Apache Royale
- Ruby on Rails - RubyAMF
- Zend Framework - Zend_AMF
- OSGi Framework - AMF3 per OSGi
- Django - Django AMF
- CakePHP - CakeAMFPHP
- Grails (struttura) - BlazeDS
- Trac - TracRpcProtocolsPlugin . È richiesta la versione 1.1.0 (o successiva) di XmlRpcPlugin .
- Web2py - PyAMF
Guarda anche
Riferimenti
- ^ "Formato messaggio di azione - AMF 3" (PDF) . Gennaio 2013 . Estratto 2021/05/01 .
- ^ "Formato messaggio di azione - AMF 0" (PDF) . 2007 . Estratto 2021/05/01 .
- ^ "Adobe apre AMF, libera la sorgente per il framework di remoting utilizzato nelle ricche app web" . Ars Technica . Estratto 2017/12/31 .
- ^ Caratteristiche | Adobe ColdFusion 9 Standard
GB