প্রতিফলনের জন্য VSIDL প্রদানকারী

VSIDL প্রোভাইডার হলো লাইব্রেরি এবং টুলের একটি সেট যা সার্ভিস বান্ডেলগুলোকে SDV প্ল্যাটফর্ম এজেন্টদের (ডায়াগনস্টিকস, টেলিমেট্রি এবং SOME/IP) কাছে VSIDL-ঘোষিত মেটাডেটা সরবরাহ করতে সক্ষম করে।

বিশেষত, VSIDL প্রোভাইডার SDV এজেন্টদের নিম্নলিখিত মেটাডেটা আবিষ্কার করতে সক্ষম করে:

সার্ভিস বান্ডেল ডেভেলপারদের জন্য VSIDL প্রোভাইডার গাইড

VSIDL প্রোভাইডার লাইব্রেরি নিম্নলিখিত অপারেশনগুলো সম্পাদন করে।

  • দুটি নির্দিষ্ট স্থানে ফাইল সনাক্ত করে:
    • sdv_service_bundle_metadata-তে সংজ্ঞায়িত পাথগুলিতে থাকা এপেক্সগুলির মধ্যে।
    • স্ট্যাটিক পাথের ইমেজটিতে।
  • একই বা ভিন্ন ভিএম-এ অবস্থিত এজেন্টগুলিতে এপিআই কোয়েরি করার জন্য আরপিসি কল শুরু করে।

চিত্র ১. ভিএসআইডিএল প্রদানকারীর সংক্ষিপ্ত বিবরণ।

আপনি যদি একটি সার্ভিস বান্ডেল তৈরি করেন, তাহলে আপনার VSIDL প্রোভাইডার লাইব্রেরির খুঁটিনাটি জানার প্রয়োজন নেই। আপনি শুধু এই ধাপগুলো অনুসরণ করতে পারেন, যা VSIDL প্রোভাইডারকে রানটাইমে তার প্রয়োজনীয় ফাইলগুলো খুঁজে পেতে সক্ষম করে।

ক্যাটালগের জন্য রানটাইম কনফিগারেশন তৈরি করুন

তিন ধরনের ফাইলই (vsidl স্কিমা, ডায়াগনস্টিকস ডিক্লারেশন, someip ম্যাপিং) vsidl_rc_generator টুল থেকে তৈরি করা হয়।

vsidlc জন্য ব্যবহৃত প্যারামিটারগুলোর সাথে নিম্নলিখিত অতিরিক্ত প্যারামিটারগুলো ব্যবহার করে vsidl_rc_generator হোস্ট বাইনারি টুলটি ব্যবহার করুন:

  • --variant runtime-config-prebuilts
  • --filegroup সেই ফাইলগ্রুপের নাম নির্দিষ্ট করে, যেখানে ক্যাটালগের সমস্ত ফাইল ( Android.bp সহ) অন্তর্ভুক্ত থাকে।

তথ্যসূত্র হিসেবে, প্রাসঙ্গিক vsidlc প্যারামিটারগুলো নিম্নরূপ:

  • ক্যাটালগের রুট পাথ নির্দিষ্ট করতে --catalog-path করুন।
  • নির্ভরশীল ক্যাটালগগুলি নির্দিষ্ট করার জন্য --dependency-catalog-path
  • -- -path -সমস্ত জেনারেট করা genrule এবং prebuilt_etc টার্গেট সহ Android.bp ফাইলটি কোথায় লিখতে হবে তা নির্দিষ্ট করার পাথ।

জেনারেটরটি প্রাসঙ্গিক genrule এবং prebuilt_etc টার্গেটগুলো সহ একটি Android.bp ফাইল তৈরি করবে। Android.bp ফাইলে তৈরি হওয়া টার্গেট ব্লকগুলোর উপরে কমেন্ট থাকবে, যা তাদের নিজ নিজ টার্গেটের উদ্দিষ্ট ব্যবহার নির্দেশ করবে।

APEX-এর Android.bp আপডেট করুন।

তৈরি হওয়া Android.bp ফাইলের মন্তব্যগুলো থেকে যেমনটা বোঝা যায়, তা হলো:

// Usage: add the following line to ... declaration

আপনাকে এই টার্গেটগুলো (নির্দেশিত Usage কমেন্টের নিচে) Android.bp ফাইলে যোগ করতে হবে, যা Apex-কে সংজ্ঞায়িত করে:

