Formát zprávy o akci - Action Message Format - Wikipedia
![]() | tento článek potřebuje další citace pro ověření.Prosinec 2017) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Typ internetového média | aplikace / oktetový proud |
---|---|
Vyvinul | Adobe Systems |
Typ formátu | Výměna dat formát |
Kontejner pro | Strukturovaná data |
Formát zprávy o akci (AMF) je binární formát zvyklý na serializovat objektové grafy jako např ActionScript objekty a XML, nebo posílat zprávy mezi Adobe Flash klient a vzdálená služba, obvykle a Flash Media Server nebo alternativy třetích stran. Jazyk Actioncript 3 poskytuje třídy pro kódování a dekódování z formátu AMF.
Formát se často používá ve spojení s Adobe RTMP navázat spojení a řídicí příkazy pro doručování streamovaných médií. V tomto případě jsou data AMF zapouzdřena v a kus který má záhlaví, které definuje věci, jako je délka a typ zprávy (ať už se jedná o „ping“, „příkaz“ nebo mediální data).
Analýza formátu
AMF byl představen s Flash Player 6 a tato verze se označuje jako AMF0. To se nezměnilo až do vydání Flash Player 9 a ActionScript 3.0, když nové datové typy a jazykové funkce vyvolaly aktualizaci s názvem AMF3.[1] Flash Player 10 přidal datové typy vektorů a slovníků zdokumentované v revidované specifikaci z ledna 2013.
Adobe Systems zveřejnil specifikaci protokolu binárních dat AMF v prosinci 2007[2][3] a oznámila, že bude podporovat komunitu vývojářů, aby tento protokol zpřístupnil pro všechny hlavní serverové platformy.
Samostatný paket AMF
Následující paket amf je pro přenos zpráv mimo definované kontejnery Adobe / Macromedia nebo transporty jako Flash video nebo Protokol pro zasílání zpráv v reálném čase.
Délka | název | Typ | Výchozí |
---|---|---|---|
16 bitů | verze | uimsbf | 0 nebo 3 |
16 bitů | počet záhlaví | uimsbf | 0 |
počet záhlaví * 56 + bitů | struktura typu záhlaví | binární | volná forma |
16 bitů | počet zpráv | uimsbf | 1 |
počet zpráv * 64 + bitů | struktura typu zprávy | binární | volná forma |
Délka | název | Typ | Výchozí |
---|---|---|---|
16 bitů | název-záhlaví-délka | uimsbf | 0 |
název-záhlaví-délka * 8 bitů | řetězec-název-záhlaví | UTF-8 | prázdný |
8 bitů | musíte pochopit | uimsbf | 0 |
32 bitů | délka záhlaví | simsbf | proměnná |
délka záhlaví * 8 bitů | AMF0 nebo AMF3 | binární | volná forma |
Délka | název | Typ | Výchozí |
---|---|---|---|
16 bitů | target-uri-length | uimsbf | proměnná |
target-uri-length * 8 bitů | řetězec cílového uri | UTF-8 | proměnná |
16 bitů | délka odpovědi-uri | uimsbf | 2 |
délka odpovědi-uri * 8 bitů | řetězec-uri odpovědi | UTF-8 | "/1" |
32 bitů | délka zprávy | simsbf | proměnná |
délka zprávy * 8 bitů | AMF0 nebo AMF3 | binární | volná forma |
Pokud není známa délka záhlaví ani délka zprávy, pak jsou nastaveny na -1 nebo 0xFFFFFFFF
uimsbf: celé číslo bez znaménka, nejdříve nejvýznamnější bit
simsbf: celé číslo se znaménkem, nejdříve nejvýznamnější bit
AMF0
Formát určuje různé datové typy, které lze použít ke kódování dat. Adobe uvádí, že AMF se používá hlavně k reprezentaci grafů objektů, které obsahují pojmenované vlastnosti ve formě párů klíč – hodnota, kde jsou klíče kódovány jako řetězce a hodnoty mohou být jakéhokoli datového typu, jako jsou řetězce nebo čísla, stejně jako pole a jiné předměty. XML je podporován jako nativní typ. Každý typ je označen jedním bajtem předcházejícím skutečným datům. Hodnoty tohoto bajtu jsou uvedeny níže (pro AMF0):
- Number - 0x00 (Encoded as IEEE 64-bit dvojitá přesnost s plovoucí desetinnou čárkou číslo)
- Boolean - 0x01 (zakódováno jako jeden bajt hodnoty 0x00 nebo 0x01)
- Řetězec - 0x02 (délka 16bitového celého čísla s řetězcem UTF-8)
- Objekt - 0x03 (sada párů klíč / hodnota)
- Null - 0x05
- Pole ECMA - 0x08 (počet vstupů 32 bitů)
- Konec objektu - 0x09 (předchází mu prázdná 16bitová délka řetězce)
- Přísné pole - 0x0a (počet vstupů 32 bitů)
- Datum - 0x0b (kódováno jako 64bitový IEEE dvojitá přesnost s plovoucí desetinnou čárkou číslo s posunem 16bitového celého časového pásma)
- Long String - 0x0c (délka 32bitového celého čísla s řetězcem UTF-8)
- Dokument XML - 0x0f (délka 32bitového celého čísla s řetězcem UTF-8)
- Typovaný objekt - 0x10 (16bitová délka celého čísla s názvem UTF-8, následovaná položkami)
- Přepnout na AMF3 - 0x11
Objekty AMF začínají znakem (0x03), za nímž následuje sada párů klíč – hodnota a končí hodnotou (0x09) jako hodnotou (předchází jí 0x00 0x00 jako prázdná položka klíče). Klíče jsou kódovány jako řetězce s implicitním bajtem (0x02) typu definice (není zahrnut ve zprávě). Hodnoty mohou být jakéhokoli typu, včetně dalších objektů, a tímto způsobem lze serializovat celé objektové grafy. Klíčům objektů i řetězcům předcházejí dva bajty označující jejich délku v počtu bajtů. To znamená, že řetězcům předchází celkem tři bajty, což zahrnuje bajt typu 0x02. Typy Null obsahují pouze jejich definici typu (0x05). Čísla jsou kódována jako dvojitá přesnost s plovoucí desetinnou čárkou a jsou složeny z osmi bajtů.
Jako příklad lze uvést při kódování níže uvedeného objektu v kódu ActionScript 3.
var osoba:Objekt = {název:'Mike', stáří:'30', alias:'Mike'};var proud:ByteArray = Nový ByteArray();proud.kódování objektu = ObjectEncoding.AMF0; // ByteArray výchozí AMF3proud.writeObject(osoba);
Data uchovávaná v ByteArray jsou:
Hex kód | 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 | . . . název . . . Mike . . a g e . @ > . . . . . . . . a l i a s . . . Mike . . . |
Poznámka: Vlastnosti objektu lze řadit v jiném pořadí, než ve kterém jsou umístěny v ActionScriptu. Barvení / označení najdete v legendě níže.
Výše uvedený kód bude fungovat pouze pro vestavěné třídy jako Objekt
. Chcete-li serializovat a deserializovat vlastní třídy, musí je uživatel deklarovat pomocí příkazu registerClassAlias, jinak přehrávač vyvolá chybu.
// pro hypotetickou osobu třídyregisterClassAlias(„personTypeAlias“, Osoba);
Ačkoli, přísně vzato, AMF je pouze formát kódování dat, obvykle se nachází zapouzdřený v a RTMP zprávy nebo volání Flex RPC. Příklad prvního naleznete níže (jedná se o zprávu „_result“ vrácenou v reakci na příkaz „connect“ odeslaný z klienta Flash):
Hex kód | 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 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 | . . . . . . . . . . . . . . . _ výsledek . ? . . . . . . . . . . f m s V e r. . . F M S / 3, 5, 5, 2 0 0 4. . c a p a b i l i t i e s. @? . . . . . . . . m o d e. ? . . . . . . . . . . . . . úroveň . . . s t a t u s. . kód . . . N e t n e n e c t i o n. K o n e c t. S u c c e s s. . d e s c r i p t i o n. . . K o n e k c e e d e d. . . d a t a. . . . . . . v e r s i o n. . . 3, 5, 5, 2 0 0 4. . . . . c l i e n t I d. A. . X . . . . . . o b j e c t E n c o d i n g. @. . . . . . . . . . |
legenda: začátek / konec objektu klíče objektu hodnoty objektu ecma_array
Zpráva AMF začíná písmenem a 0x03
který označuje RTMP paket s Typ záhlaví 0, takže se očekává, že bude následovat 12 bajtů. Jedná se o typ zprávy 0x14, který označuje příkaz ve formě řetězce hodnoty „_result“ a dvou serializovaných objektů jako argumenty. Zprávu lze dekódovat následovně:
(příkaz) "_výsledek"(transakce id) 1(hodnota)[1] { fmsVer: „FMS / 3,5,5,2004“ schopnosti: 31.0 režimu: 1.0 },[2] { úroveň: "postavení", kód: „NetConnection.Connect.Success“, popis: „Připojení bylo úspěšné.“, data: (pole) { verze: "3,5,5,2004" }, clientId: 1584259571.0, kódování objektu: 3.0 }
Zde lze vidět pole (v tyrkysové barvě) jako hodnotu klíče „data“, který má jednoho člena. Vidíme hodnotu objectEncoding na 3. To znamená, že následující zprávy budou odeslány s typem zprávy 0x11, což bude znamenat kódování AMF3.
AMF3
Nejnovější verze protokolu určuje významné změny, které umožňují komprimovanější formát. Datové značky jsou následující:
- Nedefinováno - 0x00
- Null - 0x01
- Boolean False - 0x02
- Boolean True - 0x03
- Celé číslo - 0x04 (rozšiřitelné 8+ bitové celé číslo)
- Double - 0x05 (kódováno jako IEEE 64-bit dvojitá přesnost s plovoucí desetinnou čárkou číslo)
- Řetězec - 0x06 (rozšiřitelná 8+ bitová celá délka řetězce s řetězcem UTF-8)
- XMLDocument - 0x07 (rozšiřitelná 8+ bitová celá délka řetězce a / nebo příznaky s řetězcem UTF-8)
- Datum - 0x08 (rozšiřitelné 8+ bitové celočíselné příznaky s 64bitovým IEEE dvojitá přesnost s plovoucí desetinnou čárkou Čas offsetu UTC)
- Pole - 0x09 (počet rozšiřitelných 8+ bitových celočíselných vstupů a / nebo příznaků s volitelnými rozšiřitelnými 8+ bitovými délkami celých čísel s názvy UTF-8)
- Objekt - 0x0A (rozšiřitelný 8+ bitový celočíselný počet vstupů a / nebo příznaky s volitelnými rozšiřitelnými 8+ bitovými délkami celočíselných jmen se jmény UTF-8)
- XML - 0x0B (rozšiřitelné 8+ bitové celočíselné příznaky)
- ByteArray - 0x0C (rozšiřitelné 8+ bitové celočíselné příznaky s volitelnou 8bitovou délkou bajtu)
První 4 typy nejsou následovány žádnými daty (Booleans mají dva typy v AMF3).
Další značky používané aplikací Flash Player 10 (formát se stále označuje jako AMF3) jsou následující:
- VectorInt - 0x0D
- VectorUInt - 0x0E
- VectorDouble - 0x0F
- VectorObject - 0x10
- Slovník - 0x11
AMF3 si klade za cíl větší kompresi a jedním ze způsobů, jak toho dosáhnout, je vyhnout se duplikaci řetězců jejich uložením do pole, proti kterému jsou zkontrolovány všechny nové řetězce. Bajt následující po značce řetězce již neoznačuje čistou délku, ale je to složitý bajt, kde nejméně významný bit indikoval, zda je řetězec „inline“ (1), tj. Není v poli nebo „reference“ (0), v takovém případě index pole je uložen. Tabulka obsahuje klíče i hodnoty.
Ve starších verzích přehrávače Flash existoval jeden typ čísla s názvem „Number“, což bylo 64bitové kódování s dvojitou přesností. V nejnovějších verzích je int a uint, které jsou zahrnuty v AMF3 jako samostatné typy. Typy čísel jsou identické s kódováním AMF0, zatímco celá čísla mají proměnnou délku od 1 do 4 bajtů, kde nejvýznamnější bit bajtů 1-3 naznačuje, že za nimi následuje další bajt.
Podpora AMF
Různé protokoly AMF jsou podporovány mnoha jazyky a technologiemi na straně serveru v podobě knihoven a služeb, které musí vývojář aplikace nainstalovat a integrovat.
Platformy:
- Studená fúze -[4]
- Haxe - Vzdálená komunikace Haxe hxformát
- Jáva - Adobe BlazeDS, Adobe LiveCycle Data Services (dříve známá jako Flex Data Services), Exadel Flamingo, ČERVENÁ 5, Skořice, OpenAMF, Jamajský pepř, Žula, WebORB pro Javu
- .SÍŤ - WebORB pro .NET, FluorineFx (LGPL), DotAmf (MS-PL), AMF.NET (vývoj zastaven)
- PHP - AmfPHP, SabreAMF, WebORB pro PHP, Zend_Amf, rozšíření php-amf3, Bageta AMF (rozšíření php)
- Krajta - rychle
- Perl - AMF :: Perl, Skladovatelné :: AMF, AMF :: Připojení
- Kučera - Curl Data Services
- Rubín - RubyAMF, WebORB pro Rails, Raketa AMF
- Erlang - Erlang-AMF
- ActionScript - Flash Player ByteArray (vestavěný), Knihovna CourseVector
- JavaScript - JSAMF Knihovna CourseVector CourseVector .minerva
- Lua - lua-amf3
- ABAP - ABAP AMF (počáteční fáze)
- Delphi - kbmMW (rozsáhlá podpora AMF0 / AMF3)
- iOS - CocoaAMF
- Powershell - Powershell AMF
Rámce:
- Komunikace Apache Royale s AMF a RemoteObject - Apache Royale
- Ruby on Rails - RubyAMF
- Zend Framework - Zend_AMF
- OSGi Framework - AMF3 pro OSGi
- Django - Django AMF
- CakePHP - CakeAMFPHP
- Grály (rámec) - BlazeDS
- Trac - TracRpcProtocolsPlugin. Verze 1.1.0 (nebo vyšší) z XmlRpcPlugin je požadováno.
- Web2py - PyAMF
Viz také
Reference
- ^ „Formát zprávy akce - AMF 3“ (PDF). Leden 2013. Archivovány od originál (PDF) dne 31. 12. 2017. Citováno 2017-12-31.
- ^ „Formát zprávy akce - AMF 0“ (PDF). 2007. Archivovány od originál (PDF) dne 31. 12. 2017. Citováno 2017-12-31.
- ^ „Adobe otevírá AMF a osvobozuje zdroj pro vzdálený rámec používaný v bohatých webových aplikacích“. Ars Technica. Citováno 2017-12-31.
- ^ Funkce | Adobe ColdFusion 9 Standard