Format JSON żądania generowania konfiguracji danych

Ten przewodnik zawiera szczegółowe informacje o formacie żądania JSON dla punktu końcowego /api/v1/generate_metrics_config narzędzia do generowania konfiguracji danych (MCG). Ten format umożliwia zdefiniowanie kampanii telemetrycznej – określenie zbierania danych, przetwarzania na urządzeniu i generowania raportów – w strukturze czytelnej dla człowieka.

Narzędzie MCG weryfikuje ten obiekt JSON, sprawdzając, czy nie występują w nim problemy, takie jak niezgodność typów, zależności cykliczne lub niezdefiniowane odwołania, a następnie kompiluje go do postaci komunikatu MetricsConfig bufora protokołu (protobuf). Ta MetricsConfigwiadomość 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. Informacje koncepcyjne znajdziesz w artykule Koncepcje konfiguracji danych.

Jak napisać opis konfiguracji

Aby zaprojektować kampanię zbierającą dane, postępuj zgodnie z tym schematem:

  1. Określ źródła danych: zdefiniuj, skąd pochodzą dane.
  2. Określ logikę i przetwarzanie: skonfiguruj reguły określające, kiedy zbierać dane i jak je przetwarzać.
  3. Utwórz dane wyjściowe: spakuj przetworzone dane w wiadomość końcową.
  4. Pola najwyższego poziomu: dodaj pola najwyższego poziomu, takie jak UUID, definicje sygnałówkontrola cyklu życia.

Przykład: raport o średniej szybkości

W tym przewodniku pokazujemy na przykładzie, jak wszystkie komponenty ze sobą współpracują. Tworzy on raport, który co minutę oblicza średnią prędkość pojazdu. Definiuje źródło danych (SpeedSource) do zbierania danych o szybkości, wyzwalacze (OnNewSpeed, EveryMinute) do kontrolowania przepływu wykonania, agregator (SpeedAggregator) do obliczania średniej oraz konfigurację raportu o 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 rejestrze konfigurowalnych wydawców.

Aby używać danych w SDV, zdefiniuj źródło danych (koncepcja) i dodaj je do tablicy data_sources.

Pola obiektu źródła danych (element listy data_sources)
name Ciąg zdefiniowany przez użytkownika, 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 sekcji Format source_identifier.
connection_type SUBSCRIPTION w przypadku ciągłego strumienia danych (wymagane w przypadku reguł danych) lub ON_DEMAND w przypadku pobierania na żądanie (szczegółowe informacje znajdziesz w konfiguracji źródeł danych).
opcjonalny
configuration

Tylko RPC i konfigurowany rejestr wydawców. Obiekt do konfigurowania źródła danych z tymi polami:

type_url Pełna nazwa protobuf wiadomości konfiguracji.
value_json,
value_textproto,
lub value
Ładunek w formacie JSON, textproto lub base64.
Pola dla typu połączenia SUBSCRIPTION
opcjonalny
sub_sampling_interval_ms
Tylko Pub/Sub. Nieujemna liczba całkowita (w milisekundach) ograniczająca częstotliwość wiadomości przez określenie minimalnego odstępu czasu między nimi.
opcjonalne
fetch_last_message
(domyślnie: false)
Tylko Pub/Sub. Wartość logiczna. Jeśli true, pobiera najnowszą wiadomość po nawiązaniu połączenia.

Nie wszystkie opcje są dostępne w przypadku wszystkich typów źródeł danych. Szczegółowe informacje znajdziesz w przewodniku po integracji źródeł danych.

Format parametru source_identifier

Usługa telemetrii akceptuje formaty identyfikatorów wielu źródeł. Więcej informacji znajdziesz w sekcji Definicja źródła danych w konfiguracjach wskaźników.

MCG wywnioskuje typ wiadomości protobuf z source_identifier tylko wtedy, gdy używa formatu Unit Type Name. Jeśli używasz FQIN lub nazwy niestandardowej (z Configurable Publisher Registry), MCG nie może wywnioskować 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

W tym przykładzie raportowana jest prędkość pojazdu. Najpierw zapoznaj się z katalogiem VSIDL, aby określić usługę, która publikuje te dane.

Korzystając z przykładowego katalogu w bazie kodu SDV, zidentyfikuj odpowiednią usługę. Zgodnie z formatemsource_identifier określ typ wiadomości protobufmcg.test.subpkg.speed_msg. Ponieważ prędkość jest zwykle publikowana często, użyj sub_sampling_interval_ms, aby ograniczyć aktualizacje do 1 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
}

Określanie logiki i przetwarzania

Logika jest obsługiwana przez 2 współdziałające ze sobą komponenty: reguły (koncepcja) określają, kiedy coś się dzieje, a agregatory (koncepcja) określają, jak dane są przetwarzane na podstawie tych reguł. Wyrażenia (koncepcja) są kluczowe dla warunków reguł i logiki agregacji, dlatego w tej sekcji najpierw opisujemy, jak je pisać.

Wyrażenia

Wyrażenia umożliwiają definiowanie obliczeń i warunków za pomocą czytelnej dla użytkownika składni. 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 otrzymanej wiadomości zapisanej w pamięci podręcznej przez usługę Telemetria. (Uwaga: jeśli ustawiono sub_sampling_interval_ms, może się to różnić od najnowszej 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.
  • Bezpieczeństwo typów: upewnij się, że porównujesz zgodne typy (np. nie porównuj pola tekstowego z listą liczb całkowitych).

Przykład: wyrażenia

W przykładzie należy wyodrębnić wartość prędkości, aby obliczyć jej średnią. Musi też określić, czy pojazd przekracza prędkość (powyżej 100 km/h) w przypadku warunkowego wywołania. Nazwy pól (w tym przypadku speed) znajdziesz w definicji wiadomości protobuf używanej przez źródło danych. Możesz to osiągnąć za pomocą tych wyrażeń:

  • SpeedSource.speed: pobiera wartość pola speed ze źródła danych SpeedSource.
  • SpeedSource.speed > 27.7: przyjmuje wartość true, jeśli prędkość jest większa niż 27,7 m/s (około 100 km/h).

Aktywatory: określ, kiedy mają wystąpić działania

Triggery określają, kiedy mają być wykonywane działania: ocena agregatora, generowanie raportu lub kontrolowanie cyklu życia zbierania danych. Dodaj wszystkie zdefiniowane triggery do tablicy najwyższego poziomu triggers.

Pola obiektu wywołującego (element na liście triggers)
name Unikalny identyfikator tego wyzwalacza w konfiguracji danych.
periodic
data
conditional
Aby zdefiniować działanie, musisz podać dokładnie jedno z tych pól.

Wyzwalacz danych

Wywoływane, gdy źródło danych SUBSCRIPTION dostarcza nową wiadomość (koncepcja).

Pola obiektu data (w wyzwalaczu)
source_name name data_source, na którym nasłuchuje ten wyzwalacz.

Przykład: wyzwalacz danych

W tym przykładzie aktualizuj obliczenia średniej prędkości za każdym razem, gdy SpeedSource opublikuje nową wiadomość. Ten wyzwalacz danych uruchamia się za każdym razem, gdy:

{
  "name": "OnNewSpeed",
  "data": {
    "source_name": "SpeedSource" // Reference to the defined data source
  }
}

Reguła okresowa

Wystrzeliwuje pociski w regularnych odstępach czasu (koncepcja).

Pola obiektu periodic (w wyzwalaczu)
period_ms Liczba nieujemna określająca odstęp w milisekundach.

Przykład: wyzwalacz okresowy

W tym przykładzie raport jest wymagany co minutę. Ten okresowy wyzwalacz 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 (pojęcia). Aby rozpocząć ocenę, wymaga co najmniej jednego wyzwalacza nadrzędnego. Jest to często wyzwalacz danych dla źródeł danych lub agregatorów w wyrażeniu albo wyzwalacz okresowy do sondowania danych.

Pola obiektu conditional (w wyzwalaczu)
triggers Tablica z co najmniej 1 nazwą wywołania nadrzędnego. Gdy uruchomi się reguła nadrzędna, reguła warunkowa ocenia wyrażenie.
expression Wyrażenie do sprawdzenia. Zobacz Wyrażenia.
condition_type Określa, kiedy reguła ma się uruchomić na podstawie wyniku oceny wyrażenia.
Typy warunków

condition_type słownik musi zawierać dokładnie jeden z dostępnych typów warunków jako klucz. Więcej informacji znajdziesz w sekcji Wywoływanie warunkowe.

Pola obiektu condition_type (wykluczają się nawzajem)
is_true

is_false
Aktywuje się, gdy wyrażenie logiczne zwraca odpowiednio wartość true lub false.
rising_edge

Jeśli jest to wartość liczbowa, reguła uruchamia się, gdy jej wartość wzrośnie. Jeśli wyrażenie jest wartością logiczną, reguła uruchamia się, gdy zmieni się z false na true.

Może zawierać obiekt rising_options (patrz Opcje krawędzi).

falling_edge

Jeśli jest to wartość liczbowa, zdarzenie jest wywoływane, gdy jej wartość maleje. Jeśli wyrażenie jest wartością logiczną, reguła jest uruchamiana, gdy zmieni się z true na false.

Może zawierać obiekt falling_options (patrz Opcje krawędzi).

all_changes

Wywoływany, gdy wynik wyrażenia różni się od jego poprzedniej wartości. Jeśli ustawione są opcje krawędzi, obsługuje tylko wartości liczbowe i logiczne.

Może zawierać rising_options, falling_options lub oba te elementy (patrz Opcje krawędzi).

Opcje krawędzi

Obiekty rising_optionsfalling_options mają te pola: Jeśli podano czas trwania, 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 zostanie uruchomiona reguła.
opcjonalny
require_exact
Wartość logiczna. Jeśli ma wartość „true” (prawda), wszystkie wartości opublikowane w danym okresie muszą być takie same, aby wywołać regułę.

Przykład: aktywator warunkowy

Ten wyzwalacz korzysta z opcji krawędzi. Włącza się, gdy prędkość przekracza 27,7 m/s i utrzymuje się na wysokim 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: określają sposób przetwarzania danych.

Użyj agregatora do przetwarzania danych pośrednich z zachowaniem stanu (koncepcja). Zdefiniuj agregatora i dodaj go do tablicy aggregators.

Agregator przekształca dane i udostępnia je innym agregatorom oraz raportom.

Pola pośrednika (element na liście aggregators)
name Ciąg znaków zdefiniowany przez użytkownika, który identyfikuje tego agregatora. Wyrażenia mogą odwoływać się do tego agregatora po nazwie, aby uzyskać dostęp do jego wyników.
trigger_names Tablica zawierająca co najmniej 1 nazwę aktywatora, który powoduje ocenę tej agregacji.
opcjonalny
reset_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 o danych lub wyzwalacz warunkowy.
message_builder Określa dane do odczytania, przetworzenia i zagregowania. Pola wiadomości wyjściowej stają się wtedy źródłem danych dla innych agregatorów i raportów. Używa znaku field_assignments, a każde przypisanie określa pole w wiadomości wyjściowej.

Kreator wiadomości

Obiekt message_builder określa strukturę wiadomości wyjściowej i logikę agregacji używaną do obliczania jej pól. Jest on używany zarówno w agregatorach, jak i w 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 ten parametr zostanie pominięty, MCG utworzy niestandardowy typ wiadomości na podstawie field_assignmentswywnioskowanych typów danych wyjściowych. Używaj tego tylko wtedy, gdy kreator wiadomości jest częścią raportu o 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 listy 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 sposób obliczania wartości pola przez system. Zawiera te pola:

@type Funkcja agregująca.

  • avg, min, max, sum, stddev: standardowe statystyki matematyczne.
  • count: zlicza, ile razy ten agregator został wywołany.
  • delta: różnica między bieżącą a poprzednią wartością.
  • vector: Tworzy listę wartości (bufor pierścieniowy).
  • none: przekazuje nieprzetworzoną wartość.
expression Wyrażenie wejściowe dla agregacji. Wymagany w przypadku wszystkich typów agregacji z wyjątkiem count.
max_length Dotyczy tylko @type: "vector". Opcjonalna liczba całkowita, która ogranicza rozmiar wektora, tworząc bufor pierścieniowy.

Przykład: agregator

W tym przykładzie oblicz statystyki na podstawie raportów minutowych. Ten agregator jest wywoływany przez OnNewSpeed, aby obliczyć średnią prędkość (avg), liczbę odczytów (count) i zapisać 5 ostatnich wartości prędkości (vector). Ustaw reset_on_get na true. Spowoduje to zresetowanie statystyk za każdym razem, gdy MinuteReport je odczyta, i rozpocznie nowe okno 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
        }
      }
    ]
  }
}