apex {
    name: "some_apex_name",
    ...
    prebuilts: [
      // ADD THE prebuilt_etc TARGETS HERE
    ],
    ...

}

APEX-এর sdv_service_bundles_manifest.textproto আপডেট করুন

Apex-এর sdv_service_bundles_manifest.textproto ফাইলের sdv_service_bundle_metadata ব্লকগুলির মধ্যে, আপনাকে (শুধুমাত্র প্রযোজ্য পাথগুলির জন্য) সংজ্ঞায়িত করতে হবে:

sdv_service_bundle_metadata {
    ...
    vsidl_schemas_path: "etc/vsidl_provider/SomeFile-vsidl-config.binpb"
    diagnostics_config_path: "etc/vsidl_provider/SomeFile-diag-config.binpb"
    external_protocol_mapping_path: "etc/vsidl_provider/someip-config.binpb"
    ...
}

নিজের পাথ নির্ধারণ করবেন না। পরিবর্তে, তৈরি হওয়া Android.bp ফাইলের কমেন্টে দেখানো পাথগুলো কপি করুন, যা নিম্নরূপে পাওয়া যাবে:

// + vsidl_schemas_path:
// + diagnostics_config_path:
// + external_protocol_mapping_path:

এটি করার ফলে VSIDL প্রোভাইডার ইনস্ট্যান্সটি সংশ্লিষ্ট sdv_service_bundle_metadata এন্ট্রিগুলিতে নির্দিষ্ট করা পাথগুলি থেকে কোয়েরি করতে সক্ষম হয়।

ছবিতে টার্গেট যোগ করুন

তৈরি হওয়া Android.bp ফাইলগুলো এমন টার্গেটও তৈরি করে যা সরাসরি ইমেজে লোড করা যায়। কমেন্টগুলো থেকে সেই টার্গেটগুলোও জানা যায়, যেগুলো এইভাবে ব্যবহৃত হওয়ার কথা:

// Usage: add this target to the VM image.

জেনারেট করা prebuilt_etc টার্গেটটি, genrule s দিয়ে জেনারেট করা ফাইলগুলোকে ইমেজের একটি পূর্ব-নির্ধারিত স্থানে রাখবে। আপনাকে সংশ্লিষ্ট *.mk ফাইলগুলোতে (যেমন, device/google/sdv/sdv_core_base/sdv_samples_automotive_services.mk ) prebuilt_etc টার্গেটগুলো অন্তর্ভুক্ত করতে হবে।

প্ল্যাটফর্ম ডেভেলপারদের জন্য VSIDL প্রোভাইডার গাইড

সাধারণত, যদি আপনি এমন SDV এজেন্ট তৈরি করেন যার রিফ্লেকশন সক্ষমতা প্রয়োজন, তাহলে আপনি VSIDL প্রোভাইডার লাইব্রেরি ব্যবহার করতে পারেন।

VSIDL প্রোভাইডার লাইব্রেরি API-তে নিম্নলিখিত ফাংশনগুলো রয়েছে:

    async fn get_publication_descriptor(
        &self,
        source_fqin: &ServiceFqin,
        unit_type: &UnitType,
    ) -> SdvResult<PublicationDescriptor>;

    async fn get_rpc_method_descriptor(
        &self,
        source_fqin: &ServiceFqin,
        unit_type: &UnitType,
        method_name: &str,
    ) -> SdvResult<RpcMethodDescriptor>;

    async fn get_message_descriptor(
        &self,
        source_fqin: &ServiceFqin,
        message_name: &str,
    ) -> SdvResult<MessageDescriptor>;

    async fn get_someip_mappings(&self, source_fqin: &ServiceFqin)
        -> SdvResult<Vec<SomeIpMapping>>;

    async fn get_diagnostics_declaration(
        &self,
        fqin: &ServiceFqin,
    ) -> SdvResult<DiagnosticsDeclaration>;

    async fn subscribe_availability_change_by_vm(
        &self,
        vm_name: &str,
    ) -> SdvResult<AvailabilityStream>;

যেখানে

pub type AvailabilityStream = Pin<Box<dyn Stream<Item = AvailabilityChangeEvent> + Send>>;

