Формат сообщения действия - Википедия - Action Message Format
Эта статья нужны дополнительные цитаты для проверка.Декабрь 2017 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Тип интернет-СМИ | приложение / октет-поток |
---|---|
Разработан | Adobe Systems |
Тип формата | Обмен данными формат |
Контейнер для | Структурированные данные |
Формат сообщения действия (AMF) - это двоичный формат, используемый для сериализовать графы объектов, такие как ActionScript объекты и XML, или отправлять сообщения между Adobe Flash клиент и удаленная служба, обычно Flash Media Server или сторонние альтернативы. Язык Actionscript 3 предоставляет классы для кодирования и декодирования из формата AMF.
Формат часто используется вместе с Adobe RTMP для установления соединений и команд управления доставкой потокового мультимедиа. В этом случае данные 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 видео или Протокол обмена сообщениями в реальном времени.
Длина | Имя | Тип | Дефолт |
---|---|---|---|
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 (в кодировке IEEE 64-bit с плавающей запятой двойной точности номер)
- Логическое значение - 0x01 (закодировано как один байт значения 0x00 или 0x01)
- Строка - 0x02 (длина 16-битной целой строки со строкой UTF-8)
- Объект - 0x03 (Набор пар ключ / значение)
- Нулевой - 0x05
- Массив ECMA - 0x08 (32-битное количество записей)
- Конец объекта - 0x09 (которому предшествует пустая 16-битная строка)
- Строгий массив - 0x0a (32-битное количество записей)
- Дата - 0x0b (в кодировке IEEE 64-bit с плавающей запятой двойной точности число с 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.
вар человек:Объект = {имя:'Майк', возраст:'30', псевдоним:'Майк'};вар транслировать:ByteArray = новый ByteArray();транслировать.objectEncoding = ObjectEncoding.AMF0; // ByteArray по умолчанию AMF3транслировать.writeObject(человек);
В ByteArray хранятся следующие данные:
Шестнадцатеричный код | ASCII |
---|---|
03 00 04 6e 61 6d 65 02 00 04 4д 69 6б 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 4д 69 6б 65 00 00 09 | . . . имя . . . М и к е . . возраст . @ > . . . . . . . . а л я а с . . . М и к е . . . |
Примечание: свойства объекта могут быть отсортированы в порядке, отличном от того, в котором они помещены в ActionScript. Для раскраски / разметки см. Легенду ниже.
Приведенный выше код будет работать только для встроенных классов, таких как Объект
. Чтобы сериализовать и десериализовать пользовательские классы, пользователь должен объявить их с помощью команды registerClassAlias, иначе игрок выдаст ошибку.
// для гипотетического класса PersonregisterClassAlias("personTypeAlias", Человек);
Хотя, строго говоря, 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 6Д 6Ф 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 | . . . . . . . . . . . . . . . _ результат . ? . . . . . . . . . . f m s V e r. . . Ф М С / 3, 5, 5, 2 0 0 4. . с а п а б и л я т и е с. @? . . . . . . . . режим . ? . . . . . . . . . . . . . уровень . . . положение дел . . c o d e. . . N e t C o n n e c t i o n. Соединять . Успех . . описание . . . Конн е к т и н с у ц е д е д. . . данные . . . . . . . в э р с я о н. . . 3, 5, 5, 2 0 0 4. . . . . ID клиента . А. . Икс . . . . . . о б е к т е н к о д и н г. @. . . . . . . . . . |
легенда: начало / конец объекта ключи объекта значения объекта ecma_array
Сообщение AMF начинается с 0x03
что обозначает пакет RTMP с Тип заголовка 0, поэтому ожидается, что за ним последуют 12 байтов. Это тип сообщения 0x14, который обозначает команду в форме строки значения «_result» и двух сериализованных объектов в качестве аргументов. Сообщение можно расшифровать следующим образом:
(команда) "_результат"(сделка я бы) 1(ценить)[1] { fmsVer: «ФМС / 3,5,5,2004» возможности: 31.0 Режим: 1.0 },[2] { уровень: "положение дел", код: "NetConnection.Connect.Success", описание: «Соединение успешно»., данные: (множество) { версия: "3,5,5,2004" }, ID клиента: 1584259571.0, objectEncoding: 3.0 }
Здесь можно увидеть массив (выделенный бирюзой) как значение ключа data, который имеет один член. Мы видим, что значение objectEncoding равно 3. Это означает, что последующие сообщения будут отправляться с типом сообщения 0x11, что подразумевает кодировку AMF3.
AMF3
В последней версии протокола внесены существенные изменения, которые позволяют использовать более сжатый формат. Маркеры данных следующие:
- Не определено - 0x00
- Нулевой - 0x01
- Логическое значение False - 0x02
- Boolean True - 0x03
- Целое число - 0x04 (расширяемое целое число 8+ бит)
- Двойной - 0x05 (кодируется как 64-битный IEEE с плавающей запятой двойной точности номер)
- Строка - 0x06 (расширяемая длина целочисленной строки длиной 8+ бит с помощью строки UTF-8)
- XMLDocument - 0x07 (расширяемая длина строки 8+ битов и / или флаги со строкой UTF-8)
- Дата - 0x08 (расширяемые 8+-битные целочисленные флаги с 64-битным IEEE с плавающей запятой двойной точности Время смещения UTC)
- Массив - 0x09 (расширяемое число записей 8+ битных целых чисел и / или флаги с необязательными расширяемыми длинами имен целых 8+ битов с именами UTF-8)
- Объект - 0x0A (расширяемое число записей 8+ битных целых чисел и / или флаги с необязательными расширяемыми длинами имен целых чисел 8+ бит с именами UTF-8)
- XML - 0x0B (расширяемые 8+-битные целочисленные флаги)
- ByteArray - 0x0C (расширяемые 8+-битные целочисленные флаги с необязательной длиной 8 бит)
За первыми четырьмя типами не следуют никакие данные (логические значения имеют два типа в 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 поддерживаются многими серверными языками и технологиями в виде библиотек и служб, которые должны быть установлены и интегрированы разработчиком приложения.
Платформы:
- Холодный синтез -[4]
- Haxe - Haxe Remoting hxformat
- Ява - Adobe BlazeDS, Adobe LiveCycle Data Services (ранее известная как Flex Data Services), Exadel Flamingo, КРАСНЫЙ 5, Корица, OpenAMF, Пименто, Гранит, WebORB для Java
- .СЕТЬ - WebORB для .NET, FluorineFx (LGPL), DotAmf (MS-PL), AMF.NET (разработка остановлена)
- PHP - AmfPHP, SabreAMF, WebORB для PHP, Zend_Amf, расширение php-amf3, Багет AMF (расширение php)
- Python - быстро
- Perl - AMF :: Perl, Сохраняемый :: AMF, AMF :: Подключение
- Завиток - Curl Data Services
- Рубин - RubyAMF, WebORB для Rails, Ракета AMF
- Erlang - Эрланг-AMF
- ActionScript - Flash Player ByteArray (встроенный), КурсВекторная библиотека
- JavaScript - JSAMF КурсВекторная библиотека КурсВектор .minerva
- Lua - lua-amf3
- ABAP - ABAP AMF (ранняя стадия)
- Delphi - kbmMW (обширная поддержка AMF0 / AMF3)
- iOS - КакаоАМФ
- Powershell - Powershell AMF
Фреймворки:
- Связь Apache Royale с AMF и RemoteObject - Apache Royale
- Рубин на рельсах - RubyAMF
- Zend Framework - Zend_AMF
- OSGi Framework - AMF3 для OSGi
- Джанго - Django AMF
- CakePHP - ТортAMFPHP
- Grails (фреймворк) - BlazeDS
- Trac - TracRpcProtocolsPlugin. Версия 1.1.0 (или выше) XmlRpcPlugin необходимо.
- Web2py - ПЯМФ
Смотрите также
Рекомендации
- ^ «Формат сообщения действия - AMF 3» (PDF). Январь 2013. Архивировано с оригинал (PDF) на 2017-12-31. Получено 2017-12-31.
- ^ «Формат сообщения действия - AMF 0» (PDF). 2007. Архивировано с оригинал (PDF) на 2017-12-31. Получено 2017-12-31.
- ^ «Adobe открывает AMF, освобождает исходный код для инфраструктуры удаленного взаимодействия, используемой в многофункциональных веб-приложениях». Ars Technica. Получено 2017-12-31.
- ^ Особенности | Adobe ColdFusion 9 Стандартный