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

редактировать
Формат сообщения действия (AMF)
Тип Интернет-носителя application / octet-stream
РазработаноAdobe Systems
Тип форматаОбмен данными формат
Контейнер для Структурированные данные

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

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

Содержание

  • 1 Анализ формата
    • 1.1 Автономный пакет AMF
    • 1.2 AMF0
    • 1.3 AMF3
  • 2 Поддержка AMF
  • 3 См. Также
  • 4 Ссылки

Анализ формата

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

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

Автономный пакет AMF

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

структура-пакета amf
ДлинаИмяТипПо умолчанию
16 битверсияuimsbf0 или 3
16 битколичество заголовковuimsbf0
количество заголовков * 56 + битыheader-type-structurebinaryсвободная форма
16 битmessage-countuimsbf1
message-count * 64 + битструктура-тип-сообщениядвоичныйсвободная форма
структура-тип-заголовок
ДлинаИмяТипПо умолчанию
16 битдлина имени-заголовкаuimsbf0
длина имени-заголовка * 8 битзаголовок- имя-строкаUTF-8пустой
8 битдолжен пониматьuimsbf0
32 битаheader-lengthsimsbfпеременная
длина заголовка * 8 битAMF0 или AMF3двоичныйпроизвольная форма
структура типа сообщения
ДлинаИмяТипПо умолчанию
16 битtarget-uri-lengthuimsbfпеременная
target-uri-length * 8 битtarget-uri-stringUTF-8переменная
16 битдлина uri ответаuimsbf2
длина uri ответа * 8 битresponse-uri-stringUTF-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 (закодировано как IEEE 64-битное число с плавающей запятой двойной точности с 16-битным целочисленным смещением часового пояса)
  • Длинная строка - 0x0c (длина 32-битной целочисленной строки со строкой UTF-8)
  • XML-документ - 0x0f (длина 32-битной целой строки со строкой UTF-8)
  • Типизированный объект - 0x10 (длина имени 16-битного целого с именем UTF-8, за которым следуют записи)
  • Переключиться на AMF3 - 0x11

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

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

var person: Object = {name: 'Mike', age: '30 ', alias:' Mike '}; var stream: ByteArray = новый ByteArray (); stream.objectEncoding = ObjectEncoding.AMF0; // ByteArray по умолчанию AMF3 stream.writeObject (person);

В массиве ByteArray содержатся следующие данные:

шестнадцатеричный кодASCII
0300 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», отправленную от клиента флэш-памяти):

Hex-код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 0300 06 66 6D 73 56 65 72 02 00 0E 46 4D 53 2F 33 2C 35 2C 35 2C 32 30 30 3400 0C 63 61 70 61 62 69 6C 69 74 69 65 73 00 40 3F 00 00 00 00 00 0000 04 6D 6F 64 65 00 3F F0 00 00 00 00 00 0000 00 090300 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 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 0 0 00 00 00 00 00 00 00 09............... _ r e s u l t. ?.......... 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» и двух сериализованных объектов в качестве аргументов. Сообщение можно декодировать следующим образом:

(команда) «_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

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

  • Undefined - 0x00
  • Null - 0x01
  • Boolean False - 0x02
  • Boolean True - 0x03
  • Integer - 0x04 (расширяемое 8-битное целое число)
  • Double - 0x05 (кодируется как 64-битное IEEE число с плавающей запятой двойной точности )
  • Строка - 0x06 (расширяемое 8+ длина строки битового целого числа со строкой UTF-8)
  • XMLDocument - 0x07 (расширяемая длина строки 8+ битов целого числа и / или флаги со строкой UTF-8)
  • Дата - 0x08 (расширяемая 8+-битные целочисленные флаги с 64-битным IEEE с плавающей запятой двойной точности UTC смещение времени)
  • Массив - 0x09 (расширяемое 8+-битное целочисленное количество записей и / или флаги с дополнительным расширяемым 8+ битных целочисленных длин имен с именами UTF-8)
  • Object - 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
  • Dictionary - 0x11

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

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

Поддержка AMF

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

Платформы:

Фреймворки:

См. Также

Ссылки

  1. ^«Формат сообщения действия - AMF 3» (PDF). Январь 2013. Архивировано 31 декабря 2017 года из оригинального (PDF). Проверено 31 декабря 2017 г.
  2. ^«Формат сообщения действия - AMF 0» (PDF). 2007. Архивировано из оригинального (PDF) 31 декабря 2017 года. Проверено 31 декабря 2017 г.
  3. ^«Adobe открывает AMF, освобождает исходный код для инфраструктуры удаленного взаимодействия, используемой в многофункциональных веб-приложениях». Ars Technica. Проверено 31 декабря 2017 г.
  4. ^Особенности | Adobe ColdFusion 9 Standard
Последняя правка сделана 2021-06-08 22:04:33
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте