Ten przewodnik zawiera szczegółowe informacje o formacie żądania JSON dla punktu końcowego /api/v2/generate_metrics_config narzędzia Metrics Configuration Generator (MCG). Ten format umożliwia zdefiniowanie kampanii telemetrycznej – określenie zbierania danych, przetwarzania na urządzeniu i generowania raportów – w strukturze zrozumiałej dla człowieka.
Narzędzie MCG sprawdza ten obiekt JSON pod kątem problemów, takich jak niezgodność typów, zależności zapętlone lub niezdefiniowane odwołania, a następnie kompiluje go w wiadomość bufora protokołu (protobuf) MetricsConfig. Ten komunikat MetricsConfig jest formatem binarnym, który usługa telemetrii na urządzeniu wykonuje, aby uruchomić kampanię.
Wymagania wstępne: musisz znać schematy JSON, protobuf i podstawowe struktury danych. Omówienie pojęć znajdziesz w artykule na temat konfiguracji wskaźników.
Jak napisać opis konfiguracji
Aby zaprojektować kampanię zbierania danych, wykonaj te czynności:
- Określ źródła danych: określ, skąd pochodzą dane.
- Zdefiniuj logikę i przetwarzanie: skonfiguruj reguły określające, kiedy zbierać dane i jak je przetwarzać.
- Utwórz dane wyjściowe: spakuj przetworzone dane w ostateczną wiadomość.
- Pola najwyższego poziomu: dodaj pola najwyższego poziomu, takie jak UUID, definicje sygnałów i kontrola cyklu życia.
Przykład: raport o średniej szybkości
W tym przewodniku pokazujemy na przykładzie, jak wszystkie komponenty współdziałają ze sobą. Tworzy raport, który co minutę oblicza średnią prędkość pojazdu. Definiuje źródło danych (SpeedSource) do zbierania danych o prędkości, aktywatory (OnNewSpeed, EveryMinute) do kontrolowania przepływu wykonywania, agregator (SpeedAggregator) do obliczania średniej oraz konfigurację raportu danych (MinuteReport) do pakowania wyniku. Przykłady w rozwijanych sekcjach opierają się na tym scenariuszu.
Określanie źródeł danych
Telemetria obsługuje zbieranie danych z usług SDV (za pomocą oprogramowania pośredniczącego SDV) i wydawców opartych na konfigurowalnym rejestrze wydawców.
Usługi SDV (oparte na pub/sub): dane są dostępne z kanałów pub/sub zdefiniowanych w VSIDL.
Usługi SDV (oparte na RPC): dane są dostępne, jeśli usługa udostępnia
CreateSubscriptionlubGetLatestMessageRPC.Wydawcy korzystający z rejestru Configurable Publisher Registry: dane są dostępne, jeśli aplikacja zarejestruje się za pomocą
IConfigurablePublisherRegistryinterfejsu Android Binder lub biblioteki Configurable Publisher Registry z pakietu Telemetry SDK.
Aby używać danych w SDV, zdefiniuj źródło danych (koncepcję) i dodaj je do tablicy data_sources.
Pola obiektu źródła danych (element na liście data_sources) |
|||||
|---|---|---|---|---|---|
name |
Zdefiniowany przez użytkownika ciąg znaków, który identyfikuje to źródło danych w konfiguracji danych. | ||||
source_identifier |
Identyfikator używany do wykrywania usługi. Więcej informacji znajdziesz w artykule o formacie source_identifier. |
||||
connection_type |
SUBSCRIPTION w przypadku ciągłego strumienia danych (wymagane w przypadku aktywatorów danych) lub ON_DEMAND w przypadku pobierania na żądanie (szczegółowe informacje znajdziesz w artykule na temat konfiguracji źródeł danych). |
||||
opcjonalneconfiguration |
Tylko RPC i konfigurowalny rejestr wydawców. Obiekt do skonfigurowania źródła danych z tymi polami:
|
||||
Pola dla typu połączenia SUBSCRIPTION |
|||||
opcjonalnesub_sampling_interval_ms |
Tylko Pub/Sub. Nieujemna liczba całkowita (milisekundy) służąca do ograniczania częstotliwości wiadomości przez określenie minimalnego odstępu między nimi. | ||||
opcjonalnefetch_last_message(domyślnie: false) |
Tylko Pub/Sub. Wartość logiczna. Jeśli true, po połączeniu pobiera najnowszą wiadomość. |
||||
Nie wszystkie opcje są dostępne dla wszystkich typów źródeł danych. Szczegółowe informacje znajdziesz w przewodniku po integracji źródeł danych.
Format identyfikatora danych źródłowych
Usługa telemetryczna akceptuje wiele formatów identyfikatorów źródeł. Omówienie znajdziesz w sekcji Definicja źródła danych w konfiguracjach wskaźników.
MCG wnioskuje typ wiadomości protobuf z source_identifier tylko wtedy, gdy używa formatu nazwy typu jednostki. Jeśli używasz FQIN lub nazwy niestandardowej (z konfigurowalnego rejestru wydawców), MCG nie może określić typu. W takich przypadkach musisz podać data_source_message_types. Jeśli typu nie ma w katalogu, musisz też podać jego definicję w descriptor_protos.
Przykład: definiowanie źródła danych
Ten przykład dotyczy prędkości pojazdu. Najpierw sprawdź katalog VSIDL, aby zidentyfikować usługę, która publikuje te dane.
Korzystając z przykładowego katalogu w bazie kodu SDV, zidentyfikuj odpowiednią usługę. Zgodnie z formatem source_identifier określ typ wiadomości protobuf mcg.test.subpkg.speed_msg. Ponieważ prędkość jest zwykle publikowana często, użyj sub_sampling_interval_ms, aby ograniczyć aktualizacje do jednej wiadomości na sekundę:
{ "name": "SpeedSource", "source_identifier": "mcg.test.subpkg.speed_msg", "connection_type": "SUBSCRIPTION", "sub_sampling_interval_ms": 1000 // Limit updates to 1 per second }
Definiowanie logiki i przetwarzania
Logika jest obsługiwana przez 2 komponenty, które ze sobą współpracują: reguły (koncepcja) określają, kiedy coś się dzieje. Agregatory (koncepcja) określają, jak dane są przetwarzane na podstawie tych aktywatorów. Wyrażenia (pojęcie) są kluczowe dla warunków aktywacji i logiki agregacji, dlatego w tej sekcji najpierw opisujemy, jak je pisać.
Wyrażenia
Wyrażenia umożliwiają definiowanie obliczeń i warunków przy użyciu składni zrozumiałej dla człowieka. MCG kompiluje te ciągi znaków do formatu wykonywalnego zoptymalizowanego pod kątem oceny na urządzeniu.
Wyrażenia mogą zawierać obliczenia arytmetyczne, warunki logiczne i porównania danych. Pełną składnię, w tym operatory i funkcje, znajdziesz w artykule Składnia wyrażeń.
Częstotliwość aktualizacji danych: gdy wyrażenie uzyskuje dostęp do źródła danych, sposób pobierania zależy od typu połączenia:
SUBSCRIPTION: używa ostatniej odebranej wiadomości zapisanej w pamięci podręcznej przez usługę telemetrii. (Uwaga: jeśli ustawionosub_sampling_interval_ms, może się różnić od ostatniej opublikowanej wiadomości).ON_DEMAND: wywołuje natychmiastowe połączenie w celu pobrania nowej wiadomości z usługi.
Ograniczenia typu
- Tablice: bezpośredni dostęp do indeksu tablicy (np.
my_data_source.my_array[0]) nie jest obsługiwany. - Zabezpieczenia wpisywania: upewnij się, że porównujesz zgodne typy (np. nie porównuj pola ciągu znaków z listą liczb całkowitych).
Przykład: wyrażenia
W przykładzie trzeba wyodrębnić wartość prędkości, aby obliczyć jej średnią. Musi też określić, czy pojazd przekracza prędkość (ponad 100 km/h) w przypadku reguły warunkowej. Nazwy pól (w tym przypadku speed) znajdziesz w definicji wiadomości protobuf używanej przez źródło danych. Możesz to zrobić za pomocą tych wyrażeń:
SpeedSource.speed: pobiera wartość polaspeedze źródła danychSpeedSource.SpeedSource.speed > 27.7: zwraca wartośćtrue, jeśli prędkość jest większa niż 27,7 m/s (około 100 km/h).
Aktywatory: określ, kiedy mają być wykonywane działania
Aktywatory określają, kiedy działania są wykonywane: ocena agregatora, generowanie raportu lub kontrolowanie cyklu życia kolekcji. Dodaj wszystkie zdefiniowane reguły do tablicy triggers najwyższego poziomu.
Pola obiektu aktywującego (element na liście triggers) |
|
|---|---|
name |
Unikalny identyfikator tej reguły w konfiguracji danych. |
periodicdataconditional |
Aby zdefiniować zachowanie, musisz podać dokładnie jedno z tych pól. |
Aktywator danych
Uruchamia się, gdy źródło danych SUBSCRIPTION dostarcza nową wiadomość (koncepcja).
Pola obiektu data (w regule) |
|
|---|---|
source_name |
name elementu data_source, którego nasłuchuje ten aktywator. |
Przykład: aktywator danych
W tym przykładzie obliczenia średniej prędkości są aktualizowane za każdym razem, gdy SpeedSource publikuje nową wiadomość. Ta reguła danych uruchamia się za każdym razem, gdy:
{ "name": "OnNewSpeed", "data": { "source_name": "SpeedSource" // Reference to the defined data source } }
Reguła okresowa
Uruchamia się w regularnych odstępach czasu (koncepcja).
Pola obiektu periodic (w regule) |
|
|---|---|
period_ms |
Liczba nieujemna, która określa interwał w milisekundach. |
Przykład: aktywator okresowy
W tym przykładzie raport jest wymagany co minutę. Ten okresowy aktywator uruchamia się co 60 000 ms,aby wygenerować raport:
{ "name": "EveryMinute", "periodic": { "period_ms": 60000 // 60,000 ms = 60 seconds } }
Aktywator warunkowy
Uruchamia się na podstawie oceny wyrażenia (koncepcja). Do rozpoczęcia oceny wymaga co najmniej 1 reguły nadrzędnej. Często jest to aktywator danych dla źródeł danych lub agregatorów w wyrażeniu albo aktywator okresowy do pobierania danych.
Pola obiektu conditional (w regule) |
|
|---|---|
triggers |
Tablica z co najmniej 1 nazwą aktywatora nadrzędnego. Gdy uruchamia się reguła nadrzędna, reguła warunkowa ocenia wyrażenie. |
expression |
Wyrażenie do oceny. Zobacz Wyrażenia. |
condition_type |
Określa, kiedy reguła powinna się uruchomić, na podstawie oceny wyrażenia. |
Typy warunku
Słownik condition_type musi zawierać dokładnie 1 z dostępnych typów warunków jako klucz. Więcej informacji znajdziesz w artykule Reguły warunkowe.
Pola obiektu condition_type (wykluczają się wzajemnie) |
|
|---|---|
is_trueis_false |
Uruchamia się, gdy wyrażenie logiczne zwraca odpowiednio wartość true lub false. |
rising_edge |
Jeśli jest liczbowa, uruchamia się, gdy jej wartość wzrasta. Jeśli wyrażenie jest wartością logiczną, reguła jest uruchamiana, gdy wartość zmienia się z Może zawierać obiekt |
falling_edge |
Jeśli jest to wartość liczbowa, reguła uruchamia się, gdy wartość maleje. Jeśli wyrażenie jest wartością logiczną, reguła jest uruchamiana, gdy wartość zmienia się z Może zawierać obiekt |
all_changes |
Uruchamia się, gdy wynik wyrażenia różni się od poprzedniej wartości. Jeśli ustawione są opcje krawędzi, obsługiwane są tylko wartości liczbowe i logiczne. Może zawierać |
Opcje krawędzi
Obiekty rising_options i falling_options zawierają te pola. Jeśli jest podany, odpowiednie przejście musi spełniać wymagania dotyczące czasu trwania.
Przejścia bez określonych opcji są uruchamiane natychmiast.
| Pola obiektów opcji krawędzi | |
|---|---|
min_duration_ms |
Liczba nieujemna (w milisekundach) określająca, jak długo warunek musi być spełniony w nowym stanie, zanim reguła zostanie uruchomiona. |
opcjonalnerequire_exact |
Wartość logiczna. Jeśli ma wartość „true” (prawda), wszystkie wartości opublikowane w okresie obowiązywania muszą być takie same, aby reguła została uruchomiona. |
Przykład: aktywator warunkowy
Poniższy aktywator korzysta z opcji krawędzi. Reguła jest uruchamiana, gdy prędkość przekracza 27,7 m/s i utrzymuje się na tym poziomie przez co najmniej 5 sekund:
{ "name": "SpeedingFor5Seconds", "conditional": { "triggers": ["OnNewSpeed"], "expression": "SpeedSource.speed > 27.7", "condition_type": { "rising_edge": { "rising_options": { "min_duration_ms": 5000 // Condition must hold for 5s in new state } } } } }
Agregatory: definiowanie sposobu przetwarzania danych
Użyj agregatora do stanowego, pośredniego przetwarzania danych (koncepcja).
Zdefiniuj agregator i dodaj go do tablicy aggregators.
Agregator przekształca dane i udostępnia je innym agregatorom i raportom.
Pola agregatora (element na liście aggregators) |
|
|---|---|
name |
Zdefiniowany przez użytkownika ciąg znaków, który identyfikuje ten agregator. Wyrażenia mogą odwoływać się do tego agregatora według nazwy, aby uzyskać dostęp do jego wyników. |
trigger_names |
Tablica zawierająca co najmniej 1 nazwę aktywatora, który powoduje ocenę tej agregacji. |
opcjonalnereset_on_get |
Wartość logiczna, domyślnie: `false`. Jeśli ma wartość `true`, system resetuje stan agregacji po uzyskaniu dostępu do jego wartości przez inny agregator, raport danych lub aktywator warunkowy. |
message_builder |
Określa dane do odczytu, przetwarzania i agregacji. Pola wiadomości wyjściowej stają się źródłem danych dla innych agregatorów i raportów. Używa field_assignments, przy czym każde przypisanie definiuje pole w wiadomości wyjściowej. |
Kreator wiadomości
Obiekt message_builder definiuje strukturę wiadomości wyjściowej i logikę agregacji używaną do obliczania jej pól. Jest używany zarówno w agregatorach, jak i konfiguracjach raportów.
Pola obiektu message_builder (w agregatorze lub raporcie) |
|
|---|---|
message_type |
Pełna i jednoznaczna nazwa typu wiadomości protobuf dla danych wyjściowych. Jeśli go pominiesz, MCG utworzy niestandardowy typ wiadomości na podstawie wnioskowanych typów danych wyjściowych field_assignments. Używaj tego tylko wtedy, gdy kreator wiadomości jest częścią raportu danych, a raport musi być zgodny z określoną, wstępnie zdefiniowaną definicją wiadomości protobuf. |
field_assignments |
Tablica obiektów definicji pól. Każdy obiekt określa pole w wiadomości wyjściowej i logikę obliczania jego wartości. |
Pola obiektu przypisania pola (element na liście field_assignments) |
|||||||
|---|---|---|---|---|---|---|---|
field_name |
Zdefiniowana przez użytkownika nazwa pola. Identyfikuje konkretną wartość w obiekcie, gdy w wyrażeniach używana jest notacja kropkowa (aggregator_name.field_name). |
||||||
aggregation |
Obiekt, który określa, jak system oblicza wartość pola, zawierający te pola:
|
||||||
Przykład: pośrednik
W tym przykładzie oblicz statystyki między raportami minutowymi. Ten agregator jest wywoływany przez OnNewSpeed, aby obliczyć średnią prędkość (avg), zliczyć odczyty (count) i zapisać 5 ostatnich wartości prędkości (vector). Ustaw reset_on_get na true. Spowoduje to resetowanie statystyk za każdym razem, gdy MinuteReport je odczyta, i rozpoczęcie nowego okna zbierania danych dla agregatora na następną minutę:
{ "name": "SpeedAggregator", "trigger_names": ["OnNewSpeed"], // Update aggregation on new speed data "reset_on_get": true, // Reset stats after they are read by the report configuration "message_builder": { "field_assignments": [ { "field_name": "average_speed", "aggregation": { "@type": "avg", "expression": "SpeedSource.speed" } }, { "field_name": "speed_reading_count", "aggregation": { "@type": "count" // Counts triggers (that is, processed speed readings) since last reset } }, { "field_name": "speed_history_last5", "aggregation": { "@type": "vector", "expression": "SpeedSource.speed", "max_length": 5 // Keep last 5 readings } } ] } }
Utwórz dane wyjściowe
Aby zdefiniować ostateczne dane wyjściowe kampanii telemetrycznej, dodaj obiekty do tablicy report_configs (koncepcja). Te konfiguracje określają, jak przetworzone dane są pakowane i kiedy są generowane. W jednej konfiguracji danych możesz zdefiniować wiele konfiguracji raportów, aby ponownie używać komponentów.
Generowanie raportów możesz kontrolować za pomocą pola trigger_names. Możesz też użyć report_initial, aby wygenerować raport natychmiast po aktywacji konfiguracji, oraz report_incomplete, aby wygenerować raport końcowy po przerwaniu zbierania danych.
Uwaga: aby połączyć przetwarzanie z danymi wyjściowymi, użyj typu agregacji none (@type: "none"), który umożliwia odczytywanie wstępnie obliczonych wartości z agregatora. Raporty są zwykle migawkami bezstanowymi, więc złożona logika stanowa jest zachowywana w agregatorach, a raporty są przeznaczone do formatowania.
Pola obiektu konfiguracji raportu (element na liście report_configs) |
|
|---|---|
name |
Unikalna nazwa raportu. Ta nazwa pojawia się w metadanych wygenerowanego raportu. |
trigger_names |
Tablica nazw aktywatorów, które powodują wygenerowanie i opublikowanie raportu. |
message_builder |
Szczegółowe informacje znajdziesz w artykule Kreator wiadomości. Określa zawartość raportu. thought Agregacje są oceniane tylko wtedy, gdy raport jest wywoływany. Na przykład agregacja wektorowa dodaje 1 wartość na raport, a agregacja liczby odzwierciedla liczbę raportów. |
opcjonalnereport_incomplete(domyślnie: `false`) |
Wartość logiczna. Jeśli ma wartość `true`, system generuje raport końcowy po wyłączeniu lub po zakończeniu zbierania danych, nawet jeśli brakuje danych. |
opcjonalnereport_initial(domyślnie: `false`) |
Wartość logiczna. Jeśli ma wartość `true`, system generuje raport natychmiast po aktywowaniu konfiguracji danych. |
Przykład: konfiguracja raportu
Na koniec zdefiniuj konfigurację raportu na potrzeby przykładu. Jest wywoływany przez EveryMinute. Odczytuje obliczoną średnią prędkość i liczbę odczytów z SpeedAggregator za pomocą agregacji none, która przekazuje wstępnie zagregowaną wartość do raportu:
{ "name": "MinuteReport", "trigger_names": ["EveryMinute"], // Generate report every minute "message_builder": { "field_assignments": [ { "field_name": "average_speed", "aggregation": { "@type": "none", // Read the value directly from the aggregator "expression": "SpeedAggregator.average_speed" } }, { "field_name": "reading_count", "aggregation": { "@type": "none", "expression": "SpeedAggregator.speed_reading_count" } } ] } }
Pola najwyższego poziomu
Oprócz tablic data_sources, aggregators, triggers i report_configs opis konfiguracji danych wymaga odwołania do katalogu sygnałów. Możesz też dodać opcjonalne pola, aby przypisać konkretny identyfikator UUID i zarządzać cyklem życia kolekcji.
Ustaw UUID
Każdy MetricsConfig wymaga unikalnego identyfikatora uniwersalnego (UUID). Jeśli podasz existing_uuid, MCG go użyje. W przeciwnym razie tworzy losowy identyfikator. Aby zachować spójność między wdrożeniami i narzędziami, określ existing_uuid.
Ciąg znaków musi być prawidłowym identyfikatorem UUID z łącznikami i zawierać tylko małe litery.
"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
Definicje sygnałów
Aby sprawdzić nazwy i typy sygnałów, MCG wymaga dostępu do katalogu sygnałów pojazdu. Jest to bufor protokołu FileDescriptorSet zawierający definicje VSIDL .proto (spakowane i przesłane do MCG). Szczegółowe informacje o tworzeniu i przesyłaniu katalogu znajdziesz w artykule Katalogi sygnałów pojazdu.
Określ wersję katalogu w polu vs_version obiektu JSON:
"vs_version": "v1.0",
Definiowanie aktywatorów cyklu życia
W kontekście kampanii telemetrycznej cykl życia MetricsConfig określa, kiedy dane są faktycznie rejestrowane. Podczas gdy system zarządzania kampanią wdraża i aktywuje konfigurację na urządzeniu, możesz używać aktywatorów cyklu życia, aby precyzyjnie kontrolować, kiedy dane są zbierane w ramach tego wdrożenia.
Dzięki temu możesz dostosować zbieranie danych do wzorców użytkowania pojazdu, takich jak „Podróż” (IgnitionOn do IgnitionOff) lub „Sesja ładowania”, bez konieczności dezaktywowania konfiguracji.
Kontrola sesji (rozpoczęcie/wstrzymanie): użyj przycisków
start_trigger_nameistop_trigger_name, aby kontrolować, kiedy dane są zbierane. Jeśli na przykład chcesz zbierać dane tylko podczas jazdy, jako regułę uruchamiającą ustawIgnitionOn, a jako regułę zatrzymującą –IgnitionOff. Konfiguracja pozostaje aktywna na urządzeniu, ale zostaje „wstrzymana” (przestaje zbierać i przetwarzać dane), gdy aktywator zatrzymania zostanie uruchomiony. Wznawia działanie dopiero po ponownym uruchomieniu aktywatora rozpoczęcia.Ważne: spowoduje to jedynie wstrzymanie zbierania danych. Nie definiuje okien logicznych ani oddzielnych zbiorów danych i nie ma żadnych innych efektów ubocznych. Wartości agregatora nie są resetowane, gdy zbieranie danych jest wstrzymywane lub wznawiane.
Wykrywanie jednorazowe (zakończenie): użyj wartości
deactivate_trigger_name, jeśli konfiguracja ma zostać uruchomiona tylko raz (np. w celu wykrycia pierwszego wystąpienia określonego kodu błędu), a następnie trwale dezaktywowana na tym urządzeniu, nawet jeśli kampania jest technicznie nadal aktywna.
Jeśli nie określisz żadnych aktywatorów cyklu życia, zbieranie danych rozpocznie się natychmiast po aktywowaniu konfiguracji przez kampanię i będzie trwało nieprzerwanie do zakończenia kampanii.
| Pola cyklu życia najwyższego poziomu (obiekt główny) | |
|---|---|
opcjonalnestart_trigger_name |
Nazwa aktywatora, który rozpoczyna sesję zbierania danych. Można ustawić bez stop_trigger_name. |
opcjonalnestop_trigger_name |
Nazwa aktywatora, który wstrzymuje sesję zbierania danych (np. gdy pojazd się nie porusza). Jeśli jest ustawiona, musi być też ustawiona zasada start_trigger_name. |
opcjonalnedeactivate_trigger_name |
Nazwa aktywatora, który finalizuje i całkowicie dezaktywuje `MetricsConfig`. |
Zaawansowane: niestandardowe definicje proto
W 2 głównych przypadkach sam vs_version nie wystarczy, aby MCG mógł zrozumieć wszystkie typy wiadomości w opisie konfiguracji danych:
- Niepowodzenie wnioskowania o typie: jak wyjaśniono w sekcji Format
source_identifier, MCG nie może wnioskować o typie, gdysource_identifierużywa FQIN lub nazwy niestandardowej. - Komunikaty niestandardowe: opis konfiguracji danych korzysta z komunikatów protobuf, których nie ma w katalogu VSIDL określonym w
vs_version. Dzieje się tak, gdy ustawiaszmessage_typewmessage_builderdla niestandardowego formatu raportu.
W takich przypadkach użyj data_source_message_types, aby pomóc MCG w określaniu typów, oraz descriptor_protos, aby podać definicje wiadomości.
data_source_message_types
Zmapuj ciąg znaków source_identifier na w pełni kwalifikowany typ wiadomości protobuf.
Klucz w data_source_message_types musi odpowiadać wartości source_identifier z wpisu data_sources:
"data_source_message_types": {
"MyCustomSpeedService": "com.sdv.example.SampleMessage"
}
descriptor_protos
Podaj definicje wszystkich typów wiadomości używanych w data_source_message_types lub message_builder, których nie ma w skonfigurowanym vs_version.
Przekaż zakodowany w formacie base64 obiekt descriptorpb.FileDescriptorSet w tablicy descriptor_protos. Wygeneruj go z plików .proto za pomocą kompilatora Protobuf protoc.
"descriptor_protos": [
"Cu8BCiZtY2cvdGVzdGRhdGEvbWF4YXZnY3..." // Base64 string
]
Przykład: pełny opis konfiguracji
W poprzednich sekcjach zdefiniowano wszystkie komponenty przykładu: generowanie raportu co minutę ze średnią prędkością pojazdu zaobserwowaną w ciągu tej minuty.
Te komponenty to:
- źródło danych (
SpeedSource), aby otrzymywać dane o prędkości nawet raz na sekundę; - Reguła danych (
OnNewSpeed), która jest uruchamiana, gdySpeedSourcewysyła dane. - Reguła okresowa (
EveryMinute), która uruchamia się co 60 sekund. - Agregator (
SpeedAggregator), który używaOnNewSpeeddo obliczania średniej prędkości, zliczania odczytów i przechowywania ostatnich wartości, resetowany po odczycie. - Konfiguracja raportu (
MinuteReport), która używaEveryMinutedo aktywowania raportu zawierającego średnią prędkość i liczbę zSpeedAggregator. - Pola najwyższego poziomu (
existing_uuid,vs_version) do identyfikowania konfiguracji danych i określania, którego katalogu VSIDL używać do definiowania sygnałów.
Po połączeniu te elementy tworzą pełny opis konfiguracji wskaźników:
{ "existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", // Unique identifier for the configuration "vs_version": "example_version", // Version of the VSIDL catalog to use "data_sources": [ { "name": "SpeedSource", "source_identifier": "mcg.test.subpkg.speed_msg", "connection_type": "SUBSCRIPTION", "sub_sampling_interval_ms": 1000 } ], "aggregators": [ { "name": "SpeedAggregator", "trigger_names": ["OnNewSpeed"], "reset_on_get": true, "message_builder": { "field_assignments": [ { "field_name": "average_speed", "aggregation": { "@type": "avg", "expression": "SpeedSource.speed" } }, { "field_name": "speed_reading_count", "aggregation": { "@type": "count" } }, { "field_name": "speed_history_last5", "aggregation": { "@type": "vector", "expression": "SpeedSource.speed", "max_length": 5 } } ] } } ], "triggers": [ { "name": "OnNewSpeed", "data": { "source_name": "SpeedSource" } }, { "name": "EveryMinute", "periodic": { "period_ms": 60000 } } ], "report_configs": [ { "name": "MinuteReport", "trigger_names": ["EveryMinute"], "message_builder": { "field_assignments": [ { "field_name": "average_speed", "aggregation": { "@type": "none", "expression": "SpeedAggregator.average_speed" } }, { "field_name": "reading_count", "aggregation": { "@type": "none", "expression": "SpeedAggregator.speed_reading_count" } } ] } } ] }
Szablon referencyjny
Definicję interfejsu API znajdziesz w dokumentacji interfejsu MCG API.
W poniższych sekcjach znajdziesz pełne informacje o opisie konfiguracji wskaźników. Możesz go użyć jako przewodnika podczas tworzenia własnego opisu konfiguracji wskaźników.
Pola najwyższego poziomu
{
"existing_uuid": "1cbec8e6-46f5-4649-9fa2-09f81bc93f8b", // Optional
"vs_version": "example_version", // Optional
"descriptor_protos": ["..."], // Optional. Base64 encoded FileDescriptorSet
"data_source_message_types": {
"ExampleServiceName": "com.example.ProtoMessage"
}, // Optional
"start_trigger_name": "DataTriggerExample", // Optional
"stop_trigger_name": "ConditionalTriggerExample", // Optional
"deactivate_trigger_name": "PeriodicTriggerExample" // Optional
}
Dane wejściowe: źródła danych i agregatory
{
"data_sources": [
{
"name": "SubscriptionExample",
"source_identifier": "com.example.sdv.ExampleMessage|example-unit",
"connection_type": "SUBSCRIPTION", // Options: SUBSCRIPTION (default), ON_DEMAND
"sub_sampling_interval_ms": 100, // Optional
"fetch_last_message": false // Optional. Default: false
},
{
"name": "RegistryExample",
// Configurable Publisher Registry-based publisher (matches data_source_message_types)
"source_identifier": "ExampleServiceName",
"connection_type": "SUBSCRIPTION"
},
{
"name": "GetterExample",
"source_identifier": "com.example.sdv.ExampleConfig|example-unit",
"connection_type": "ON_DEMAND",
"configuration": {
"type_url": "type.googleapis.com/example.Config",
"value_json": {} // Or value_textproto, value (base64)
}
}
],
"aggregators": [
{
"name": "AggregatorExample",
"trigger_names": ["DataTriggerExample"],
"reset_on_get": false, // Optional. Default: false. If true, resets state after it's read
"message_builder": {
"message_type": ".com.example.AggregatedMessage", // Optional
"field_assignments": [
{
"field_name": "avg_example",
"aggregation": {
// Options: avg, count, min, max, sum, stddev, delta, vector, none
"@type": "avg",
"expression": "SubscriptionExample.value"
}
},
{
"field_name": "count_example",
"aggregation": {
"@type": "count" // Counts number of evaluations. No expression needed
}
},
{
"field_name": "vector_example",
"aggregation": {
"@type": "vector",
"expression": "SubscriptionExample.value",
"max_length": 10 // Optional. If set, creates a ring buffer
}
}
]
}
}
]
}
Logika i przetwarzanie: aktywatory
{
"triggers": [
{
"name": "PeriodicTriggerExample",
"periodic": { "period_ms": 1000 }
},
{
"name": "DataTriggerExample",
"data": { "source_name": "SubscriptionExample" }
},
{
"name": "ConditionalTriggerExample",
"conditional": {
"triggers": ["PeriodicTriggerExample"],
"expression": "SubscriptionExample.value > 0",
"condition_type": {
// Options: is_true, is_false, rising_edge, falling_edge, all_changes
"rising_edge": {
"rising_options": { "min_duration_ms": 0, "require_exact": false }
}
}
}
}
]
}
Dane wyjściowe: konfiguracje raportów
{
"report_configs": [
{
"name": "ReportExample",
"trigger_names": ["PeriodicTriggerExample"],
"report_incomplete": false, // Optional. Default: false
"report_initial": false, // Optional. Default: false
"message_builder": {
"message_type": ".com.example.ReportMessage", // Optional. Must be defined in VSIDL catalog or descriptor_protos. Message type will be inferred if not provided
"field_assignments": [
{
"field_name": "avg_example",
"aggregation": {
"@type": "none", // Passthrough since aggregation is done in AggregatorExample
"expression": "AggregatorExample.avg_example"
}
}
]
}
}
]
}
Składnia wyrażeń
| Kategoria | Składnia | Opis |
|---|---|---|
| Dostęp do danych | source_namesource_name.fieldsource_name.field.subfield |
Dostęp do pełnej wiadomości ze źródła danych lub agregatora Dostęp do określonego pola w wiadomości (w tym pól zagnieżdżonych) |
| Arytmetyczne | +, -, *, /, %, ** |
Standardowe obliczenia. ** to potęgowanie. |
| Logiczne | &&, ||, !, ^ |
AND, OR, NOT, XOR. |
| Relacyjne | ==, !=, <, <=, >, >= |
== i != działają we wszystkich typach. Inne wymagają liczb. |
| Wyświetl listę | contains(list, item)doesnotcontain(list, item)alleq(list, value) |
Działa na wektorach (tablicach). alleq(list, value) zwraca true, jeśli wszystkie elementy w list są równe value. |
| Funkcje | timestamp(clock_type) |
Bieżący czas w mikrosekundach.clock_type: REALTIME_CLOCK lubMONOTONIC_TIME_SINCE_BOOT_OR_RESUME |
abs(n) |
Wartość bezwzględna | |
floor(n), round(n), ceil(n) |
Funkcje zaokrąglania | |
| Kolejność działań | () |
Standardowe grupowanie na potrzeby pierwszeństwa |