Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Формат сообщений действий ( AMF ) - это двоичный формат, используемый для сериализации графов объектов, таких как объекты ActionScript и XML, или для отправки сообщений между клиентом Adobe Flash и удаленной службой, обычно это Flash Media Server или сторонние альтернативы. Язык ActionScript 3 предоставляет классы для кодирования и декодирования из формата AMF.

Формат часто используется вместе с RTMP от Adobe для установления соединений и команд управления доставкой потокового мультимедиа. В этом случае данные AMF инкапсулируются в блок, который имеет заголовок, который определяет такие вещи, как длина и тип сообщения (будь то «эхо-запрос», «команда» или мультимедийные данные).

Анализ формата [ править ]

AMF был представлен в Flash Player 6, и эта версия называется AMF0. Он оставался неизменным до выпуска Flash Player 9 и ActionScript 3.0, когда новые типы данных и языковые функции потребовали обновления под названием AMF3. [1] В Flash Player 10 добавлены векторные и словарные типы данных, задокументированные в пересмотренной спецификации от января 2013 года.

Adobe Systems опубликовала спецификацию протокола двоичных данных AMF в декабре 2007 года [2] [3] и объявила, что будет поддерживать сообщество разработчиков, чтобы сделать этот протокол доступным для всех основных серверных платформ.

Автономный пакет AMF [ править ]

Следующий пакет amf предназначен для передачи сообщений вне определенных контейнеров Adobe / Macromedia или транспортных средств, таких как Flash Video или протокол обмена сообщениями в реальном времени .

Если длина заголовка или длина сообщения неизвестны, они устанавливаются в -1 или 0xFFFFFFFF

uimsbf: целое число без знака, сначала старший бит

simsbf: целое число со знаком, сначала старший бит

AMF0 [ править ]

Формат определяет различные типы данных, которые можно использовать для кодирования данных. Adobe заявляет, что AMF в основном используется для представления графов объектов, которые включают именованные свойства в форме пар ключ-значение, где ключи закодированы как строки, а значения могут быть любого типа данных, таких как строки или числа, а также массивы и другие объекты. XML поддерживается как собственный тип. Каждый тип обозначается одним байтом, предшествующим фактическим данным. Значения этого байта следующие (для AMF0):

  • Число - 0x00 (закодировано как 64-битное число с плавающей запятой двойной точности IEEE )
  • Логическое значение - 0x01 (закодировано как один байт значения 0x00 или 0x01)
  • Строка - 0x02 (длина 16-битной целой строки со строкой UTF-8)
  • Объект - 0x03 (Набор пар ключ / значение)
  • Нулевой - 0x05
  • Массив ECMA - 0x08 (32-битное количество записей)
  • Конец объекта - 0x09 (ему предшествует пустая 16-битная строка)
  • Строгий массив - 0x0a (32-битное количество записей)
  • Дата - 0x0b (закодировано как 64-битное число с плавающей запятой двойной точности IEEE с 16-битным целочисленным смещением часового пояса)
  • Длинная строка - 0x0c (длина 32-битной целочисленной строки со строкой UTF-8)
  • XML-документ - 0x0f (длина 32-битной целочисленной строки со строкой UTF-8)
  • Типизированный объект - 0x10 (длина имени 16-битного целого с именем UTF-8, за которым следуют записи)
  • Переключиться на AMF3 - 0x11

Объекты AMF начинаются с (0x03), за которым следует набор пар ключ-значение, и заканчиваются (0x09) в качестве значения (которому предшествует 0x00 0x00 в качестве пустой ключевой записи). Ключи кодируются как строки с подразумеваемым байтом (0x02) 'определение типа' (не включаемым в сообщение). Значения могут быть любого типа, включая другие объекты, и таким образом можно сериализовать целые графы объектов. И ключам объекта, и строкам предшествуют два байта, обозначающие их длину в байтах. Это означает, что строкам предшествуют три байта, включая байт типа 0x02. Нулевые типы содержат только свое определение типа (0x05). Числа кодируются как числа с плавающей запятой двойной точности и состоят из восьми байтов.

