Nhà cung cấp VSIDL là một tập hợp các thư viện và công cụ cho phép các gói dịch vụ cung cấp siêu dữ liệu được khai báo bằng VSIDL cho các tác nhân nền tảng SDV (Chẩn đoán, Telemetry và SOME/IP).
Cụ thể, nhà cung cấp VSIDL cho phép các Tác nhân SDV khám phá siêu dữ liệu sau:
- các bộ mô tả protobuf của thông báo và dịch vụ được dùng trong danh mục VSIDL
- các ánh xạ SOME/IP
- các khai báo chẩn đoán của Gói dịch vụ
Hướng dẫn về Nhà cung cấp VSIDL dành cho nhà phát triển gói dịch vụ
Thư viện Nhà cung cấp VSIDL thực hiện các thao tác sau.
- Tìm tệp ở hai vị trí cụ thể:
- Trong Apexes ở các đường dẫn được xác định trong sdv_service_bundle_metadata.
- Trên hình ảnh ở các đường dẫn tĩnh.
- Khởi tạo các lệnh gọi RPC để truy vấn API trên các tác nhân nằm trên cùng một hoặc các VM khác nhau.
Nếu đang phát triển một gói dịch vụ, bạn không cần phải biết thông tin cụ thể về thư viện Nhà cung cấp VSIDL. Bạn chỉ cần làm theo các bước này để cho phép Nhà cung cấp VSIDL tìm các tệp cần thiết trong thời gian chạy.
Tạo cấu hình thời gian chạy cho danh mục
Tất cả 3 loại tệp (lược đồ vsidl, khai báo chẩn đoán, ánh xạ someip) đều được tạo từ công cụ vsidl_rc_generator.
Sử dụng công cụ tệp nhị phân máy chủ vsidl_rc_generator với các tham số giống như tham số dùng cho vsidlc và các tham số bổ sung sau:
--variant runtime-config-prebuilts--filegroupđể chỉ định tên mục tiêu nhóm tệp chứa tất cả các tệp của danh mục (bao gồm cảAndroid.bp).
Để tham khảo, các tham số vsidlc có liên quan là:
--catalog-pathđể chỉ định đường dẫn gốc của danh mục.--dependency-catalog-pathđể chỉ định các danh mục phụ thuộc.-- -pathđể chỉ định vị trí ghiAndroid.bpvới tất cả các mục tiêugenrulevàprebuilt_etcđã tạo.
Trình tạo sẽ tạo một tệp Android.bp với các mục tiêu genrule và prebuilt_etc có liên quan. Ở đầu các khối mục tiêu đã tạo trong Android.bp, sẽ có các nhận xét cho biết mục đích sử dụng của các mục tiêu tương ứng.
Cập nhật Android.bp của APEX
Như được chỉ ra trong các nhận xét của tệp Android.bp đã tạo, hãy đọc:
// Usage: add the following line to ... declaration
Bạn nên thêm các mục tiêu này (bên dưới các nhận xét Usage được chỉ định) vào Android.bp xác định Apex:
apex {
name: "some_apex_name",
...
prebuilts: [
// ADD THE prebuilt_etc TARGETS HERE
],
...
}
Cập nhật sdv_service_bundles_manifest.textproto của APEX
Trong các khối sdv_service_bundle_metadata của tệp
sdv_service_bundles_manifest.textproto của Apex, bạn cần xác định (chỉ dành cho các đường dẫn áp dụng):
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"
...
}
Đừng xác định đường dẫn của riêng bạn. Thay vào đó, hãy sao chép các đường dẫn xuất hiện trong nhận xét của tệp Android.bp đã tạo, được tìm thấy dưới dạng:
// + vsidl_schemas_path:
// + diagnostics_config_path:
// + external_protocol_mapping_path:
Việc này cho phép thực thể Nhà cung cấp VSIDL truy vấn từ các đường dẫn được chỉ định bởi trong các mục sdv_service_bundle_metadata tương ứng.
Thêm mục tiêu vào hình ảnh
Các tệp Android.bp đã tạo cũng tạo các mục tiêu có thể được tải trực tiếp trên hình ảnh. Các nhận xét cũng cho biết các mục tiêu cần được sử dụng theo cách này, bằng cách:
// Usage: add this target to the VM image.
Mục tiêu prebuilt_etc đã tạo sẽ đặt các tệp được tạo bằng genrule ở một vị trí được chỉ định trước trên hình ảnh. Bạn cần đưa các mục tiêu prebuilt_etc vào các tệp *.mk tương ứng (ví dụ: device/google/sdv/sdv_core_base/sdv_samples_automotive_services.mk).
Hướng dẫn về Nhà cung cấp VSIDL dành cho nhà phát triển nền tảng
Nói chung, nếu đang phát triển Tác nhân SDV cần có các khả năng phản ánh, bạn có thể sử dụng thư viện nhà cung cấp VSIDL.
API thư viện Nhà cung cấp VSIDL chứa các hàm sau:
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>;
địa điểm
pub type AvailabilityStream = Pin<Box<dyn Stream<Item = AvailabilityChangeEvent> + Send>>;
Tất cả các hàm đều được truy vấn bằng tham số source_fqin. Điều này đảm bảo rằng các FQIN khác nhau sử dụng cùng một unit_type hoặc message_name sẽ trả về dữ liệu chính xác. Tham số này hướng thư viện nhà cung cấp VSIDL đến APEX cụ thể chứa lược đồ thông báo chính xác nhất. Điều này là cần thiết vì các APEX được cập nhật độc lập và có thể sử dụng các lược đồ khác nhau cho cùng một thông báo hoặc dịch vụ protobuf.
Cách sử dụng hàm get_message_descriptor
Hàm này chỉ trả về pub struct MessageDescriptor từ thùng bên ngoài được dùng để phản ánh. MessageDescriptor là một phần siêu dữ liệu cho phép phản ánh, cho phép kiểm tra và thao tác động các thông báo protobuf trong thời gian chạy.
Cách sử dụng hàm get_publication_descriptor
Hàm này trả về PublicationDescriptor, là:
pub struct PublicationDescriptor {
/// Message descriptor for publication.
pub message_descriptor: MessageDescriptor,
/// Information about the size of the publication message.
pub size_metadata: SizeMetadata,
}
Trường size_metadata chứa thông tin về kích thước và các ràng buộc của thông báo về ấn phẩm. Siêu dữ liệu này được lấy từ cấu hình 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>,
}
Cách sử dụng hàm get_rpc_method_descriptor
Hàm này trả về RpcMethodDescriptor, là:
pub struct RpcMethodDescriptor {
/// Message descriptor for RPC request.
pub request_message: Option<MessageDescriptor>,
/// Message descriptor for RPC response.
pub response_message: Option<MessageDescriptor>,
}
Cấu trúc này giữ MessageDescriptor cho cả thông báo yêu cầu và thông báo phản hồi của phương thức RPC.
Cách sử dụng hàm get_someip_mappings
Đây là hàm để truy xuất các ánh xạ dịch vụ SOME/IP cục bộ, được xác định trong core_services/vsidl/protos/sdv/someip/v1/someip.proto.
Cách sử dụng hàm get_diagnostics_declaration
Đây là hàm để truy xuất các khai báo chẩn đoán, được xác định trong
core_services/vsidl/protos/sdv/diagnostics/v1/diagnostics_syntax.proto
Cách sử dụng hàm subscribe_availability_change_by_vm
Hàm này trả về một luồng trạng thái có sẵn cho một máy ảo được chỉ định, đóng vai trò là cơ chế dự phòng quan trọng. Hãy sử dụng hàm này khi các lệnh gọi API Nhà cung cấp VSIDL tiêu chuẩn không thành công với lỗi SdvStatusCode::Unavailable, cho phép hệ thống đợi hiệu quả để giao diện nhà cung cấp VSIDL quay lại trạng thái trực tuyến.
Các hành vi chính của hàm này bao gồm:
- Phát ngay: Khi đăng ký, luồng sẽ phát trạng thái có sẵn hiện tại của máy ảo mục tiêu.
- Tính tương đồng về hành vi: Luồng kết quả hoạt động giống hệt như hàm
subscribe_service_unit_change_by_nameđượcServiceDiscoveryManagersử dụng.
Tác nhân Nhà cung cấp VSIDL
Mỗi VM đang chạy tác nhân Nhà cung cấp VSIDL riêng, về cơ bản là một máy chủ RPC chuyển tiếp các yêu cầu trên API Nhà cung cấp VSIDL (của một thực thể cục bộ của thư viện trong tác nhân). Tác nhân này được dùng để truy vấn Nhà cung cấp VSIDL trên một VM khác, tức là một dịch vụ trên một VM có thể truy vấn siêu dữ liệu VSIDL từ một VM khác bằng tác nhân này.
Cách sử dụng API trong toàn bộ mã nguồn
SOMEIP:
get_publication_descriptor(tất cả các trường cấu trúc đều được dùng)get_rpc_method_descriptor(tất cả các trường cấu trúc đều được dùng)get_someip_mappings
Telemetry:
get_publication_descriptor(chỉ trườngmessage_descriptorđược dùng)get_rpc_method_descriptor(tất cả các trường cấu trúc đều được dùng)
Chẩn đoán:
get_message_descriptorget_diagnostics_declaration
Bạn có thể tìm thấy các hương vị khác nhau với nhiều nguồn dữ liệu và mức độ ưu tiên nguồn khác nhau trong core_services/vsidl/provider/src/vsidl_provider.rs.
Thùng vsidl_provider cung cấp một số hàm công khai để tạo các thực thể nhà cung cấp phù hợp với các tác nhân SDV khác nhau. Mỗi cấu hình chỉ định một chuỗi nguồn dữ liệu duy nhất để phân giải dữ liệu liên quan đến VSIDL. Bảng này trình bày hành vi của từng hàm tạo:
| Hàm khởi tạo | Loại dữ liệu | Tra cứu nguồn dữ liệu (và thứ tự) |
|---|---|---|
new_for_vsidl_provider_agent |
SomeIp | APEXes |
Diagnostics | APEXes | |
VsidlSchemas | APEXes, tệp | |
new_for_diagnostics_agent | Diagnostics | Tác nhân (từ xa), APEXes |
VsidlSchemas | Tệp | |
new_for_someip_broker_agent |
SomeIp | APEXes |
VsidlSchemas | Tệp | |
new_for_telemetry_agent | VsidlSchemas | Tác nhân (từ xa và cục bộ) |
new_for_integration_test |
SomeIp | Tác nhân (từ xa và cục bộ) |
Diagnostics | Tác nhân (từ xa và cục bộ) | |
VsidlSchemas | Tác nhân (từ xa và cục bộ) |
Các nguồn dữ liệu của bảng tham chiếu đến các lệnh gọi trong Hình 1.