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:
- VSIDL kataloğunda kullanılan mesajların ve hizmetlerin protobuf tanımlayıcıları
- SOME/IP eşlemeleri
- Hizmet Paketlerinin teşhis bildirimleri
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.
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.bpdahil) 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-pathkataloğun kök yolunu belirtmek için kullanılır.--dependency-catalog-pathile bağımlı katalogları belirtebilirsiniz.-- -path, oluşturulan tümgenruleveprebuilt_etchedefleriyle birlikteAndroid.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ış,
ServiceDiscoveryManagertarafından kullanılansubscribe_service_unit_change_by_nameiş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ızcamessage_descriptoralanı kullanılır)get_rpc_method_descriptor(tüm yapı alanları kullanılır)
Teşhis:
get_message_descriptorget_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şlevi | Veri türü | Veri kaynağı arama (ve sıralama) |
|---|---|---|
new_for_vsidl_provider_agent |
SomeIp | APEXes |
Diagnostics | APEXes | |
VsidlSchemas | APEX'ler, dosyalar | |
new_for_diagnostics_agent | Diagnostics | Agent (remote), APEXes |
VsidlSchemas | Dosyalar | |
new_for_someip_broker_agent |
SomeIp | APEXes |
VsidlSchemas | Dosyalar | |
new_for_telemetry_agent | VsidlSchemas | Temsilci (uzak ve yerel) |
new_for_integration_test |
SomeIp | Temsilci (uzak ve yerel) |
Diagnostics | Temsilci (uzak ve yerel) | |
VsidlSchemas | Temsilci (uzak ve yerel) |
Tablonun veri kaynakları, Şekil 1'deki çağrıları ifade eder.