সমস্ত ফাংশন একটি source_fqin প্যারামিটার ব্যবহার করে কোয়েরি করা হয়। এটি নিশ্চিত করে যে একই unit_type বা message_name ব্যবহার করে বিভিন্ন FQIN সঠিক ডেটা ফেরত দেয়। এই প্যারামিটারটি VSIDL প্রোভাইডার লাইব্রেরিকে সবচেয়ে নির্ভুল মেসেজ স্কিমা ধারণকারী নির্দিষ্ট APEX-এর দিকে নির্দেশ করে। এটি প্রয়োজনীয়, কারণ APEX-গুলো স্বাধীনভাবে আপডেট করা হয় এবং একই প্রোটোবাফ মেসেজ বা সার্ভিসের জন্য ভিন্ন ভিন্ন স্কিমা ব্যবহার করতে পারে।

get_message_descriptor ফাংশনের ব্যবহার

এটি এক্সটার্নাল ক্রেট থেকে শুধুমাত্র ` pub struct MessageDescriptor রিটার্ন করছে, যা রিফ্লেকশনের জন্য ব্যবহৃত হয়। ` MessageDescriptor হলো এক ধরনের মেটাডেটা যা রিফ্লেকশনের সুযোগ করে দেয় এবং রানটাইমে প্রোটোবাফ মেসেজের ডাইনামিক পরিদর্শন ও ম্যানিপুলেশন সক্ষম করে।

get_publication_descriptor ফাংশনের ব্যবহার

এই ফাংশনটি একটি PublicationDescriptor রিটার্ন করে, যা হলো:

pub struct PublicationDescriptor {
    /// Message descriptor for publication.
    pub message_descriptor: MessageDescriptor,

    /// Information about the size of the publication message.
    pub size_metadata: SizeMetadata,
}

size_metadata ফিল্ডটিতে একটি পাবলিকেশনের মেসেজের আকার এবং সীমাবদ্ধতা সম্পর্কিত তথ্য থাকে। এই মেটাডেটা VSIDL কনফিগারেশন থেকে নেওয়া হয়।

pub struct SizeMetadata {
    /// Message size in bytes.
    pub message_size: u32,

    /// Message count.
    pub message_count: u32,

    /// VSIDL-declared size constraints for the message fields.
    pub field_size_constraints: HashMap<String, FieldSizeConstraint>,
}

pub struct FieldSizeConstraint {
    /// Max number of repeated fields allowed for the field.
    pub repeated_max_count: Option<u32>,

    /// Max size of variable sized types (string, bytes) in bytes.
    pub variable_type_max_size: Option<u32>,
}

get_rpc_method_descriptor ফাংশনের ব্যবহার

এই ফাংশনটি একটি RpcMethodDescriptor রিটার্ন করে, যা হলো:

pub struct RpcMethodDescriptor {
    /// Message descriptor for RPC request.
    pub request_message: Option<MessageDescriptor>,

    /// Message descriptor for RPC response.
    pub response_message: Option<MessageDescriptor>,
}

এই স্ট্রাকচারটি RPC মেথডের অনুরোধ এবং প্রতিক্রিয়া উভয় বার্তার জন্য MessageDescriptor ধারণ করে।

get_someip_mappings ফাংশনের ব্যবহার

এটি স্থানীয় SOME/IP পরিষেবা ম্যাপিং পুনরুদ্ধার করার একটি ফাংশন, যা core_services/vsidl/protos/sdv/someip/v1/someip.proto তে সংজ্ঞায়িত করা আছে।

get_diagnostics_declaration ফাংশনের ব্যবহার

এটি ডায়াগনস্টিকস ডিক্লারেশনগুলো পুনরুদ্ধার করার একটি ফাংশন, যা core_services/vsidl/protos/sdv/diagnostics/v1/diagnostics_syntax.proto তে সংজ্ঞায়িত করা আছে।

subscribe_availability_change_by_vm ফাংশনের ব্যবহার

এই ফাংশনটি একটি নির্দিষ্ট ভার্চুয়াল মেশিনের জন্য একটি অ্যাভেইলেবিলিটি স্ট্রিম রিটার্ন করে, যা একটি গুরুত্বপূর্ণ ফলব্যাক মেকানিজম হিসেবে কাজ করে। যখন স্ট্যান্ডার্ড VSIDL প্রোভাইডার API কলগুলো SdvStatusCode::Unavailable এরর দিয়ে ব্যর্থ হয়, তখন এটি ব্যবহার করুন, যা সিস্টেমকে VSIDL প্রোভাইডার ইন্টারফেসটি পুনরায় অনলাইন হওয়ার জন্য দক্ষতার সাথে অপেক্ষা করার সুযোগ দেয়।

