Handlingsmeldingsformat - Action Message Format
Internett media type |
applikasjon / oktett-strøm
|
---|---|
Utviklet av | Adobe Systems |
Type format | Datautveksling format |
Beholder for | Strukturerte data |
Action Message Format ( AMF ) er et binært format som brukes til å serieisere objektgrafer som ActionScript- objekter og XML, eller sende meldinger mellom en Adobe Flash- klient og en ekstern tjeneste, vanligvis en Flash Media Server eller tredjepartsalternativer. Actionscript 3-språket gir klasser for koding og dekoding fra AMF-format.
Formatet brukes ofte i forbindelse med Adobes RTMP for å etablere tilkoblinger og kontrollkommandoer for levering av streamingmedier. I dette tilfellet er AMF-dataene innkapslet i en del som har en overskrift som definerer ting som meldingslengde og type (enten det er en "ping", "kommando" eller mediedata).
Formatanalyse
AMF ble introdusert med Flash Player 6, og denne versjonen blir referert til som AMF0. Det var uendret til utgivelsen av Flash Player 9 og ActionScript 3.0, da nye datatyper og språkfunksjoner ba om en oppdatering, kalt AMF3. Flash Player 10 la til datatyper for vektor og ordbok dokumentert i en revidert spesifikasjon fra januar 2013.
Adobe Systems publiserte AMFs binære dataprotokollspesifikasjon i desember 2007 og kunngjorde at de vil støtte utviklerfellesskapet for å gjøre denne protokollen tilgjengelig for alle større serverplattformer.
AMF selvstendig pakke
Følgende amf-pakke er for overføring av meldinger utenfor definerte Adobe / Macromedia-containere eller -transporter, for eksempel Flash Video eller Real Time Messaging Protocol .
Lengde | Navn | Type | Misligholde |
---|---|---|---|
16 bits | versjon | uimsbf | 0 eller 3 |
16 bits | toppteksttelling | uimsbf | 0 |
header-count * 56 + bits | header-type-struktur | binær | fri form |
16 bits | antall meldinger | uimsbf | 1 |
antall meldinger * 64 + bits | meldingstype-struktur | binær | fri form |
Lengde | Navn | Type | Misligholde |
---|---|---|---|
16 bits | topptekst-navn-lengde | uimsbf | 0 |
header-name-length * 8 bits | header-name-string | UTF-8 | tømme |
8 biter | må forstå | uimsbf | 0 |
32 biter | topplengde | simsbf | variabel |
topplengde * 8 bits | AMF0 eller AMF3 | binær | fri form |
Lengde | Navn | Type | Misligholde |
---|---|---|---|
16 bits | mål-uri-lengde | uimsbf | variabel |
mål-uri-lengde * 8 bits | mål-uri-streng | UTF-8 | variabel |
16 bits | respons-uri-lengde | uimsbf | 2 |
respons-uri-lengde * 8 bits | respons-uri-streng | UTF-8 | "/1" |
32 biter | meldingslengde | simsbf | variabel |
meldingslengde * 8 bits | AMF0 eller AMF3 | binær | fri form |
Hvis enten topplengden eller meldingslengden er ukjent, er de satt til -1 eller 0xFFFFFFFF
uimsbf: usignert heltall, viktigste bit først
simsbf: signert heltall, den viktigste biten først
AMF0
Formatet spesifiserer de forskjellige datatypene som kan brukes til å kode data. Adobe sier at AMF hovedsakelig brukes til å representere objektgrafer som inkluderer navngitte egenskaper i form av nøkkelverdipar, der nøklene er kodet som strenger og verdiene kan være av hvilken som helst datatype, for eksempel strenger eller tall, samt arrays og andre gjenstander. XML støttes som en innfødt type. Hver type er betegnet med en enkelt byte foran de faktiske dataene. Verdiene for den byten er som nedenfor (for AMF0):
- Antall - 0x00 (kodet som IEEE 64-biters flytende punktnummer med dobbel presisjon )
- Boolsk - 0x01 (Kodet som en enkelt byte med verdien 0x00 eller 0x01)
- Streng - 0x02 (16-biters heltallstrenglengde med UTF-8-streng)
- Objekt - 0x03 (sett med nøkkel / verdipar)
- Null - 0x05
- ECMA Array - 0x08 (32-bits oppføringstall)
- Objektavslutning - 0x09 (innledes med en tom 16-biters strenglengde)
- Strict Array - 0x0a (32-bit antall oppføringer)
- Dato - 0x0b (Kodet som IEEE 64-bits flytende punktnummer med dobbelt presisjon med 16-biters heltids tidssone forskyvning)
- Lang streng - 0x0c (32-biters heltallstrenglengde med UTF-8-streng)
- XML-dokument - 0x0f (32-biters heltallstrengelengde med UTF-8-streng)
- Typed Object - 0x10 (16-biters heltallnavnlengde med UTF-8-navn, etterfulgt av oppføringer)
- Bytt til AMF3 - 0x11
AMF-objekter begynner med a (0x03) etterfulgt av et sett med nøkkelverdipar og slutter med a (0x09) som verdi (innledes med 0x00 0x00 som tom nøkkeloppføring). Nøklene er kodet som strenger med (0x02) 'type-definition' byte som er underforstått (ikke inkludert i meldingen). Verdier kan være av hvilken som helst type inkludert andre objekter, og hele objektgrafer kan serieiseres på denne måten. Begge objektnøklene og strengene innledes med to byte som angir lengden i antall byte. Dette betyr at strenger innledes med totalt tre byte som inkluderer 0x02-typen byte. Nulltyper inneholder bare deres typedefinisjon (0x05). Tallene er kodet som flytende punkt med dobbelt presisjon og består av åtte byte.
Som et eksempel, når du koder objektet nedenfor i actionscript 3-kode.
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);
Dataene i ByteArray er:
Hex-kode | 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 |
. . . navn . . . M ikke . . alder . @> . . . . . . . . alias . . . M ikke . . . |
Merk: objektegenskapene kan sorteres i en annen rekkefølge enn den de er plassert i handling. For legging / markering, se legenden nedenfor.
Koden ovenfor fungerer bare for innebygde klasser som Object
. For å serieisere og deserialisere egendefinerte klasser, må brukeren erklære dem ved hjelp av registerClassAlias-kommandoen, ellers vil en feil bli kastet av spilleren.
// for a hypothetical class Person
registerClassAlias("personTypeAlias", Person);
Selv om AMF strengt tatt bare er et datakodingsformat, blir det vanligvis funnet innkapslet i en RTMP- melding eller Flex RPC-samtale. Et eksempel på førstnevnte finner du nedenfor (det er "_result" -meldingen som returneres som svar på "connect" -kommandoen sendt fra flash-klienten):
Hex-kode | 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 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 03 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 | . . . . . . . . . . . . . . . _ resultat . ? . . . . . . . . . . fms V er. . . FMS / 3, 5, 5, 2 0 0 4. . evner. @? . . . . . . . . modus. ? . . . . . . . . . . . . . nivå. . . status. . kode. . . N et C onnection. Koble . Suksess . . beskrivelse. . . C onnection lyktes. . . data. . . . . . . versjon. . . 3, 5, 5, 2 0 0 4. . . . . klient-ID . A. . x. . . . . . objekt E koding. @. . . . . . . . . . |
legende: objekt start / sluttobjektnøkler objekt verdier ecma_array
AMF-meldingen starter med a 0x03
som betegner en RTMP-pakke med overskriftstype 0 , så det forventes at 12 byte følger. Det er av meldingstype 0x14, som betegner en kommando i form av en streng med verdien "_result" og to serieobjekter som argumenter. Meldingen kan dekodes som følger:
(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 }
Her kan man se en matrise (i turkis) som en verdi av 'data' -tasten som har ett medlem. Vi kan se at objektkodingsverdien er 3. Dette betyr at påfølgende meldinger vil bli sendt med 0x11-meldingstypen, noe som vil innebære en AMF3-koding.
AMF3
Den siste versjonen av protokollen spesifiserer viktige endringer som gir mulighet for et mer komprimert format. Datamarkørene er som følger:
- Udefinert - 0x00
- Null - 0x01
- Boolsk falsk - 0x02
- Boolsk sann - 0x03
- Heltall - 0x04 (utvidbart 8+ bit heltall)
- Dobbelt - 0x05 (kodet som IEEE 64-biters flytende punktnummer med dobbel presisjon )
- Streng - 0x06 (utvidbar 8+ bit heltall strenglengde med en UTF-8 streng)
- XMLDocument - 0x07 (utvidbar 8+ bit heltall strenglengde og / eller flagg med en UTF-8 streng)
- Dato - 0x08 (utvidbare 8+ biters heltallflagg med en IEEE 64-bit dobbel presisjon flytende punkt UTC-forskyvningstid)
- Array - 0x09 (utvidbart antall 8+ biters heltall og / eller flagg med valgbare utvidbare 8+ biters heltallnavnlengder med UTF-8-navn)
- Objekt - 0x0A (utvidbart antall 8+ biters heltall og / eller flagg med valgbare utvidbare 8+ biters heltallnavnlengder med UTF-8-navn)
- XML - 0x0B (utvidbare 8+ biters heltallflagg)
- ByteArray - 0x0C (utvidbare 8+ bit heltal flagg med valgfri 8 bit byte lengde)
De første 4 typene blir ikke fulgt av noen data (booleans har to typer i AMF3).
Ytterligere markører som brukes av Flash Player 10 (formatet er fortsatt referert til som AMF3) er som følger:
- VectorInt - 0x0D
- VectorUInt - 0x0E
- VectorDouble - 0x0F
- VectorObject - 0x10
- Ordbok - 0x11
AMF3 tar sikte på mer komprimering, og en av måtene det oppnår dette er å unngå streng duplisering ved å lagre dem i en matrise som alle nye strenger blir sjekket mot. Byten som følger strengmarkøren, betegner ikke lenger ren lengde, men det er en kompleks byte der den minst signifikante biten indikerte om strengen er 'inline' (1), dvs. ikke i matrisen eller 'referanse' (0), i hvilket tilfelle indeksen til matrisen lagres. Tabellen inneholder både nøkler og verdier.
I eldre versjoner av Flash player eksisterte det en nummertype kalt 'Number', som var en 64-biters dobbel presisjonskoding. I de siste utgivelsene er det en int og en uint som er inkludert i AMF3 som separate typer. Antalltyper er identiske med AMF0-koding mens Heltals har variabel lengde fra 1 til 4 byte der den mest betydningsfulle biten til 1-3 indikerer at de blir fulgt av en annen byte.
Støtte for AMF
De forskjellige AMF-protokollene støttes av mange språk og teknologier på serversiden, i form av biblioteker og tjenester som må installeres og integreres av programutvikleren.
Plattformer:
- ColdFusion -
- Haxe - Haxe Remoting hxformat
- Java - Adobe BlazeDS , Adobe LiveCycle Data Services (tidligere kjent som Flex Data Services) , Exadel Flamingo , RED 5 , Cinnamon , OpenAMF , Pimento , Granite , WebORB for Java
- .NET - WebORB for .NET , FluorineFx (LGPL), DotAmf (MS-PL), AMF.NET (utvikling stoppet)
- PHP - AmfPHP , SabreAMF , WebORB for PHP , Zend_Amf , php-amf3 utvidelse , Baguette AMF (php utvidelse)
- Python - fast
- Perl - AMF :: Perl , kan lagres :: AMF , AMF :: Tilkobling
- Curl - Curl Data Services
- Ruby - RubyAMF , WebORB for Rails , Rocket AMF
- Erlang - Erlang-AMF
- ActionScript - Flash Player ByteArray (innebygd), CourseVector Library
- JavaScript - JSAMF CourseVector Library CourseVector .minerva
- Lua - lua-amf3
- ABAP - ABAP AMF (tidlig stadium)
- Delphi - kbmMW (omfattende AMF0 / AMF3-støtte)
- iOS - CocoaAMF
- PowerShell - Powershell AMF
Rammeverk:
- Apache Royale-kommunikasjon med AMF og RemoteObject - Apache Royale
- Ruby on Rails - RubyAMF
- Zend Framework - Zend_AMF
- OSGi Framework - AMF3 for OSGi
- Django - Django AMF
- CakePHP - CakeAMFPHP
- Grails (rammeverk) - BlazeDS
- Trac - TracRpcProtocolsPlugin . Versjon 1.1.0 (eller høyere) av XmlRpcPlugin kreves.
- Web2py - PyAMF
Se også
Referanser
- ^ "Action Message Format - AMF 3" (PDF) . Januar 2013 . Hentet 2021-05-01 .
- ^ "Action Message Format - AMF 0" (PDF) . 2007 . Hentet 2021-05-01 .
- ^ "Adobe åpner AMF, frigjør kilde for fjernstyring av rammeverk som brukes i rike nettapper" . Ars Technica . Hentet 2017-12-31 .
- ^ Funksjoner | Adobe ColdFusion 9 Standard
GB