Tworzenie danych wyjściowych

Aby zdefiniować ostateczny wynik kampanii telemetrycznej, dodaj obiekty do tablicy report_configs (concept). Te konfiguracje określają sposób pakowania przetworzonych danych i czas ich generowania. W jednej konfiguracji wskaźników możesz zdefiniować wiele konfiguracji raportów, aby ponownie wykorzystywać komponenty.

Generowaniem raportów możesz sterować za pomocą pola trigger_names. Możesz też użyć parametru report_initial, aby wygenerować raport natychmiast po aktywowaniu konfiguracji, oraz parametru 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"), aby odczytać wstępnie obliczone wartości z agregatora. Raporty są zwykle bezstanowymi migawkami, więc dzięki temu złożona logika stanowa pozostaje w agregatorach, a raporty służą do formatowania.

Pola obiektu konfiguracji raportu (element na liście report_configs)
name Unikalna nazwa raportu. Ta nazwa pojawi się w metadanych wygenerowanego raportu.
trigger_names Tablica nazw aktywatorów, które powodują wygenerowanie i opublikowanie raportu.
message_builder Więcej informacji znajdziesz w artykule Kreator wiadomości. Określa zawartość raportu. 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.
opcjonalne
report_incomplete
(domyślnie: `false`)
Wartość logiczna. Jeśli ma wartość „true”, system generuje raport końcowy po wyłączeniu lub zakończeniu zbierania danych, nawet jeśli brakuje danych.
opcjonalne
report_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 przykładzie. Jest on wywoływany przez EveryMinute. Odczytuje obliczoną średnią prędkość i liczbę odczytów z SpeedAggregator za pomocą none agregacji, 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, triggersreport_configs opis konfiguracji danych wymaga odniesienia do katalogu sygnałów. Możesz też uwzględnić pola opcjonalne, aby przypisać konkretny identyfikator UUID i zarządzać cyklem życia kolekcji.

