El formato de mensaje de acción ( AMF ) es un formato binario que se utiliza para serializar gráficos de objetos como objetos ActionScript y XML, o enviar mensajes entre un cliente de Adobe Flash y un servicio remoto, generalmente un servidor Flash Media o alternativas de terceros. El lenguaje Actionscript 3 proporciona clases para codificar y decodificar desde el formato AMF.
Tipo de medio de Internet | aplicación / secuencia de octetos |
---|---|
Desarrollado por | Adobe Systems |
Tipo de formato | Formato de intercambio de datos |
Contenedor para | Datos estructurados |
El formato se usa a menudo junto con el RTMP de Adobe para establecer conexiones y comandos de control para la entrega de medios de transmisión. En este caso, los datos AMF se encapsulan en un fragmento que tiene un encabezado que define cosas como la longitud y el tipo del mensaje (ya sea un "ping", "comando" o datos de medios).
Análisis de formato
AMF se introdujo con Flash Player 6 y esta versión se conoce como AMF0. No se modificó hasta el lanzamiento de Flash Player 9 y ActionScript 3.0, cuando los nuevos tipos de datos y funciones de lenguaje provocaron una actualización, denominada AMF3. [1] Flash Player 10 agregó tipos de datos vectoriales y de diccionario documentados en una especificación revisada de enero de 2013.
Adobe Systems publicó la especificación del protocolo de datos binarios AMF en diciembre de 2007 [2] [3] y anunció que apoyará a la comunidad de desarrolladores para que este protocolo esté disponible para todas las principales plataformas de servidor.
Paquete autónomo AMF
El siguiente paquete amf es para la transmisión de mensajes fuera de los contenedores o transportes definidos de Adobe / Macromedia, como Flash Video o el Protocolo de mensajería en tiempo real .
Largo | Nombre | Tipo | Defecto |
---|---|---|---|
16 bits | versión | uimsbf | 0 o 3 |
16 bits | recuento de encabezados | uimsbf | 0 |
recuento de encabezados * 56 + bits | estructura-tipo-encabezado | binario | forma libre |
16 bits | recuento de mensajes | uimsbf | 1 |
recuento de mensajes * 64 + bits | estructura-tipo-mensaje | binario | forma libre |
Largo | Nombre | Tipo | Defecto |
---|---|---|---|
16 bits | longitud del nombre del encabezado | uimsbf | 0 |
longitud-nombre-encabezado * 8 bits | cadena-nombre-encabezado | UTF-8 | vacío |
8 bits | tienes que entender | uimsbf | 0 |
32 bits | longitud del encabezado | simsbf | variable |
longitud del encabezado * 8 bits | AMF0 o AMF3 | binario | forma libre |
Largo | Nombre | Tipo | Defecto |
---|---|---|---|
16 bits | longitud-uri-objetivo | uimsbf | variable |
longitud del uri de destino * 8 bits | target-uri-string | UTF-8 | variable |
16 bits | respuesta-uri-length | uimsbf | 2 |
respuesta-uri-length * 8 bits | respuesta-uri-string | UTF-8 | "/ 1" |
32 bits | longitud del mensaje | simsbf | variable |
longitud del mensaje * 8 bits | AMF0 o AMF3 | binario | forma libre |
Si se desconoce la longitud del encabezado o la longitud del mensaje, se establecen en -1 o 0xFFFFFFFF
uimsbf: entero sin signo, el bit más significativo primero
simsbf: entero con signo, el bit más significativo primero
AMF0
El formato especifica los distintos tipos de datos que se pueden utilizar para codificar datos. Adobe afirma que AMF se utiliza principalmente para representar gráficos de objetos que incluyen propiedades con nombre en forma de pares clave-valor, donde las claves están codificadas como cadenas y los valores pueden ser de cualquier tipo de datos, como cadenas o números, así como matrices y otros objetos. XML se admite como tipo nativo. Cada tipo se indica con un solo byte que precede a los datos reales. Los valores de ese byte son los siguientes (para AMF0):
- Número: 0x00 (codificado como número de punto flotante de doble precisión IEEE de 64 bits )
- Booleano: 0x01 (codificado como un solo byte de valor 0x00 o 0x01)
- Cadena: 0x02 (longitud de cadena entera de 16 bits con cadena UTF-8)
- Objeto - 0x03 (conjunto de pares clave / valor)
- Nulo: 0x05
- Matriz ECMA - 0x08 (recuento de entradas de 32 bits)
- Fin del objeto: 0x09 (precedido por una longitud de cadena vacía de 16 bits)
- Matriz estricta: 0x0a (recuento de entradas de 32 bits)
- Fecha: 0x0b (codificado como número de punto flotante de precisión doble IEEE de 64 bits con desplazamiento de zona horaria de número entero de 16 bits)
- Cadena larga: 0x0c (longitud de cadena entera de 32 bits con cadena UTF-8)
- Documento XML: 0x0f (longitud de cadena entera de 32 bits con cadena UTF-8)
- Objeto con tipo: 0x10 (longitud de nombre entero de 16 bits con nombre UTF-8, seguido de entradas)
- Cambiar a AMF3 - 0x11
Los objetos AMF comienzan con un (0x03) seguido de un conjunto de pares clave-valor y terminan con un (0x09) como valor (precedido por 0x00 0x00 como entrada de clave vacía). Las claves se codifican como cadenas con el byte de 'definición de tipo' (0x02) implícito (no incluido en el mensaje). Los valores pueden ser de cualquier tipo, incluidos otros objetos, y los gráficos de objetos completos se pueden serializar de esta manera. Tanto las claves de objeto como las cadenas están precedidas por dos bytes que indican su longitud en número de bytes. Esto significa que las cadenas están precedidas por un total de tres bytes que incluyen el byte de tipo 0x02. Los tipos nulos solo contienen su definición de tipo (0x05). Los números se codifican como punto flotante de doble precisión y se componen de ocho bytes.
Como ejemplo, al codificar el objeto a continuación en el código actionscript 3.
var person : Object = { nombre : 'Mike' , edad : '30' , alias : 'Mike' }; var flujo : ByteArray = new ByteArray (); corriente . objectEncoding = ObjectEncoding . AMF0 ; // ByteArray tiene como valor predeterminado el flujo AMF3 . writeObject ( persona );
Los datos almacenados en ByteArray son:
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 | . . . nombre . . . M ike . . edad . @> . . . . . . . . alias . . . M ike . . . |
Nota: las propiedades del objeto se pueden clasificar en un orden diferente al que están colocadas en actionscript. Para colorear / marcar, consulte la leyenda a continuación.
El código anterior funcionará solo para clases integradas como Object
. Para serializar y deserializar clases personalizadas, el usuario debe declararlas usando el comando registerClassAlias o, de lo contrario, el reproductor arrojará un error.
// para una clase hipotética Person registerClassAlias ( "personTypeAlias" , Person );
Aunque, estrictamente hablando, AMF es solo un formato de codificación de datos, generalmente se encuentra encapsulado en un mensaje RTMP o una llamada Flex RPC. Un ejemplo del primero se puede encontrar a continuación (es el mensaje "_result" devuelto en respuesta al comando "connect" enviado desde el 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 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 | . . . . . . . . . . . . . . . _ resultado. ? . . . . . . . . . . fms V er. . . FMS / 3, 5, 5, 2 0 0 4. . capacidades. @? . . . . . . . . modo . ? . . . . . . . . . . . . . nivel . . . estado . . codigo. . . N et C onnection. C onnect. Éxito . . descripción. . . La conexión tuvo éxito. . . datos . . . . . . . versión . . . 3, 5, 5, 2 0 0 4. . . . . Identificación del cliente . UNA . . X . . . . . . codificación de objeto. @. . . . . . . . . . |
leyenda: inicio / fin del objeto claves del objeto valores del objeto ecma_array
El mensaje AMF comienza con un 0x03
que denota un paquete RTMP con el tipo de encabezado 0 , por lo que se espera que le sigan 12 bytes. Es de tipo de mensaje 0x14, que denota un comando en forma de una cadena de valor "_result" y dos objetos serializados como argumentos. El mensaje se puede decodificar de la siguiente manera:
( comando ) "_result" ( ID de transacción ) 1 ( valor ) [ 1 ] { fmsVer : "FMS / 3,5,5,2004" capacidades : 31.0 modo : 1.0 }, [ 2 ] { nivel : "estado" , código : "NetConnection.Connect.Success" , descripción : "Conexión correcta". , datos : ( matriz ) { versión : "3,5,5,2004" }, clientId : 1584259571.0 , objectEncoding : 3.0 }
Aquí se puede ver una matriz (en turquesa) como un valor de la clave 'datos' que tiene un miembro. Podemos ver que el valor de objectEncoding es 3. Esto significa que los mensajes posteriores se enviarán con el tipo de mensaje 0x11, lo que implicará una codificación AMF3.
AMF3
La última versión del protocolo especifica cambios significativos que permiten un formato más comprimido. Los marcadores de datos son los siguientes:
- Indefinido - 0x00
- Nulo - 0x01
- Falso booleano - 0x02
- Booleano verdadero: 0x03
- Entero - 0x04 (entero expandible de 8+ bits)
- Doble: 0x05 (codificado como número de punto flotante de doble precisión IEEE de 64 bits )
- Cadena: 0x06 (longitud de cadena entera de más de 8 bits expandible con una cadena UTF-8)
- XMLDocument - 0x07 (longitud de cadena de entero de más de 8 bits expandible y / o indicadores con una cadena UTF-8)
- Fecha: 0x08 (indicadores de entero expandibles de más de 8 bits con un tiempo de compensación UTC de punto flotante de doble precisión IEEE de 64 bits )
- Matriz: 0x09 (recuento de entradas de números enteros de más de 8 bits expandibles y / o indicadores con longitudes de nombres de números enteros de más de 8 bits expandibles opcionales con nombres UTF-8)
- Objeto: 0x0A (recuento de entradas de números enteros de más de 8 bits expandibles y / o indicadores con longitudes de nombres de números enteros de más de 8 bits expandibles opcionales con nombres UTF-8)
- XML - 0x0B (indicadores de entero expandibles de más de 8 bits)
- ByteArray - 0x0C (indicadores de entero expandibles de más de 8 bits con una longitud de bytes de 8 bits opcional)
Los primeros 4 tipos no van seguidos de ningún dato (los booleanos tienen dos tipos en AMF3).
Los marcadores adicionales utilizados por Flash Player 10 (el formato todavía se conoce como AMF3) son los siguientes:
- VectorInt - 0x0D
- VectorUInt - 0x0E
- VectorDouble - 0x0F
- VectorObject - 0x10
- Diccionario - 0x11
AMF3 apunta a una mayor compresión y una de las formas en que lo logra es evitando la duplicación de cadenas guardándolas en una matriz en la que se verifican todas las cadenas nuevas. El byte que sigue al marcador de cadena ya no denota longitud pura, sino que es un byte complejo donde el bit menos significativo indica si la cadena está 'en línea' (1) es decir, no en la matriz o 'referencia' (0) en cuyo caso el se guarda el índice de la matriz. La tabla incluye claves y valores.
En versiones anteriores de Flash Player existía un tipo de número llamado 'Número' que era una codificación de doble precisión de 64 bits. En las últimas versiones hay un int y un uint que se incluyen en AMF3 como tipos separados. Los tipos de números son idénticos a la codificación AMF0, mientras que los enteros tienen una longitud variable de 1 a 4 bytes, donde el bit más significativo de los bytes 1-3 indica que van seguidos de otro byte.
Soporte para AMF
Los diversos protocolos AMF son compatibles con muchos lenguajes y tecnologías del lado del servidor, en forma de bibliotecas y servicios que deben ser instalados e integrados por el desarrollador de la aplicación.
Plataformas:
- ColdFusion - [4]
- Haxe - Haxe Remoting hxformat
- Java : Adobe BlazeDS , Adobe LiveCycle Data Services (anteriormente conocido como Flex Data Services) , Exadel Flamingo , RED 5 , Cinnamon , OpenAMF , Pimento , Granite , WebORB para Java
- .NET : WebORB para .NET , FluorineFx (LGPL), DotAmf (MS-PL), AMF.NET (desarrollo detenido)
- PHP : AmfPHP , SabreAMF , WebORB para PHP , Zend_Amf , extensión php-amf3 , Baguette AMF (extensión php)
- Python - amfast
- Perl - AMF :: Perl , Storable :: AMF , AMF :: Conexión
- Curl - Servicios de datos de Curl
- Ruby : RubyAMF , WebORB para rieles , Rocket AMF
- Erlang - Erlang-AMF
- ActionScript : Flash Player ByteArray (integrado), biblioteca CourseVector
- JavaScript - JSAMF CourseVector Library CourseVector .minerva
- Lua - lua-amf3
- ABAP - ABAP AMF (etapa inicial)
- Delphi - kbmMW (amplia compatibilidad con AMF0 / AMF3)
- iOS : CocoaAMF
- PowerShell - Powershell AMF
Marcos:
- Comunicación de Apache Royale con AMF y RemoteObject - Apache Royale
- Ruby on Rails - RubyAMF
- Zend Framework - Zend_AMF
- Marco OSGi - AMF3 para OSGi
- Django - Django AMF
- CakePHP - CakeAMFPHP
- Grails (marco) - BlazeDS
- Trac - TracRpcProtocolsPlugin . Se requiere la versión 1.1.0 (o superior) de XmlRpcPlugin .
- Web2py - PyAMF
Ver también
- BSON
- Búferes de protocolo
Referencias
- ^ "Formato de mensaje de acción - AMF 3" (PDF) . Enero de 2013 . Consultado el 1 de mayo de 2021 .
- ^ "Formato de mensaje de acción - AMF 0" (PDF) . 2007 . Consultado el 1 de mayo de 2021 .
- ^ "Adobe abre AMF, libera la fuente para el marco de comunicación remota utilizado en aplicaciones web enriquecidas" . Ars Technica . Consultado el 31 de diciembre de 2017 .
- ^ Características | Estándar de Adobe ColdFusion 9
GB