Jump to content

Формат сообщения о действии

Формат сообщения о действиях (AMF)
Тип интернет-СМИ
приложение/октет-поток
Разработано 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 или протокол обмена сообщениями в реальном времени .

amf-пакетная структура
Длина Имя Тип По умолчанию
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: целое число со знаком, сначала старший бит

Формат определяет различные типы данных, которые можно использовать для кодирования данных. 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

. . . n a m e . . . M i k e . . a g e . @ > . . . . . . . . a l i a s . . . M i k e . . .

Примечание: свойства объекта могут быть отсортированы в порядке, отличном от того, в котором они расположены в 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.

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

  • Неопределено — 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 поддерживаются многими серверными языками и технологиями в виде библиотек и служб, которые должен установить и интегрировать разработчик приложения.

Платформы:

Рамки:

См. также

[ редактировать ]
  1. ^ «Формат сообщения о действии — AMF 3» (PDF) . Январь 2013 года . Проверено 1 мая 2021 г.
  2. ^ «Формат сообщения о действии — AMF 0» (PDF) . 2007 . Проверено 1 мая 2021 г.
  3. ^ «Adobe открывает AMF, освобождает исходный код для платформы удаленного взаимодействия, используемой в многофункциональных веб-приложениях» . Арс Техника . Проверено 31 декабря 2017 г.
  4. ^ Особенности | Adobe ColdFusion 9 стандарт
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 699755161f98d8e0b8e1d17ebb3319d4__1720154640
URL1:https://arc.ask3.ru/arc/aa/69/d4/699755161f98d8e0b8e1d17ebb3319d4.html
Заголовок, (Title) документа по адресу, URL1:
Action Message Format - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)