Ustawianie identyfikatora UUID

Każdy element MetricsConfig wymaga unikalnego identyfikatora uniwersalnego (UUID). Jeśli podasz existing_uuid, MCG użyje tego adresu. W przeciwnym razie tworzy losowy. Aby zapewnić spójność w przypadku wdrożeń i narzędzi, określ existing_uuid.

Ciąg znaków musi być prawidłowym identyfikatorem UUID z łącznikami, który zawiera tylko małe litery.

"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",

Definicje sygnałów

Aby zweryfikować nazwy i typy sygnałów, MCG wymaga dostępu do katalogu sygnałów pojazdu. Jest to plik protobuf 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 pojazdów.

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 MetricsConfigokreśla, kiedy dane są faktycznie rejestrowane. System zarządzania kampanią wdraża i aktywuje konfigurację na urządzeniu, ale za pomocą wyzwalaczy cyklu życia możesz 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.

  • Sterowanie sesją (rozpoczęcie/wstrzymanie): użyj gestów start_trigger_namestop_trigger_name, aby określić, kiedy ma się odbywać zbieranie danych. Aby na przykład zbierać dane tylko podczas jazdy pojazdem, użyj IgnitionOn jako wyzwalacza rozpoczęcia i IgnitionOff jako wyzwalacza zakończenia. Konfiguracja pozostaje aktywna na urządzeniu, ale po uruchomieniu wyzwalacza zatrzymania zostaje „wstrzymana” (przestaje zbierać i przetwarzać dane), a wznawia działanie dopiero po ponownym uruchomieniu wyzwalacza rozpoczęcia.

    Ważne: to tylko wstrzymuje zbieranie danych. Nie definiuje ona okien logicznych, oddzielnych zbiorów danych ani 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 deactivate_trigger_name, jeśli konfiguracja ma być uruchamiana tylko raz (np. w celu wykrycia pierwszego wystąpienia określonego kodu błędu), a następnie ma się trwale dezaktywować na danym urządzeniu, nawet jeśli kampania jest technicznie nadal aktywna.

Jeśli nie określisz żadnych wyzwalaczy cyklu życia, zbieranie danych rozpocznie się natychmiast po aktywowaniu konfiguracji przez kampanię i będzie kontynuowane nieprzerwanie do zakończenia kampanii.

