Yansıtma için VSIDL sağlayıcı

VSIDL Sağlayıcı, hizmet paketlerinin SDV platformu aracılarına (Diagnostics, Telemetry ve SOME/IP) VSIDL ile beyan edilmiş meta veriler sağlamasına olanak tanıyan bir kitaplık ve araç setidir.

VSIDL sağlayıcı, özellikle SDV aracıların aşağıdaki meta verileri keşfetmesini sağlar:

Hizmet paketi geliştiricileri için VSIDL sağlayıcı kılavuzu

VSIDL Sağlayıcı kitaplığı aşağıdaki işlemleri gerçekleştirir.

  • Dosyaları iki belirli yerde bulur:
    • sdv_service_bundle_metadata içinde tanımlanan yollardaki Apex'ler.
    • Statik yollardaki resimde.
  • Aynı veya farklı sanal makinelerde bulunan aracılarda API'yi sorgulamak için RPC çağrıları başlatır.

Şekil 1.VSIDL Sağlayıcıya Genel Bakış.

Hizmet paketi geliştiriyorsanız VSIDL Provider kitaplığının ayrıntılarını bilmeniz gerekmez. VSIDL Provider'ın, çalışma zamanında ihtiyaç duyduğu dosyaları bulmasını sağlayan bu adımları uygulamanız yeterlidir.

Katalog için çalışma zamanı yapılandırmaları oluşturma

Üç dosya türünün (vsidl şemaları, teşhis bildirimleri, someip eşlemeleri) tümü vsidl_rc_generator aracından oluşturulur.

vsidl_rc_generator ana makine ikili program aracını vsidlc için kullanılan parametrelerle aynı parametreleri ve aşağıdaki ek parametreleri kullanarak kullanın:

  • --variant runtime-config-prebuilts
  • Katalogdaki tüm dosyaları (Android.bp dahil) içeren dosya grubu hedef adını belirtmek için --filegroup.

Referans olması açısından, ilgili vsidlc parametreleri aşağıda verilmiştir:

  • --catalog-path kataloğun kök yolunu belirtmek için kullanılır.
  • --dependency-catalog-path ile bağımlı katalogları belirtebilirsiniz.
  • -- -path, oluşturulan tüm genrule ve prebuilt_etc hedefleriyle birlikte Android.bp öğesinin nereye yazılacağını belirtmek için kullanılır.

Oluşturucu, alakalı genrule ve prebuilt_etc hedefleri içeren bir Android.bp dosyası oluşturur. Android.bp içinde oluşturulan hedef blokların üzerinde, ilgili hedeflerin amaçlanan kullanımını belirten yorumlar yer alır.

APEX'in Android.bp dosyasını güncelleme

Oluşturulan Android.bp dosyasının yorumlarında belirtildiği gibi:

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

Bu hedefleri (belirtilen Usage yorumlarının altına) Apex'i tanımlayan Android.bp öğesine eklemeniz gerekir:

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

}

APEX'in sdv_service_bundles_manifest.textproto dosyasını güncelleyin

Apex'in sdv_service_bundle_metadata bloklarında, sdv_service_bundles_manifest.textproto dosyalarında (yalnızca geçerli yollar için) şunları tanımlamanız gerekir:

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"
    ...
}

Kendi yollarınızı tanımlamayın. Bunun yerine, oluşturulan Android.bp dosyasının yorumlarında gösterilen yolları kopyalayın. Bu yollar şu şekilde bulunur:

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

Bu işlem, VSIDL Sağlayıcı örneğinin ilgili sdv_service_bundle_metadata girişlerinde belirtilen yollardan sorgu göndermesini sağlar.

Resme Hedef Ekleme

Oluşturulan Android.bp dosyaları, doğrudan görüntüye yüklenebilen hedefler de oluşturur. Yorumlarda, bu şekilde kullanılması gereken hedefler de belirtilir:

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

Oluşturulan prebuilt_etc hedefi, genrule ile oluşturulan dosyaları resimde önceden belirtilmiş bir konuma yerleştirir. prebuilt_etc hedeflerini ilgili *.mk dosyalarına (örneğin, device/google/sdv/sdv_core_base/sdv_samples_automotive_services.mk gibi) eklemeniz gerekir.

Platform Geliştiricileri İçin VSIDL Sağlayıcı Kılavuzu

Genel olarak, yansıtma özellikleri gerektiren bir SDV aracısı geliştiriyorsanız VSIDL sağlayıcı kitaplığını kullanabilirsiniz.

VSIDL Sağlayıcı kitaplığı API'si aşağıdaki işlevleri içerir:

    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>;

nerede

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

Tüm işlevler, source_fqin parametresi kullanılarak sorgulanır. Bu, aynı unit_type veya message_name değerini kullanan farklı FQIN'lerin doğru verileri döndürmesini sağlar. Bu parametre, VSIDL sağlayıcı kitaplığını en doğru mesaj şemasını içeren belirli bir APEX'e yönlendirir. APEX'ler bağımsız olarak güncellendiği ve aynı protobuf mesajı veya hizmeti için farklı şemalar kullanabildiği için bu gereklidir.