В качестве примера при кодировании объекта ниже в коде actionscript 3.

var  person : Object  =  { имя : 'Майк' ,  возраст : '30' ,  псевдоним : 'Майк' }; var  stream : ByteArray  =  новый  ByteArray (); поток . objectEncoding  =  ObjectEncoding . AMF0 ;  // По умолчанию ByteArray использует поток AMF3 . writeObject ( человек );

Данные, хранящиеся в ByteArray:

Примечание: свойства объекта могут быть отсортированы в порядке, отличном от того, в котором они помещены в ActionScript. Для раскраски / разметки см. Легенду ниже.

Приведенный выше код будет работать только для встроенных классов, таких как Object. Чтобы сериализовать и десериализовать пользовательские классы, пользователь должен объявить их с помощью команды registerClassAlias, иначе игрок выдаст ошибку.

// для гипотетического класса Person registerClassAlias ( "personTypeAlias" ,  Person );

Хотя, строго говоря, AMF - это только формат кодирования данных, он обычно инкапсулируется в сообщение RTMP или вызов Flex RPC. Пример первого можно найти ниже (это сообщение «_result», возвращаемое в ответ на команду «connect», отправленную от клиента flash):

легенда: начало / конец объекта ключи объекта значения объекта ecma_array

Сообщение AMF начинается с 0x03символа, который обозначает пакет RTMP с типом заголовка 0 , поэтому ожидается, что за ним последуют 12 байтов. Это тип сообщения 0x14, который обозначает команду в форме строки значения «_result» и двух сериализованных объектов в качестве аргументов. Сообщение можно расшифровать следующим образом:

( команда )  "_result" ( идентификатор транзакции  ) 1 ( значение ) [ 1 ] { fmsVer : "FMS / 3,5,5,2004" возможности : 31.0 режим : 1.0 }, [ 2 ] { уровень : "статус" , код : "NetConnection.Connect.Success" , описание : "Соединение успешно." , данные : ( массив ) { версия :                     "3,5,5,2004"  },  clientId :  1584259571.0 ,  objectEncoding :  3.0  }

Здесь можно увидеть массив (выделенный бирюзой) как значение ключа data, который имеет один член. Мы видим, что значение objectEncoding равно 3. Это означает, что последующие сообщения будут отправляться с типом сообщения 0x11, что подразумевает кодировку AMF3.

AMF3 [ править ]

В последней версии протокола внесены существенные изменения, позволяющие использовать более сжатый формат. Маркеры данных следующие:

  • Не определено - 0x00
  • Нулевой - 0x01
  • Логическое значение False - 0x02
  • Логическое значение Истина - 0x03
  • Целое число - 0x04 (расширяемое 8+ битное целое число)
  • Двойной - 0x05 (кодируется как 64-битное число с плавающей запятой двойной точности IEEE )
  • Строка - 0x06 (расширяемая длина целочисленной строки длиной 8+ бит с помощью строки UTF-8)
  • XMLDocument - 0x07 (расширяемая длина строки 8+ бит и / или флаги со строкой UTF-8)
  • Дата - 0x08 (расширяемые 8+-битные целочисленные флаги с 64-битным временем смещения UTC с плавающей запятой двойной точности IEEE )
  • Массив - 0x09 (расширяемое число записей 8+ битных целых чисел и / или флаги с дополнительными расширяемыми длинами имен 8+ битов целых чисел с именами UTF-8)
  • Объект - 0x0A (расширяемый 8+ битный счетчик целочисленных записей и / или флаги с дополнительными расширяемыми 8+ битными целочисленными длинами имен с именами UTF-8)
  • XML - 0x0B (расширяемые 8+-битные целочисленные флаги)
  • ByteArray - 0x0C (расширяемые 8+-битные целочисленные флаги с необязательной длиной 8 бит)

За первыми 4 типами не следуют никакие данные (логические значения имеют два типа в AMF3).

