تنسيق رسالة الإجراء

تنسيق رسائل الإجراءات ( AMF ) هو تنسيق ثنائي يُستخدم لتسلسل مخططات الكائنات ، مثل كائنات ActionScript وXML، أو لإرسال الرسائل بين عميل Adobe Flash وخدمة بعيدة، عادةً ما تكون خادم وسائط Flash أو بدائل أخرى. توفر لغة ActionScript 3 فئات للترميز وفك الترميز من تنسيق AMF.

يُستخدم هذا التنسيق غالبًا بالتزامن مع بروتوكول RTMP من Adobe لإنشاء الاتصالات وأوامر التحكم لتوصيل الوسائط المتدفقة . في هذه الحالة، تُغلّف بيانات AMF في جزء يحتوي على رأس يُحدد خصائص مثل طول الرسالة ونوعها (سواء كانت "ping" أو "أمرًا" أو بيانات وسائط).

تحليل التنسيق

تم تقديم 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 بتإصدارuimsbf0 أو 3
16 بتعدد الرؤوسuimsbf0
عدد الرؤوس * 56 + بتبنية نوع الرأسثنائيشكل حر
16 بتعدد الرسائلuimsbf1
عدد الرسائل * 64 + بتبنية نوع الرسالةثنائيشكل حر
بنية نوع الرأس
طولاسميكتبتقصير
16 بتطول اسم العنوانuimsbf0
طول اسم الرأس * 8 بتسلسلة اسم العنوانUTF-8فارغ
8 بتيجب فهمهuimsbf0
32 بتطول رأس الصفحةsimsbfعامل
طول رأس الملف * 8 بتAMF0 أو AMF3ثنائيشكل حر
بنية نوع الرسالة
طولاسميكتبتقصير
16 بتطول عنوان URI المستهدفuimsbfعامل
طول عنوان URI المستهدف * 8 بتسلسلة عنوان URI المستهدفةUTF-8عامل
16 بتطول عنوان URI للاستجابةuimsbf2
طول عنوان URI للاستجابة * 8 بتسلسلة عنوان URI للاستجابةUTF-8"/1"
32 بتطول الرسالةsimsbfعامل
طول الرسالة * 8 بتAMF0 أو AMF3ثنائيشكل حر

إذا كان طول الترويسة أو طول الرسالة غير معروف، فسيتم تعيينهما إلى -1 أو 0xFFFFFFFF

uimsbf: عدد صحيح غير مُوقّع، البت الأكثر أهمية أولاً

simsbf: عدد صحيح مُوقّع، البت الأكثر أهمية أولاً

AMF0

يُحدد هذا التنسيق أنواع البيانات المختلفة التي يُمكن استخدامها لترميز البيانات. تُشير أدوبي إلى أن AMF يُستخدم بشكل أساسي لتمثيل مخططات الكائنات التي تتضمن خصائص مُسماة على شكل أزواج مفتاح-قيمة، حيث تُرمّز المفاتيح كسلاسل نصية، بينما يُمكن أن تكون القيم من أي نوع بيانات، مثل السلاسل النصية أو الأرقام، بالإضافة إلى المصفوفات والكائنات الأخرى. يدعم AMF تنسيق XML كنوع بيانات أصلي. يُشار إلى كل نوع ببايت واحد يسبق البيانات الفعلية. فيما يلي قيم هذا البايت (لـ AMF0):

  • الرقم - 0x00 (مشفر كرقم فاصلة عائمة مزدوج الدقة 64 بت وفقًا لمعيار IEEE)
  • قيمة منطقية - 0x01 (مشفرة كبايت واحد بقيمة 0x00 أو 0x01)
  • String - 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 كقيمة مفتاح فارغة). تُشفّر المفاتيح كسلاسل نصية، مع تضمين بايت تعريف النوع (0x02) ضمنيًا (غير مُضمّن في الرسالة). يمكن أن تكون القيم من أي نوع، بما في ذلك الكائنات الأخرى، ويمكن تسلسل مخططات الكائنات الكاملة بهذه الطريقة. يسبق كل من مفاتيح الكائنات والسلاسل النصية بايتان يُشيران إلى طولها بالبايتات. هذا يعني أن السلاسل النصية تسبقها ثلاثة بايتات، بما في ذلك بايت النوع 0x02. تحتوي الأنواع الفارغة على تعريف نوعها فقط (0x05). تُشفّر الأرقام كأرقام عشرية مزدوجة الدقة ، وتتكون من ثمانية بايتات.

على سبيل المثال، عند ترميز الكائن أدناه في كود ActionScript 3.

