ผู้ให้บริการ VSIDL คือชุดไลบรารีและเครื่องมือที่ช่วยให้แพ็กเกจบริการ ระบุข้อมูลเมตาที่ประกาศ VSIDL ให้กับตัวแทนแพลตฟอร์ม SDV (การวินิจฉัย การวัดและส่งข้อมูล และ SOME/IP)
โดยเฉพาะอย่างยิ่ง ผู้ให้บริการ VSIDL จะช่วยให้ตัวแทน SDV ค้นพบข้อมูลเมตาดังต่อไปนี้
- ตัวอธิบาย Protobuf ของข้อความและบริการที่ใช้ในแคตตาล็อก VSIDL
- การแมป SOME/IP
- การประกาศการวินิจฉัยของแพ็กเกจบริการ
คู่มือผู้ให้บริการ VSIDL สำหรับนักพัฒนาแพ็กเกจบริการ
ไลบรารีผู้ให้บริการ VSIDL จะดำเนินการต่อไปนี้
- ค้นหาไฟล์ใน 2 ตำแหน่งที่เฉพาะเจาะจง ดังนี้
- ภายใน Apex ในเส้นทางที่กำหนดไว้ใน sdv_service_bundle_metadata
- ในรูปภาพในเส้นทางแบบคงที่
- เริ่มการเรียก RPC เพื่อค้นหา API ในเอเจนต์ที่อยู่ใน VM เดียวกันหรือต่างกัน
หากคุณกำลังพัฒนาแพ็กเกจบริการ คุณไม่จำเป็นต้องทราบรายละเอียดของ ไลบรารีผู้ให้บริการ VSIDL คุณเพียงแค่ทำตามขั้นตอนเหล่านี้ ซึ่งจะช่วยให้ ผู้ให้บริการ VSIDL ค้นหาไฟล์ที่ต้องการได้ในขณะรันไทม์
สร้างการกำหนดค่ารันไทม์สำหรับแคตตาล็อก
ไฟล์ทั้ง 3 ประเภท (สคีมา VSIDL, การประกาศการวินิจฉัย, การแมป SOMEIP
) สร้างขึ้นจากเครื่องมือ vsidl_rc_generator
ใช้vsidl_rc_generatorเครื่องมือไบนารีของโฮสต์ที่มีพารามิเตอร์เดียวกันกับที่ใช้สำหรับ vsidlc และพารามิเตอร์เพิ่มเติมต่อไปนี้
--variant runtime-config-prebuilts--filegroupเพื่อระบุชื่อเป้าหมายของกลุ่มไฟล์ที่มีไฟล์ทั้งหมด ของแคตตาล็อก (รวมถึงAndroid.bp)
vsidlcพารามิเตอร์ที่เกี่ยวข้องมีดังนี้
--catalog-pathเพื่อระบุเส้นทางรูทของแคตตาล็อก--dependency-catalog-pathเพื่อระบุแคตตาล็อกที่ขึ้นต่อกัน-- -pathเพื่อระบุตำแหน่งที่จะเขียนAndroid.bpพร้อมเป้าหมายที่สร้างขึ้นทั้งหมดgenruleและprebuilt_etc
เครื่องมือสร้างจะสร้างไฟล์ Android.bp ที่มีเป้าหมาย genrule และ
prebuilt_etc ที่เกี่ยวข้อง นอกจากบล็อกเป้าหมายที่สร้างขึ้นใน Android.bp
แล้ว ยังมีความคิดเห็นที่ระบุการใช้งานที่ต้องการของเป้าหมายที่เกี่ยวข้อง
ด้วย
อัปเดต Android.bp ของ APEX
ดังที่ระบุไว้ในความคิดเห็นของไฟล์ 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
],
...
}
อัปเดต sdv_service_bundles_manifest.textproto ของ APEX
ภายในบล็อก sdv_service_bundle_metadata ของไฟล์
sdv_service_bundles_manifest.textproto ของ Apex คุณต้องกำหนด (เฉพาะเส้นทางที่เกี่ยวข้องเท่านั้น) ดังนี้
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เป้าหมายที่สร้างขึ้นจะวางไฟล์ที่สร้างด้วย
genrules ในตำแหน่งที่กำหนดไว้ล่วงหน้าบนรูปภาพ คุณต้องระบุเป้าหมาย prebuilt_etc ในไฟล์ *.mk ที่เกี่ยวข้อง (เช่น
device/google/sdv/sdv_core_base/sdv_samples_automotive_services.mk)
คำแนะนำสำหรับผู้ให้บริการ VSIDL สำหรับนักพัฒนาแพลตฟอร์ม
โดยทั่วไป หากคุณกำลังพัฒนา SDV Agent ที่ต้องมีความสามารถในการสะท้อน คุณสามารถใช้ไลบรารีผู้ให้บริการ VSIDL ได้
API ไลบรารีผู้ให้บริการ VSIDL มีฟังก์ชันต่อไปนี้
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 ซึ่งจะช่วยให้ FQIN ที่แตกต่างกันซึ่งใช้ unit_type หรือ message_name เดียวกันแสดงข้อมูลที่ถูกต้อง พารามิเตอร์จะนำไลบรารีผู้ให้บริการ VSIDL ไปยัง APEX
ที่มีสคีมาข้อความที่ถูกต้องที่สุด การดำเนินการนี้จำเป็นเนื่องจาก APEX
ได้รับการอัปเดตแยกกันและอาจใช้สคีมาที่แตกต่างกันสำหรับข้อความหรือบริการ Protobuf เดียวกัน
การใช้ฟังก์ชัน get_message_descriptor
ซึ่งจะแสดงเฉพาะ pub struct MessageDescriptor จาก
Crate ภายนอกที่ใช้สำหรับการรีเฟลกชัน MessageDescriptor คือข้อมูลเมตา
ที่ช่วยให้เกิดการสะท้อน ซึ่งช่วยให้ตรวจสอบและจัดการข้อความ Protobuf แบบไดนามิกได้
ในขณะรันไทม์
การใช้ฟังก์ชัน 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>,
}
โครงสร้างนี้มี MessageDescriptor สำหรับทั้งข้อความคำขอและการตอบกลับ
ของเมธอด RPC
การใช้งานฟังก์ชัน 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
ฟังก์ชันนี้จะแสดงผลสตรีมความพร้อมใช้งานสำหรับเครื่องเสมือนที่ระบุ
ซึ่งทำหน้าที่เป็นกลไกการทำงานสำรองที่สำคัญ ใช้เมื่อการเรียก API ของผู้ให้บริการ VSIDL มาตรฐานไม่สำเร็จโดยมีSdvStatusCode::Unavailableข้อผิดพลาด
เพื่อให้ระบบรออินเทอร์เฟซของผู้ให้บริการ VSIDL กลับมา
ออนไลน์ได้อย่างมีประสิทธิภาพ
ลักษณะการทำงานที่สำคัญของฟังก์ชันนี้มีดังนี้
- การปล่อยข้อมูลทันที: เมื่อสมัครใช้บริการ สตรีมจะปล่อยข้อมูล สถานะความพร้อมใช้งานปัจจุบันของเครื่องเสมือนเป้าหมาย
- ความเท่าเทียมกันของลักษณะการทำงาน: สตรีมที่ได้จะมีลักษณะการทำงานเหมือนกับฟังก์ชัน
subscribe_service_unit_change_by_nameที่ใช้โดยServiceDiscoveryManager
ตัวแทนผู้ให้บริการ VSIDL
VM ทุกเครื่องจะเรียกใช้เอเจนต์ผู้ให้บริการ VSIDL ของตัวเอง ซึ่งเป็นเซิร์ฟเวอร์ RPC ที่ส่งต่อคำขอใน VSIDL Provider API (ของอินสแตนซ์ในเครื่องของ ไลบรารีภายในเอเจนต์) โดยใช้ Agent เพื่อค้นหาผู้ให้บริการ VSIDL ใน VM อื่น กล่าวคือ บริการใน VM หนึ่งสามารถค้นหาข้อมูลเมตาของ VSIDL จาก VM อื่น ได้โดยใช้ Agent นี้
การใช้งาน API ในฐานของโค้ด
SOMEIP:
get_publication_descriptor(ใช้ฟิลด์ struct ทั้งหมด)get_rpc_method_descriptor(ใช้ฟิลด์ struct ทั้งหมด)get_someip_mappings
การวัดและส่งข้อมูลทางไกล:
get_publication_descriptor(ใช้เฉพาะฟิลด์message_descriptor)get_rpc_method_descriptor(ใช้ฟิลด์ struct ทั้งหมด)
การวินิจฉัย:
get_message_descriptorget_diagnostics_declaration
คุณดูรสชาติที่หลากหลายพร้อมแหล่งข้อมูลและลำดับความสำคัญของแหล่งข้อมูลต่างๆ ได้ใน core_services/vsidl/provider/src/vsidl_provider.rs
Crate vsidl_provider มีฟังก์ชันสาธารณะหลายอย่างเพื่อสร้างอินสแตนซ์ของ Provider
ที่ปรับแต่งมาสำหรับเอเจนต์ SDV ต่างๆ การกำหนดค่าแต่ละรายการจะระบุห่วงโซ่แหล่งข้อมูลที่ไม่ซ้ำกันเพื่อแก้ไขข้อมูลที่เกี่ยวข้องกับ VSIDL ตารางนี้สรุป
ลักษณะการทำงานของฟังก์ชันตัวสร้างแต่ละรายการ
| ฟังก์ชันตัวสร้าง | ประเภทข้อมูล | การค้นหา (และลำดับ) แหล่งข้อมูล |
|---|---|---|
new_for_vsidl_provider_agent |
SomeIp | APEXes |
Diagnostics | APEXes | |
VsidlSchemas | APEX, ไฟล์ | |
new_for_diagnostics_agent | Diagnostics | Agent (ระยะไกล), APEX |
VsidlSchemas | ไฟล์ | |
new_for_someip_broker_agent |
SomeIp | APEXes |
VsidlSchemas | ไฟล์ | |
new_for_telemetry_agent | VsidlSchemas | ตัวแทน (ระยะไกลและในพื้นที่) |
new_for_integration_test |
SomeIp | ตัวแทน (ระยะไกลและในพื้นที่) |
Diagnostics | ตัวแทน (ระยะไกลและในพื้นที่) | |
VsidlSchemas | ตัวแทน (ระยะไกลและในพื้นที่) |
แหล่งข้อมูลของตารางอ้างอิงถึงการเรียกใช้ในรูปที่ 1