Дополнительные маркеры, используемые Flash Player 10 (формат по-прежнему называется AMF3), следующие:

  • VectorInt - 0x0D
  • VectorUInt - 0x0E
  • VectorDouble - 0x0F
  • VectorObject - 0x10
  • Словарь - 0x11

AMF3 нацелен на большее сжатие, и один из способов добиться этого - избежать дублирования строк, сохранив их в массиве, по которому проверяется вся новая строка. Байт, следующий за маркером строки, больше не обозначает чистую длину, но представляет собой сложный байт, в котором младший значащий бит указывает, является ли строка «встроенной» (1), т.е. не в массиве или «ссылкой» (0), и в этом случае индекс массива сохраняется. Таблица включает ключи, а также значения.

В более старых версиях Flash player существовал один числовой тип под названием «Number», представлявший собой 64-битное кодирование с двойной точностью. В последних выпусках есть int и uint, которые включены в AMF3 как отдельные типы. Типы чисел идентичны кодировке AMF0, в то время как целые числа имеют переменную длину от 1 до 4 байтов, где старший бит в байтах 1-3 указывает, что за ними следует другой байт.

Поддержка AMF [ править ]

Различные протоколы AMF поддерживаются многими серверными языками и технологиями в виде библиотек и служб, которые должны быть установлены и интегрированы разработчиком приложения.

Платформы:

  • ColdFusion - [4]
  • Haxe - Haxe Remoting hxformat
  • Java - Adobe BlazeDS , Adobe LiveCycle Data Services (ранее известный как Flex Data Services) , Exadel Flamingo , RED 5 , корица , OpenAMF , тушеный , гранит , WebORB для Java
  • .NET - WebORB для .NET , FluorineFx (LGPL), DotAmf (MS-PL), AMF.NET (разработка остановлена)
  • PHP - AmfPHP , SabreAMF , WebORB для PHP , Zend_Amf , расширение php-amf3 , Baguette AMF (расширение php)
  • Python - amfast
  • Perl - AMF :: Perl , Storable :: AMF , AMF :: Connection
  • Curl - Службы данных Curl
  • Ruby - RubyAMF , WebORB для Rails , Rocket AMF
  • Эрланг - Erlang-AMF
  • ActionScript - Flash Player ByteArray (встроенный), библиотека CourseVector
  • JavaScript - курс JSAMFVector Library CourseVector .minerva
  • Lua - lua-amf3
  • ABAP - ABAP AMF (ранняя стадия)
  • Delphi - kbmMW (обширная поддержка AMF0 / AMF3)
  • iOS - CocoaAMF
  • PowerShell - Powershell AMF

Фреймворки:

  • Связь Apache Royale с AMF и RemoteObject - Apache Royale
  • Ruby on Rails - RubyAMF
  • Zend Framework - Zend_AMF
  • OSGi Framework - AMF3 для OSGi
  • Джанго - Django AMF
  • CakePHP - CakeAMFPHP
  • Grails (фреймворк) - BlazeDS
  • Trac - TracRpcProtocolsPlugin . Требуется версия 1.1.0 (или выше) XmlRpcPlugin .
  • Web2py - PyAMF

См. Также [ править ]

  • BSON
  • Буферы протокола

Ссылки [ править ]

  1. ^ "Формат сообщения действия - AMF 3" (PDF) . Январь 2013. Архивировано из оригинального (PDF) 31 декабря 2017 года . Проверено 31 декабря 2017 .
  2. ^ «Формат сообщения действия - AMF 0» (PDF) . 2007. Архивировано из оригинального (PDF) 31 декабря 2017 года . Проверено 31 декабря 2017 .
  3. ^ «Adobe открывает AMF, освобождает исходный код для фреймворка удаленного взаимодействия, используемого в многофункциональных веб-приложениях» . Ars Technica . Проверено 31 декабря 2017 .
  4. ^ Особенности | Adobe ColdFusion 9 Стандартный