تحديد بنية الخدمة

تشير بنية الخدمة إلى كيفية إنشاء الخدمات وكيفية تواصلها مع المكوّنات الأخرى في النظام.

إنشاء حِزم خدمات

تجمع حِزم الخدمات وحدات الخدمة ذات الصلة التي يمكن نشرها معًا. الخاصية الوحيدة المطلوبة لحزمة الخدمة هي الاسم. ويشكّل الاسم مع اسم الحزمة الاسم المؤهّل بالكامل لحزمة الخدمة.

يتم تحديد حِزم الخدمات باستخدام ملفات Vehicle Services Interface Definition Language (VSIDL) (ملفات بامتداد .vsidl).

يوضّح المثال التالي حزمتَي خدمات: حزمة خدمات TirePressureMonitoring وحزمة خدمات BodyControl:

package: "com.android.sdv.sample.vsidl"

service_bundle {
  name: "TirePressureMonitoring"
}

service_bundle {
  name: "BodyControl"
}

المكان:

  • يحدّد service_bundle البنية على أنّها حزمة خدمات.
  • name هو اسم حزمة الخدمات.

أنماط المراسلة: Pub/Sub واستدعاء الإجراء عن بُعد

يستخدم إطار عمل SDV نمطَي مراسلة أساسيَّين: النشر والاشتراك (Pub/Sub) واستدعاء الإجراء عن بُعد (RPC).

في Pub/Sub، يتفاعل النظام مع الحالة المتغيرة للمركبة من خلال بث البيانات إلى أي مكونات مهتمة. يتم تنظيم البيانات في مواضيع. ينشر الناشرون الرسائل حول المواضيع. يرسل الناشر رسائل حول مواضيع معيّنة بدون الحاجة إلى معرفة عدد المشتركين الذين يستمعون إلى هذه الرسائل أو هويتهم. يتلقّى المشتركون رسائل حول مواضيع معيّنة بدون معرفة الناشرين الذين أرسلوا هذه الرسائل.

في المقابل، تم تصميم RPC لاتّخاذ إجراء وتحقيق نتيجة. ويتم استخدامها عندما يبدأ المتصل طلبًا لأنّه يهتم بالنتيجة المحدّدة أو تأكيد هذا الإجراء. يستدعي المتصل طريقة معيّنة على قناة.

على الرغم من أنّ هذه الأنماط تخدم احتياجات تشغيلية مختلفة، إلا أنّها تشترك في خاصية هيكلية مشتركة، وهي أنّ كلاهما يعتمد على مسارات اتصال مسماة، أي المواضيع في Pub/Sub والقنوات في RPC، وذلك لفصل هوية المرسل عن هوية المستلم.

تعريف الناشر والمشترك

نمط النشر والاشتراك هو نمط مراسلة لا يرسل فيه مُرسِلو الرسائل، المعروفون باسم الناشرين، الرسائل مباشرةً إلى مستلمين محدّدين، يُطلق عليهم اسم المشتركين. بدلاً من ذلك، يصنّف الناشرون الرسائل ضمن مواضيع، ويشترك المشتركون في موضوع واحد أو أكثر من مواضيع التواصل ويتلقّون فقط الرسائل المنشورة ضمن تلك المواضيع. لمزيد من المعلومات حول نمط النشر والاشتراك، اطّلِع على نمط النشر والاشتراك.

إضافة ناشر إلى حزمة خدمات

تعرض الأمثلة التالية ناشرًا تمت إضافته إلى حزمة الخدمات TirePressureMonitoring:

package: "com.android.sdv.sample.vsidl"

service_bundle {
  name: "TirePressureMonitoring"

  publisher {
    message: "TirePressure"
    topic: "front-left"
    capacity: 10
  }

}

service_bundle {
  name: "BodyControl"

  ...
}

المكان:

  • تنشر رسالة الخدمة publisher الرسائل في قائمة انتظار الرسائل.
  • message بنية البيانات أو نوع الرسالة المحدّد في protobuf (ملف بالامتداد .protobuf).
  • topic معرّف فريد لموضوع المنشور. يجب أن يكون بالأحرف الصغيرة مع استخدام شرطات.
  • capacity عدد الرسائل التي يمكن أن يحتوي عليها قائمة انتظار النشر يجب أن يكون عددًا زوجيًا أكبر من أو يساوي 2.

إضافة حزمة اشتراك في خدمة

تعرض الأمثلة التالية ناشرًا تمت إضافته إلى حزمة BodyControl الخدمة:

package: "com.android.sdv.sample.vsidl"

service_bundle {
  name: "TirePressureMonitoring"

  publisher {
    message: "TirePressure"
    topic: "front-left"
    capacity: 10
  }
}

service_bundle {
  name: "BodyControl"

  subscriber {
    message: "com.android.sdv.sample.vsidl.TirePressure"
    topic: "front-left"
  }
}

المكان:

  • subscriber يشترك حِزم الخدمات في المواضيع.
  • message بنية البيانات أو نوع الرسالة المحدّد في بروتوكول المخزن المؤقت (ملف بالامتداد .protobuf).
  • topic معرّف فريد لموضوع المنشور. يجب أن يتطابق مع موضوع الناشر وأن يكون مكتوبًا بأحرف صغيرة مع استخدام شرطات.

تحديد البرامج العميلة والخوادم التي تستخدم الإجراء عن بُعد

توفّر عملية استدعاء الإجراء عن بُعد (RPC) استقلالية الموقع الجغرافي لعمليات استدعاء الدوال. في هذا النمط، تعمل القناة كنقطة التقاء محددة الاسم يلتقي فيها العميل والموفّر. من خلال استهداف القناة بدلاً من مثيل خدمة معيّن، يفصل إطار العمل بين الغرض من الأمر والموقع الجغرافي الفعلي للتنفيذ.

في المثال التالي، تستضيف حزمة الخدمة CabinComfort خادم ClimateControl، ويتم توسيع حزمة الخدمة BodyControl لاستضافة عميل ClimateControl:

package: "com.sdv.cc"

service_bundle {
  name: "CabinComfort"

  server {
    service: "ClimateControl"
    channel: "front-climate-control"
  }
}

service_bundle {
  name: "BodyControl"

  client {
    service: "ClimateControl"
    channel: "front-climate-control"
  }

  subscriber {
    message: "com.android.sdv.sample.vsidl.TirePressure"
    topic: "front-left"
  }
}

المكان:

  • يشير server إلى أنّ حزمة الخدمة تحتوي على خادم يوفّر بعض خدمات RPC (يتم تحديدها من خلال service على أنّها ClimateControl).
  • يشير client إلى أنّ حزمة الخدمة تحتوي على برنامج عميل يستدعي خدمة ClimateControl.
  • channel هو اسم قناة RPC. يجب أن يكون المعرّف مكتوبًا بأحرف صغيرة مع استخدام شرطات، وأن يكون فريدًا لكل خدمة.

يسمح هذا المثال لحزمة خدمة BodyControl بإجراء عمليات استدعاء إجراءات عن بُعد لحزمة خدمة CabinComfort من أجل التحكّم في مناخ المنطقة الأمامية من المقصورة.

الخطوات التالية

بعد تحديد البنية، أنشئ رمز البرامج الوسيطة.