Формат сообщения о действии
Эта статья нуждается в дополнительных цитатах для проверки . ( декабрь 2017 г. ) |
Тип интернет-СМИ |
приложение/октет-поток |
---|---|
Разработано | Adobe Системы |
Тип формата | обмена данными Формат |
Контейнер для | Структурированные данные |
Формат сообщения действия ( 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 бит | версия | уимсбф | 0 или 3 |
16 бит | количество заголовков | уимсбф | 0 |
количество заголовков*56+ бит | структура типа заголовка | двоичный | свободная форма |
16 бит | количество сообщений | уимсбф | 1 |
количество сообщений*64+ бит | структура-типа-сообщения | двоичный | свободная форма |
Длина | Имя | Тип | По умолчанию |
---|---|---|---|
16 бит | длина имени заголовка | уимсбф | 0 |
длина имени заголовка*8 бит | строка имени заголовка | UTF-8 | пустой |
8 бит | должен понимать | уимсбф | 0 |
32 бита | длина заголовка | симсбф | переменная |
длина заголовка*8 бит | АМФ0 или АМФ3 | двоичный | свободная форма |
Длина | Имя | Тип | По умолчанию |
---|---|---|---|
16 бит | длина цели-uri | уимсбф | переменная |
длина цели-uri*8 бит | целевая-uri-строка | UTF-8 | переменная |
16 бит | длина ответа-uri | уимсбф | 2 |
длина ответа-uri*8 бит | ответ-uri-строка | UTF-8 | "/1" |
32 бита | длина сообщения | симсбф | переменная |
длина сообщения*8 бит | АМФ0 или АМФ3 | двоичный | свободная форма |
Если длина заголовка или длина сообщения неизвестна, им присваивается значение -1 или 0xFFFFFFFF.
uimsbf: целое число без знака, первый старший бит
simsbf: целое число со знаком, сначала старший бит
АМФ0
[ редактировать ]Формат определяет различные типы данных, которые можно использовать для кодирования данных. 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 = {name:'Mike', age:'30', alias:'Mike'};
var stream:ByteArray = new ByteArray();
stream.objectEncoding = ObjectEncoding.AMF0; // ByteArray defaults to AMF3
stream.writeObject(person);
Данные, хранящиеся в 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, иначе игрок выдаст ошибку.
// for a hypothetical class Person
registerClassAlias("personTypeAlias", Person);
Хотя, строго говоря, AMF — это всего лишь формат кодирования данных, обычно он инкапсулирован в сообщение RTMP или вызов Flex RPC. Пример первого можно найти ниже (это сообщение «_result», возвращаемое в ответ на команду «connect», отправленную из флэш-клиента):
Шестнадцатеричный код | 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 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 |
. . . . . . . . . . . . . . . _ r e s u l t . ? . . . . . . . . . . f m s V e r . . . F M S / 3 , 5 , 5 , 2 0 0 4 . . c a p a b i l i t i e s . @ ? . . . . . . . . m o d e . ? . . . . . . . . . . . . . l e v e l . . . s t a t u s . . c o d e . . . N e t C o n n e c t i o n . C o n n e c t . S u c c e s s . . d e s c r i p t i o n . . . C o n n e c t i o n s u c c e e d e d . . . d a t a . . . . . . . v e r s i o n . . . 3 , 5 , 5 , 2 0 0 4 . . . . . c l i e n t I d . A . . x . . . . . . o b j e c t E n c o d i n g . @ . . . . . . . . . .
|
легенда: начало/конец объекта , ключи объекта , значения объекта ecma_array
Сообщение AMF начинается с 0x03
который обозначает пакет RTMP с типом заголовка 0 , поэтому ожидается, что за ним последуют 12 байтов. Оно имеет тип сообщения 0x14, который обозначает команду в виде строки значения «_result» и двух сериализованных объектов в качестве аргументов. Сообщение можно расшифровать следующим образом:
(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 }
Здесь можно увидеть массив (бирюзовым цветом) как значение ключа «данные», который имеет один элемент. Мы видим, что значение objectEncoding равно 3. Это означает, что последующие сообщения будут отправляться с типом сообщения 0x11, что подразумевает кодировку AMF3.
АМФ3
[ редактировать ]Последняя версия протокола содержит существенные изменения, позволяющие использовать более сжатый формат. Маркеры данных следующие:
- Неопределено — 0x00
- Ноль — 0x01
- Логическое значение Ложь — 0x02
- Логическое значение True — 0x03
- Целое число — 0x04 (расширяемое целое число длиной более 8 бит)
- Double — 0x05 (закодировано как 64-битное с плавающей запятой двойной точности IEEE) число
- Строка — 0x06 (расширяемая длина целочисленной строки длиной 8+ бит с помощью строки UTF-8)
- XMLDocument — 0x07 (расширяемая длина целочисленной строки длиной 8+ бит и/или флаги со строкой UTF-8)
- Дата — 0x08 (расширяемые 8+-битные целочисленные флаги с 64-битным IEEE 64-битным с плавающей запятой двойной точности ) временем смещения UTC
- Массив — 0x09 (расширяемое количество записей и/или флагов 8+-битных целых чисел с возможностью расширения длины имени 8+-битного целого числа с именами UTF-8)
- Объект — 0x0A (расширяемое количество записей и/или флагов 8+-битного целого числа с возможностью расширения длины имени 8+-битного целого числа с именами UTF-8)
- XML — 0x0B (расширяемые флаги целых чисел длиной более 8 бит)
- ByteArray — 0x0C (расширяемые 8+-битные целочисленные флаги с дополнительной длиной 8-битного байта)
За первыми четырьмя типами не следуют никакие данные (в AMF3 есть два типа логических значений).
Дополнительные маркеры, используемые Flash Player 10 (формат по-прежнему называется AMF3), следующие:
- Векторинт — 0x0D
- ВекторUInt — 0x0E
- Вектордабл — 0x0F
- ВекторОбъект — 0x10
- Словарь - 0x11
AMF3 стремится к большему сжатию, и один из способов достижения этой цели — избежать дублирования строк, сохраняя их в массив, по которому проверяются все новые строки. Байт, следующий за маркером строки, больше не обозначает чистую длину, а представляет собой комплексный байт, в котором младший бит указывает, является ли строка «встроенной» (1), т. е. не находится ли она в массиве или «ссылочной» (0), и в этом случае индекс массива сохраняется. Таблица включает в себя как ключи, так и значения.
В более старых версиях Flash Player существовал один тип чисел, называемый «Число», который представлял собой 64-битную кодировку двойной точности. В последних выпусках есть int и uint, которые включены в AMF3 как отдельные типы. Типы чисел идентичны кодировке AMF0, а целые числа имеют переменную длину от 1 до 4 байтов, где старший бит байтов 1–3 указывает, что за ними следует другой байт.
Поддержка АМФ
[ редактировать ]Различные протоколы AMF поддерживаются многими серверными языками и технологиями в виде библиотек и служб, которые должен установить и интегрировать разработчик приложения.
Платформы:
- КолдФьюжн - [4]
- Haxe — удаленное взаимодействие Haxe hxformat
- Java — Adobe BlazeDS , Adobe LiveCycle Data Services (ранее известные как Flex Data Services) , Exadel Flamingo , RED 5. Архивировано 23 октября 2019 г. на Wayback Machine , Cinnamon , OpenAMF , Pimento , Granite , WebORB для Java.
- .NET — WebORB для .NET , FluorineFx (LGPL), DotAmf (MS-PL), AMF.NET (разработка остановлена)
- PHP — AmfPHP , SabreAMF , WebORB для PHP , Zend_Amf , расширение php-amf3 , Baguette AMF (расширение PHP)
- Питон - амфаст
- Perl — AMF::Perl , Storable::AMF , AMF::Connection
- Curl — Службы данных Curl
- Ruby — RubyAMF , WebORB для Rails , Rocket AMF
- Эрланг - Эрланг-АМФ
- ActionScript — Flash Player ByteArray (встроенный), библиотека CourseVector
- JavaScript — JSAMF библиотека CourseVector CourseVector .minerva
- Два - два-амф3
- ABAP – ABAP AMF (ранняя стадия)
- Delphi — kbmMW (расширенная поддержка AMF0/AMF3)
- iOS — КакаоAMF
- PowerShell — Powershell AMF
Рамки:
- Связь Apache Royale с AMF и RemoteObject - Apache Royale
- Ruby на рельсах — RubyAMF
- Zend Framework — Zend_AMF
- OSGi Framework — AMF3 для OSGi
- Джанго - Джанго АМФ
- CakePHP - CakeAMFPHP
- Grails (фреймворк) — BlazeDS
- Trac — плагин TracRpcProtocolsPlugin . версия 1.1.0 (или выше) XmlRpcPlugin . Требуется
- Web2py — PyAMF
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Формат сообщения о действии — AMF 3» (PDF) . Январь 2013 года . Проверено 1 мая 2021 г.
- ^ «Формат сообщения о действии — AMF 0» (PDF) . 2007 . Проверено 1 мая 2021 г.
- ^ «Adobe открывает AMF, освобождает исходный код для платформы удаленного взаимодействия, используемой в многофункциональных веб-приложениях» . Арс Техника . Проверено 31 декабря 2017 г.
- ^ Особенности | Adobe ColdFusion 9 стандарт