Formato da mensagem de ação - Action Message Format

Formato de mensagem de ação (AMF)
Tipo de mídia da Internet
aplicação / fluxo de octeto
Desenvolvido por Adobe Systems
Tipo de formato Formato de troca de dados
Recipiente para Dados estruturados

O Action Message Format ( AMF ) é um formato binário usado para serializar gráficos de objetos, como objetos ActionScript e XML, ou enviar mensagens entre um cliente Adobe Flash e um serviço remoto, geralmente um Flash Media Server ou alternativas de terceiros. A linguagem Actionscript 3 fornece classes para codificação e decodificação do formato AMF.

O formato é frequentemente usado em conjunto com o RTMP da Adobe para estabelecer conexões e controlar comandos para a entrega de mídia de streaming. Nesse caso, os dados AMF são encapsulados em um bloco que possui um cabeçalho que define coisas como o comprimento e o tipo da mensagem (seja um "ping", "comando" ou dados de mídia).

Análise de formato

O AMF foi introduzido com o Flash Player 6 e esta versão é conhecida como AMF0. Ele permaneceu inalterado até o lançamento do Flash Player 9 e ActionScript 3.0, quando novos tipos de dados e recursos de linguagem solicitaram uma atualização, chamada AMF3. O Flash Player 10 adicionou tipos de dados vetoriais e de dicionário documentados em uma especificação revisada de janeiro de 2013.

A Adobe Systems publicou a especificação do protocolo de dados binários AMF em dezembro de 2007 e anunciou que apoiará a comunidade de desenvolvedores a disponibilizar este protocolo para todas as principais plataformas de servidor.

Pacote autocontido AMF

O pacote amf a seguir é para transmissão de mensagens fora de contêineres Adobe / Macromedia definidos ou transportes, como Flash Video ou Real Time Messaging Protocol .

amf-packet-structure
Comprimento Nome Modelo Padrão
16 bits versão uimsbf 0 ou 3
16 bits contagem de cabeçalhos uimsbf 0
contagem de cabeçalho * 56 + bits header-type-structure binário forma livre
16 bits contagem de mensagens uimsbf 1
contagem de mensagens * 64 + bits estrutura do tipo de mensagem binário forma livre
header-type-structure
Comprimento Nome Modelo Padrão
16 bits comprimento do nome do cabeçalho uimsbf 0
comprimento do nome do cabeçalho * 8 bits string de nome de cabeçalho UTF-8 vazio
8 bits deve-entender uimsbf 0
32 bits comprimento do cabeçalho simsbf variável
comprimento do cabeçalho * 8 bits AMF0 ou AMF3 binário forma livre
estrutura do tipo de mensagem
Comprimento Nome Modelo Padrão
16 bits target-uri-length uimsbf variável
target-uri-length * 8 bits target-uri-string UTF-8 variável
16 bits comprimento-uri-resposta uimsbf 2
comprimento-uri-resposta * 8 bits resposta-uri-string UTF-8 "/ 1"
32 bits comprimento da mensagem simsbf variável
comprimento da mensagem * 8 bits AMF0 ou AMF3 binário forma livre

Se o comprimento do cabeçalho ou o comprimento da mensagem forem desconhecidos, eles serão definidos como -1 ou 0xFFFFFFFF

uimsbf: inteiro sem sinal, o bit mais significativo primeiro

simsbf: inteiro com sinal, o bit mais significativo primeiro

AMF0