get_message_descriptor işlevinin kullanımı

Bu, yansıtma için kullanılan harici paketten yalnızca pub struct MessageDescriptor değerini döndürür. MessageDescriptor, yansıtma işlemine olanak tanıyan bir meta veri parçasıdır. Bu sayede, çalışma zamanında protobuf mesajlarının dinamik olarak incelenmesi ve değiştirilmesi sağlanır.

get_publication_descriptor işlevinin kullanımı

Bu işlev, aşağıdakileri içeren bir PublicationDescriptor döndürür:

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 alanı, yayın iletisinin boyutu ve kısıtlamalarıyla ilgili bilgileri içerir. Bu meta veriler, VSIDL yapılandırmasından türetilir.

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 işlevinin kullanımı

Bu işlev, aşağıdakileri içeren bir RpcMethodDescriptor döndürür:

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

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

Bu yapı, RPC yönteminin hem istek hem de yanıt mesajları için MessageDescriptor değerini tutar.

get_someip_mappings işlevinin kullanımı

Bu, core_services/vsidl/protos/sdv/someip/v1/someip.proto içinde tanımlanan yerel SOME/IP hizmet eşlemelerini almak için kullanılan bir işlevdir.

get_diagnostics_declaration işlevinin kullanımı

Bu, core_services/vsidl/protos/sdv/diagnostics/v1/diagnostics_syntax.proto içinde tanımlanan teşhis bildirimlerini almak için kullanılan bir işlevdir.

subscribe_availability_change_by_vm işlevinin kullanımı

Bu işlev, belirtilen sanal makine için kullanılabilirlik akışı döndürür ve kritik bir yedek mekanizma olarak işlev görür. Standart VSIDL Provider API çağrıları SdvStatusCode::Unavailable hatasıyla başarısız olduğunda bu API'yi kullanarak sistemin VSIDL sağlayıcı arayüzünün tekrar çevrimiçi olmasını verimli bir şekilde beklemesini sağlayabilirsiniz.

Bu işlevin temel davranışları şunlardır:

  • Anında yayın: Akış, abonelikten sonra hedef sanal makinenin mevcut kullanılabilirlik durumunu yayınlar.
  • Davranışsal eşitlik: Ortaya çıkan akış, ServiceDiscoveryManager tarafından kullanılan subscribe_service_unit_change_by_name işleviyle aynı şekilde davranır.

VSIDL Provider Agent

Her sanal makine kendi VSIDL Sağlayıcı aracısını çalıştırır. Bu aracı, VSIDL Sağlayıcı API'sindeki (aracı içindeki kitaplığın yerel bir örneği) istekleri yönlendiren bir RPC sunucusudur. Aracı, farklı bir sanal makinedeki VSIDL sağlayıcısına sorgu göndermek için kullanılır. Yani bir sanal makinedeki hizmet, bu aracı kullanarak başka bir sanal makineden VSIDL meta verilerini sorgulayabilir.

API'nin kod tabanında kullanımı

SOMEIP:

  • get_publication_descriptor (tüm yapı alanları kullanılır)
  • get_rpc_method_descriptor (tüm yapı alanları kullanılır)
  • get_someip_mappings

Telemetri:

  • get_publication_descriptor (yalnızca message_descriptor alanı kullanılır)
  • get_rpc_method_descriptor (tüm yapı alanları kullanılır)

Teşhis:

  • get_message_descriptor
  • get_diagnostics_declaration

Çeşitli veri kaynakları ve kaynak önceliklerine sahip farklı sürümleri core_services/vsidl/provider/src/vsidl_provider.rs bölümünde bulabilirsiniz.

vsidl_provider sandığı, farklı SDV aracılarına göre uyarlanmış sağlayıcı örnekleri oluşturmak için çeşitli genel işlevler sunar. Her yapılandırma, VSIDL ile ilgili verileri çözmek için benzersiz bir veri kaynağı zinciri belirtir. Tabloda her oluşturucu işlevinin davranışı özetlenmektedir:

Oluşturucu işleviVeri türüVeri kaynağı arama (ve sıralama)
new_for_vsidl_provider_agent SomeIpAPEXes
DiagnosticsAPEXes
VsidlSchemasAPEX'ler, dosyalar
new_for_diagnostics_agentDiagnosticsAgent (remote), APEXes
VsidlSchemasDosyalar
new_for_someip_broker_agent SomeIpAPEXes
VsidlSchemasDosyalar
new_for_telemetry_agentVsidlSchemasTemsilci (uzak ve yerel)
new_for_integration_test SomeIpTemsilci (uzak ve yerel)
DiagnosticsTemsilci (uzak ve yerel)
VsidlSchemasTemsilci (uzak ve yerel)

Tablonun veri kaynakları, Şekil 1'deki çağrıları ifade eder.