Эта статья требует дополнительных ссылок для проверки . ( декабрь 2017 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Тип интернет-СМИ | приложение / октет-поток |
---|---|
Разработан | Adobe Systems |
Тип формата | Формат обмена данными |
Контейнер для | Структурированные данные |
Формат сообщений действий ( 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 или протокол обмена сообщениями в реальном времени .
Длина | Имя | Тип | Дефолт |
---|---|---|---|
16 бит | версия | uimsbf | 0 или 3 |
16 бит | количество заголовков | uimsbf | 0 |
количество заголовков * 56 + бит | заголовок-тип-структура | двоичный | свободная форма |
16 бит | счетчик сообщений | uimsbf | 1 |
количество сообщений * 64 + бит | структура типа сообщения | двоичный | свободная форма |
Длина | Имя | Тип | Дефолт |
---|---|---|---|
16 бит | заголовок-имя-длина | uimsbf | 0 |
длина имени-заголовка * 8 бит | заголовок-имя-строка | UTF-8 | пустой |
8 бит | должен понимать | uimsbf | 0 |
32 бит | длина заголовка | simsbf | Переменная |
длина заголовка * 8 бит | AMF0 или AMF3 | двоичный | свободная форма |
Длина | Имя | Тип | Дефолт |
---|---|---|---|
16 бит | target-uri-length | uimsbf | Переменная |
длина целевого URI * 8 бит | target-uri-string | UTF-8 | Переменная |
16 бит | длина ответа-uri | uimsbf | 2 |
длина ответа-URI * 8 бит | ответ-uri-строка | UTF-8 | "/ 1" |
32 бит | длина сообщения | simsbf | Переменная |
длина сообщения * 8 бит | AMF0 или AMF3 | двоичный | свободная форма |
Если длина заголовка или длина сообщения неизвестны, они устанавливаются в -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:
Шестнадцатеричный код | 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 | . . . имя . . . Майк . . возраст . @> . . . . . . . . псевдоним . . . Майк . . . |
Примечание: свойства объекта могут быть отсортированы в порядке, отличном от того, в котором они помещены в ActionScript. Для раскраски / разметки см. Легенду ниже.
Приведенный выше код будет работать только для встроенных классов, таких как Object
. Чтобы сериализовать и десериализовать пользовательские классы, пользователь должен объявить их с помощью команды registerClassAlias, иначе игрок выдаст ошибку.
// для гипотетического класса Person registerClassAlias ( "personTypeAlias" , Person );
Хотя, строго говоря, AMF - это только формат кодирования данных, он обычно инкапсулируется в сообщение RTMP или вызов Flex RPC. Пример первого можно найти ниже (это сообщение «_result», возвращаемое в ответ на команду «connect», отправленную от клиента flash):
Шестнадцатеричный код | 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 6108 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 00 09 | . . . . . . . . . . . . . . . _ результат . ? . . . . . . . . . . fms V er. . . ФМС / 3, 5, 5, 2 0 0 4. . возможности. @? . . . . . . . . режим . ? . . . . . . . . . . . . . уровень . . . положение дел . . код. . . Подключение к сети. Соединять . Успех . . описание . . . Подключение выполнено. . . данные . . . . . . . версия. . . 3, 5, 5, 2 0 0 4. . . . . ID клиента . А. . Икс . . . . . . кодирование объекта. @. . . . . . . . . . |
легенда: начало / конец объекта ключи объекта значения объекта 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
- Буферы протокола
Ссылки [ править ]
- ^ "Формат сообщения действия - AMF 3" (PDF) . Январь 2013. Архивировано из оригинального (PDF) 31 декабря 2017 года . Проверено 31 декабря 2017 .
- ^ «Формат сообщения действия - AMF 0» (PDF) . 2007. Архивировано из оригинального (PDF) 31 декабря 2017 года . Проверено 31 декабря 2017 .
- ^ «Adobe открывает AMF, освобождает исходный код для фреймворка удаленного взаимодействия, используемого в многофункциональных веб-приложениях» . Ars Technica . Проверено 31 декабря 2017 .
- ^ Особенности | Adobe ColdFusion 9 Стандартный