var person : Object = { name : 'Mike' , age : '9.75' , alias : 'Mike' }; var stream : ByteArray = new ByteArray (); stream . objectEncoding = ObjectEncoding . AMF0 ; // ByteArray defaults to AMF3 stream . writeObject ( person );

البيانات المخزنة في مصفوفة البايت هي:

رمز سداسي عشري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 . . .

ملاحظة: يمكن ترتيب خصائص الكائن بترتيب مختلف عن ترتيبها في لغة أكشن سكريبت. للاطلاع على الألوان/الترميز، يُرجى الرجوع إلى مفتاح الرموز أدناه.

لن يعمل الكود أعلاه إلا مع الفئات المدمجة Object. أما بالنسبة للفئات المخصصة، فيجب على المستخدم تعريفها باستخدام الأمر registerClassAlias، وإلا سيُظهر المشغل خطأً.

// بالنسبة لفئة افتراضية Person، يتم تسجيل اسم الفئة المستعار ( "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 0903 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

تبدأ رسالة AMF برمز 0x03يشير إلى حزمة RTMP بنوع رأس 0 ، لذا من المتوقع أن تتبعها 12 بايت. وهي من نوع الرسالة 0x14، والذي يشير إلى أمر على شكل سلسلة نصية قيمتها "_result" وكائنين مُسلسلين كوسيطات. يمكن فك تشفير الرسالة كما يلي:

( الأمر ) "_النتيجة" ( معرف المعاملة ) 1 ( القيمة ) [ 1 ] { fmsVer : "FMS/3,5,5,2004" capabilities : 31.0 mode : 1.0 }, [ 2 ] { level : "status" , code : "NetConnection.Connect.Success" , description : "تم الاتصال بنجاح." , data : ( array ) { version : "3,5,5,2004" }, clientId : 1584259571.0 , objectEncoding : 3.0 }

هنا نرى مصفوفة (باللون الفيروزي) كقيمة لمفتاح "البيانات" تحتوي على عنصر واحد. نلاحظ أن قيمة objectEncoding هي 3. هذا يعني أن الرسائل اللاحقة ستُرسل بنوع الرسالة 0x11، مما يعني استخدام ترميز AMF3.

AMF3

يُحدد الإصدار الأخير من البروتوكول تغييرات جوهرية تسمح بتنسيق أكثر ضغطًا. وفيما يلي علامات البيانات:

  • غير مُعرَّف - 0x00
  • فارغ - 0x01
  • قيمة منطقية خاطئة - 0x02
  • القيمة المنطقية صحيح - 0x03
  • عدد صحيح - 0x04 (عدد صحيح قابل للتوسيع 8+ بت)
  • Double - 0x05 (مشفر كرقم فاصلة عائمة مزدوج الدقة 64 بت وفقًا لمعيار IEEE)
  • String - 0x06 (سلسلة عددية قابلة للتوسيع بطول 8 بت أو أكثر مع سلسلة UTF-8)
  • XMLDocument - 0x07 (طول سلسلة عدد صحيح قابل للتوسيع 8+ بت و/أو علامات مع سلسلة UTF-8)
  • التاريخ - 0x08 (علامات عددية قابلة للتوسيع 8+ بت مع وقت إزاحة UTC بنقطة عائمة مزدوجة الدقة IEEE 64 بت )
  • مصفوفة - 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. تتطابق أنواع البيانات من نوع Number مع تشفير AMF0، بينما يتراوح طول الأعداد الصحيحة من 1 إلى 4 بايتات، حيث يشير البت الأكثر أهمية في البايتات من 1 إلى 3 إلى أنها متبوعة ببايت آخر.

دعم AMF

يتم دعم بروتوكولات AMF المختلفة بواسطة العديد من لغات وتقنيات جانب الخادم، في شكل مكتبات وخدمات يجب تثبيتها ودمجها بواسطة مطور التطبيق.

المنصات:

الأطر:

انظر أيضاً

مراجع

  1. "تنسيق رسالة الإجراء -- AMF 3" (ملف PDF) . يناير 2013. تم الاطلاع عليه بتاريخ 1 مايو 2021 .
  2. "تنسيق رسالة الإجراء -- AMF 0" (ملف PDF) . 2007. تم الاطلاع عليه بتاريخ 2021-05-01 .
  3. "أدوبي تفتح إطار عمل AMF، وتُحرر شفرة المصدر لإطار عمل الاتصال عن بُعد المستخدم في تطبيقات الويب الغنية" . آرس تكنيكا . تاريخ الاسترجاع: 31 ديسمبر 2017 .
  4. الميزات | Adobe ColdFusion 9 Standard