O formato especifica os vários tipos de dados que podem ser usados ​​para codificar dados. A Adobe afirma que AMF é usado principalmente para representar gráficos de objetos que incluem propriedades nomeadas na forma de pares de valores-chave, onde as chaves são codificadas como strings e os valores podem ser de qualquer tipo de dados, como strings ou números, bem como matrizes e outros objetos. XML é suportado como um tipo nativo. Cada tipo é denotado por um único byte precedendo os dados reais. Os valores desse byte são os seguintes (para AMF0):

  • Número - 0x00 (codificado como número de ponto flutuante de precisão dupla IEEE de 64 bits )
  • Booleano - 0x01 (codificado como um único byte de valor 0x00 ou 0x01)
  • String - 0x02 (comprimento de string inteiro de 16 bits com string UTF-8)
  • Objeto - 0x03 (conjunto de pares chave / valor)
  • Nulo - 0x05
  • Matriz ECMA - 0x08 (contagem de entrada de 32 bits)
  • Object End - 0x09 (precedido por um comprimento de string vazio de 16 bits)
  • Matriz estrita - 0x0a (contagem de entrada de 32 bits)
  • Data - 0x0b (codificado como número de ponto flutuante de precisão dupla IEEE de 64 bits com deslocamento de fuso horário inteiro de 16 bits)
  • String longa - 0x0c (comprimento de string inteiro de 32 bits com string UTF-8)
  • Documento XML - 0x0f (comprimento de string inteiro de 32 bits com string UTF-8)
  • Objeto digitado - 0x10 (comprimento do nome inteiro de 16 bits com nome UTF-8, seguido por entradas)
  • Mudar para AMF3 - 0x11

Os objetos AMF começam com (0x03) seguido por um conjunto de pares de valores-chave e terminam com (0x09) como valor (precedido por 0x00 0x00 como entrada de chave vazia). As chaves são codificadas como strings com o byte de 'definição de tipo' (0x02) implícito (não incluído na mensagem). Os valores podem ser de qualquer tipo, incluindo outros objetos, e gráficos de objetos inteiros podem ser serializados dessa maneira. Ambas as chaves de objeto e strings são precedidas por dois bytes que denotam seu comprimento em número de bytes. Isso significa que as strings são precedidas por um total de três bytes, que inclui o byte do tipo 0x02. Os tipos nulos contêm apenas sua definição de tipo (0x05). Os números são codificados como ponto flutuante de precisão dupla e são compostos por oito bytes.

Por exemplo, ao codificar o objeto abaixo no código 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);

Os dados mantidos no ByteArray são:

Código hexadecimal 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 . . . M ike . . idade . @> . . . . . . . . alias . . . M ike . . .

Nota: as propriedades do objeto podem ser classificadas em uma ordem diferente daquela em que são colocadas no Actionscript. Para colorir / marcar, consulte a legenda abaixo.

O código acima funcionará apenas para classes integradas como Object . Para serializar e desserializar classes personalizadas, o usuário precisa declará-las usando o comando registerClassAlias ​​ou então um erro será gerado pelo player.

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

Embora, estritamente falando, AMF seja apenas um formato de codificação de dados, geralmente é encontrado encapsulado em uma mensagem RTMP ou chamada Flex RPC. Um exemplo do primeiro pode ser encontrado abaixo (é a mensagem "_result" retornada em resposta ao comando "conectar" enviado do cliente flash):

Código hexadecimal 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 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 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 . . . . . . . . . . . . . . . _ resultado. ? . . . . . . . . . . fms V er. . . FMS / 3, 5, 5, 2 0 0 4. . capacidades. @? . . . . . . . . modo . ? . . . . . . . . . . . . . nível . . . status . . código. . . N et C onnection. C onectar. Sucesso. . Descrição . . . Conexão bem-sucedida. . . dados . . . . . . . versão. . . 3, 5, 5, 2 0 0 4. . . . . ID do Cliente . UMA . . x. . . . . . E ncoding do objeto. @. . . . . . . . . .

legenda: objeto de início / fim de objeto chaves valores de objeto ecma_array

A mensagem AMF começa com um 0x03 que denota um pacote RTMP com tipo de cabeçalho de 0 , portanto, 12 bytes são esperados a seguir. É do tipo de mensagem 0x14, que denota um comando na forma de uma string de valor "_result" e dois objetos serializados como argumentos. A mensagem pode ser decodificada da seguinte forma:

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