Pola cyklu życia najwyższego poziomu (obiekt główny)
opcjonalny
start_trigger_name
Nazwa wyzwalacza, który rozpoczyna sesję zbierania danych. Można ją ustawić bez stop_trigger_name.
opcjonalny
stop_trigger_name
Nazwa wyzwalacza, który wstrzymuje sesję zbierania danych (np. gdy pojazd jest nieruchomy). Jeśli jest ustawiona, musi być też ustawiona wartość start_trigger_name.
opcjonalny
deactivate_trigger_name
Nazwa reguły, która ostatecznie kończy i dezaktywuje cały obiekt `MetricsConfig`.

Zaawansowane: niestandardowe definicje protokołu

W 2 głównych przypadkach sam znak vs_version nie wystarczy, aby MCG zrozumiał wszystkie typy wiadomości w opisie konfiguracji danych:

  1. Błąd wnioskowania o typie: jak wyjaśniono w sekcji source_identifierformat, MCG nie może wywnioskować typu, gdy source_identifier używa FQIN lub nazwy niestandardowej.
  2. Wiadomości niestandardowe: opis konfiguracji danych zawiera wiadomości protobuf, których nie ma w katalogu VSIDL określonym w vs_version. Dzieje się tak, gdy ustawisz message_typemessage_builder w przypadku niestandardowego formatu raportu.

W takich przypadkach użyj data_source_message_types, aby pomóc MCG w określaniu typów, i descriptor_protos, aby podać definicje wiadomości.

data_source_message_types

Zmapuj source_identifier ciąg znaków na jego pełny typ wiadomości protobuf. Klucz w data_source_message_types musi być zgodny z wartością source_identifier z pozycji 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óre nie znajdują się w skonfigurowanym vs_version.

Przekaż zakodowany w standardzie base64 plik 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 co minutę raportu ze średnią prędkością pojazdu zaobserwowaną w ciągu tej minuty.

Komponenty:

  • źródło danych (SpeedSource) do pobierania danych o prędkości maksymalnie raz na sekundę;
  • Reguła danych (OnNewSpeed), która jest aktywowana, gdy SpeedSource wysyła dane.
  • Reguła okresowa (EveryMinute), która uruchamia się co 60 sekund.
  • Agregator (SpeedAggregator), który używa funkcji OnNewSpeed do obliczania średniej prędkości, zliczania odczytów i przechowywania ostatnich wartości, resetując się po odczytaniu.
  • Konfiguracja raportu (MinuteReport), która używa EveryMinute do wywoływania raportu zawierającego średnią prędkość i liczbę z SpeedAggregator.
  • Pola najwyższego poziomu (existing_uuid, vs_version) służące do identyfikowania konfiguracji danych i określania, którego katalogu VSIDL należy używać do definiowania sygnałów.

Po połączeniu te elementy tworzą pełny opis konfiguracji danych:

{
  "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 API MCG.

W sekcjach poniżej znajdziesz pełne informacje o konfiguracji danych. Skorzystaj z nich, aby utworzyć własny opis konfiguracji danych.

Pola najwyższego poziomu

{
  "existing_uuid": "00000000-0000-0000-0000-000000000000", // 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_name
source_name.field
source_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)
Arytmetyka +, -, *, /, %, ** standardowe obliczenia matematyczne, ** to potęgowanie.
Logiczne &&, ||, !, ^ AND, OR, NOT, XOR.
Relacyjne ==, !=, <, <=, >, >= ==!= działają w przypadku wszystkich typów. Inne wymagają liczb.
Wyświetl listę contains(list, item)
doesnotcontain(list, item)
alleq(list, value)
Działa na wektorach (tablicach). alleq(list, value) zwraca wartość true, jeśli wszystkie elementy w list są równe value.
Funkcje timestamp(clock_type) Aktualny czas w nanosekundach.
clock_type REALTIME_CLOCK lub
MONOTONIC_TIME_SINCE_BOOT_OR_RESUME
abs(n) Wartość bezwzględna
floor(n), round(n), ceil(n) Funkcje zaokrąglania
Kolejność wykonywania działań () Standardowe grupowanie na potrzeby pierwszeństwa