এই ফাংশনের প্রধান বৈশিষ্ট্যগুলো হলো:

  • তাৎক্ষণিক নির্গমন: সাবস্ক্রিপশন করার পর, স্ট্রিমটি টার্গেট ভার্চুয়াল মেশিনের বর্তমান প্রাপ্যতা স্থিতি নির্গত করে।
  • আচরণগত সমতা: ফলস্বরূপ স্ট্রিমটি ServiceDiscoveryManager দ্বারা ব্যবহৃত subscribe_service_unit_change_by_name ফাংশনের অনুরূপ আচরণ করে।

ভিএসআইডিএল প্রদানকারী এজেন্ট

প্রতিটি ভিএম তার নিজস্ব VSIDL প্রোভাইডার এজেন্ট চালায়, যা মূলত একটি RPC সার্ভার এবং এটি এজেন্টের ভেতরের লাইব্রেরির লোকাল ইনস্ট্যান্সের VSIDL প্রোভাইডার API-এর মাধ্যমে অনুরোধ ফরওয়ার্ড করে। এই এজেন্টটি অন্য একটি ভিএম-এর VSIDL প্রোভাইডারকে কোয়েরি করতে ব্যবহৃত হয়; অর্থাৎ, একটি ভিএম-এর কোনো সার্ভিস এই এজেন্ট ব্যবহার করে অন্য একটি ভিএম থেকে VSIDL মেটাডেটা কোয়েরি করতে পারে।

কোডবেসে এপিআই-এর ব্যবহার

SOMEIP:

  • get_publication_descriptor (স্ট্রাক্টের সমস্ত ফিল্ড ব্যবহৃত হয়)
  • get_rpc_method_descriptor (স্ট্রাক্টের সমস্ত ফিল্ড ব্যবহৃত হয়)
  • get_someip_mappings

টেলিমেট্রি:

  • get_publication_descriptor (শুধুমাত্র message_descriptor ফিল্ডটি ব্যবহৃত হয়)
  • get_rpc_method_descriptor (স্ট্রাক্টের সমস্ত ফিল্ড ব্যবহৃত হয়)

রোগ নির্ণয়:

  • get_message_descriptor
  • get_diagnostics_declaration

বিভিন্ন ডেটা উৎস এবং উৎসের অগ্রাধিকার সহ বিভিন্ন ফ্লেভারগুলো core_services/vsidl/provider/src/vsidl_provider.rs ফাইলে পাওয়া যাবে।

vsidl_provider ক্রেটটি বিভিন্ন SDV এজেন্টের জন্য উপযোগী প্রোভাইডার ইনস্ট্যান্স তৈরি করতে বেশ কিছু পাবলিক ফাংশন প্রদান করে। প্রতিটি কনফিগারেশন VSIDL-সম্পর্কিত ডেটা রিজলভ করার জন্য ডেটা সোর্সের একটি অনন্য শৃঙ্খল নির্দিষ্ট করে। সারণিটিতে প্রতিটি কনস্ট্রাক্টর ফাংশনের আচরণ বর্ণনা করা হয়েছে:

কনস্ট্রাক্টর ফাংশন ডেটা টাইপ ডেটা উৎস অনুসন্ধান (এবং ক্রম)
new_for_vsidl_provider_agent SomeIp শীর্ষবিন্দু
Diagnostics শীর্ষবিন্দু
VsidlSchemas APEX, ফাইল
new_for_diagnostics_agent Diagnostics এজেন্ট (রিমোট), এপেক্স
VsidlSchemas ফাইল
new_for_someip_broker_agent SomeIp শীর্ষবিন্দু
VsidlSchemas ফাইল
new_for_telemetry_agent VsidlSchemas এজেন্ট (দূরবর্তী এবং স্থানীয়)
new_for_integration_test SomeIp এজেন্ট (দূরবর্তী এবং স্থানীয়)
Diagnostics এজেন্ট (দূরবর্তী এবং স্থানীয়)
VsidlSchemas এজেন্ট (দূরবর্তী এবং স্থানীয়)

সারণিটির ডেটা উৎসগুলো চিত্র ১- এ প্রদর্শিত কলগুলোকে নির্দেশ করে।