Aqui pode-se ver um array (em turquesa) como um valor da chave 'data' que tem um membro. Podemos ver o valor de objectEncoding como 3. Isso significa que as mensagens subsequentes serão enviadas com o tipo de mensagem 0x11, o que implicará em uma codificação AMF3.

AMF3

A versão mais recente do protocolo especifica mudanças significativas que permitem um formato mais compactado. Os marcadores de dados são os seguintes:

  • Indefinido - 0x00
  • Nulo - 0x01
  • Boolean False - 0x02
  • Boolean True - 0x03
  • Inteiro - 0x04 (inteiro expansível de 8+ bits)
  • Duplo - 0x05 (codificado como número de ponto flutuante de precisão dupla IEEE de 64 bits )
  • String - 0x06 (comprimento de string inteiro expansível de 8+ bits com uma string UTF-8)
  • XMLDocument - 0x07 (comprimento de string inteiro expansível de 8+ bits e / ou sinalizadores com uma string UTF-8)
  • Data - 0x08 (sinalizadores de número inteiro expansível de 8+ bits com ponto flutuante de precisão dupla IEEE de 64 bits com tempo de deslocamento UTC)
  • Matriz - 0x09 (contagem de entrada de inteiro expansível de 8+ bits e / ou sinalizadores com comprimentos de nome de inteiro opcional expansível de 8+ bits com nomes UTF-8)
  • Objeto - 0x0A (contagem de entrada de inteiro expansível de 8+ bits e / ou sinalizadores com comprimentos de nome de inteiro opcional expansível de 8+ bits com nomes UTF-8)
  • XML - 0x0B (sinalizadores de número inteiro expansível de 8+ bits)
  • ByteArray - 0x0C (sinalizadores inteiros expansíveis de 8+ bits com comprimento de byte opcional de 8 bits)

Os primeiros 4 tipos não são seguidos por nenhum dado (os booleanos têm dois tipos no AMF3).

Os marcadores adicionais usados ​​pelo Flash Player 10 (o formato ainda é conhecido como AMF3) são os seguintes:

  • VectorInt - 0x0D
  • VectorUInt - 0x0E
  • VectorDouble - 0x0F
  • VectorObject - 0x10
  • Dicionário - 0x11

O AMF3 visa a maior compactação e uma das maneiras de conseguir isso é evitando a duplicação de strings, salvando-os em um array no qual todos os novos strings são verificados. O byte após o marcador de string não está mais denotando comprimento puro, mas é um byte complexo onde o bit menos significativo indica se a string está 'inline' (1) ou seja, não está na matriz ou 'referência' (0), caso em que o índice da matriz é salvo. A tabela inclui chaves e também valores.

Em versões anteriores do Flash player, existia um tipo de número chamado 'Número', que era uma codificação de precisão dupla de 64 bits. Nas versões mais recentes, há um int e um uint que estão incluídos no AMF3 como tipos separados. Os tipos de número são idênticos à codificação AMF0, enquanto os inteiros têm comprimento variável de 1 a 4 bytes, onde o bit mais significativo dos bytes 1-3 indica que eles são seguidos por outro byte.

Suporte para AMF

Os vários protocolos AMF são suportados por muitas linguagens e tecnologias do lado do servidor, na forma de bibliotecas e serviços que devem ser instalados e integrados pelo desenvolvedor do aplicativo.

Plataformas:

Frameworks:

Veja também

Referências

  1. ^ "Formato da mensagem de ação - AMF 3" (PDF) . Janeiro de 2013 . Recuperado em 2021-05-01 .
  2. ^ "Formato da mensagem de ação - AMF 0" (PDF) . 2007 . Recuperado em 2021-05-01 .
  3. ^ "Adobe abre AMF, libera fonte para estrutura de remoting usada em aplicativos ricos da web" . Ars Technica . Página visitada em 31-12-2017 .
  4. ^ Recursos | Adobe ColdFusion 9 Standard

GB