Cómo escribir un archivo de asignación de SOME/IP

En este documento, se explica cómo escribir un archivo de asignación de SOME/IP. Un archivo de asignación de SOME/IP define cómo los servicios de SDV se asignan a los servicios de SOME/IP y viceversa, lo que facilita la comunicación entre las ECU de SDV y las que no son de SDV.

El campo some_ip_mapping dentro del mensaje VsidlEntry en tu archivo .vsidl contiene la información de asignación de SOME/IP. El campo some_ip_mapping te permite definir asignaciones de SOME/IP por separado de las definiciones de servicio de SDV.

El proto SomeIp Mapping contiene toda la información que el agente de SOME/IP necesita para las transformaciones entre las ECU de SDV y SOME/IP. Este proto puede asignar un servicio de SOME/IP al ecosistema de SDV o unidades de servicio de SDV al ecosistema de AUTOSAR.

Conceptos básicos

Antes de escribir tu archivo de asignación, comprende estos identificadores y conceptos clave:

  • Nombre de instancia completamente calificado (FQIN) de SDV: Esta cadena única identifica las instancias de servicio de SDV. Se compone del nombre de la VM, el nombre del paquete, el nombre del servicio y el nombre de la instancia.

  • Tipo de SDV: Este nombre es un identificador único para el formato de datos de una carga útil de mensaje de SDV y corresponde a un mensaje proto.

  • SOME/IP ServiceIdentifier (SID de SOME/IP): Identifica de forma única los servicios de SOME/IP con una combinación de ID de servicio (uint16), ID de instancia (uint16), versión principal (uint8) y versión secundaria (uint32).

  • RPC de SDV: Métodos que ofrecen los servicios de SDV, identificados por method name (cadena), el Type que contiene y un nombre channel.

  • Pub/Sub de SDV: Temas publicados o a los que se suscriben los servicios de SDV y que se identifican con un nombre Type y Topic.

  • RPC de SOME/IP: Se identifica por el ID de servicio, el ID de instancia y el ID de método (uint16).

  • Eventos de SOME/IP: Publicados por servicios de SOME/IP para Pub/Sub y que se identifican por el ID de servicio, el ID de instancia, el ID de evento (uint16) y que pertenecen a un grupo de eventos (uint16).

  • Agente de SOME/IP: Un componente de puente en SDV que consume el archivo de asignación de SOME/IP para habilitar la comunicación entre los servicios de SDV y SOME/IP.

Estructura y ubicación del archivo

La información de asignación de SOME/IP se incluye como un campo repetido, some_ip_mapping, dentro del mensaje VsidlEntry en tu archivo .vsidl. Esto permite que las asignaciones de SOME/IP se definan por separado de las definiciones de servicio de SDV, lo que te permite administrar las asignaciones en un archivo dedicado.

// The root message for VSIDL files.
message VsidlEntry {
  // Required. Package name for entities mentioned in the file.
  string package = 1;
  // List of SDV service bundles defined in the file.
  repeated ServiceBundle sdv_service_bundle = 2;
  // Enables custom extensions beyond the standard VSIDL model.
  repeated google.xml.Any extension = 3;

  // SOMEIP mapping rules.
  repeated sdv.someip.v1.SomeIpMapping some_ip_mapping = 4;
  // VHAL mapping rules.
  repeated VhalMapping vhal_mapping = 5;
}

Crea un archivo de asignación

Por lo general, un archivo de asignación de SOME/IP contiene definiciones que traducen entre el ecosistema de SDV y el protocolo de red SOME/IP. Puedes definir asignaciones de dos maneras principales:

  • sdv_type_mapping: Asigna un tipo de SDV (como una interfaz RPC o un tema de publicación) a un servicio de SOME/IP.
  • someip_service_mapping: Asigna un servicio de SOME/IP sin procesar (y sus instancias, eventos o métodos) a temas de Pub/Sub de SDV o canales RPC.

Un solo archivo de asignación consta de una o más definiciones SomeIpMapping.

Asignación de tipos de SDV

sdv_type_mapping es para los tipos de SDV existentes que deseas exponer a la red SOME/IP.

Estructura de asignación de tipos de SDV

Deberás especificar lo siguiente:

  • unit_type: El tipo de SDV que se asigna (identificado por package_name y type_name).
  • someip_service_id: El ID de servicio de SOME/IP de 16 bits.
  • version_major y version_minor: El control de versiones del servicio de SOME/IP.
  • service_oriented_mapping: Define el comportamiento de asignación específico (ya sea para una interfaz RPC o una publicación).

Ejemplo de asignación de publicación

Si tu tipo de SDV es un tema (publicación), usa publication_mapping. Esto asigna la estructura de los datos (type_definition) y el ID de evento o el ID de EventGroup de SOME/IP, seguido de la asignación de temas de SDV específicos a instancias de SOME/IP.

sdv_type_mapping {
  unit_type {
    package_name: "com.android.sdv.samples"
    type_name: "SpeedData"
  }
  someip_service_id: 0x1001
  version_major: 1
  version_minor: 0
  service_oriented_mapping {
    publication_mapping {
      offered_topic {
        simple_mapping {
          group_id: 1
          event_id: 0x8001
        }
        # type_definition defines the structural mapping to SOME/IP payloads
        type_definition {
          # ... (SomeIpStruct definition) ...
        }
      }
      # Maps the SDV topic name to a specific SOME/IP instance
      topic_mapping {
        topic: "vehicle_speed_topic"
        instance_id: 0x0001
      }
    }
  }
}

Ejemplo de asignación de interfaz RPC

Si tu tipo de SDV es una interfaz RPC, usa rpc_interface_mapping. Asigna los nombres de los procedimientos de SDV a las instancias method_id de SOME/IP y vincula los canales de SDV a las instancias de SOME/IP.

sdv_type_mapping {
  unit_type {
    package_name: "com.android.sdv.samples"
    type_name: "DoorControl"
  }
  someip_service_id: 0x2001
  version_major: 1
  version_minor: 0
  service_oriented_mapping {
    rpc_interface_mapping {
      offered_interface {
        method {
          procedure: "LockDoors"
          method_id: 0x0001
          # request_payload_mapping and response_payload_mapping can be defined here
        }
      }
      rpc_channel_mapping {
        channel: "front_doors"
        instance_id: 0x0001
      }
    }
  }
}

Asignación de servicios de SOME/IP

someip_service_mapping configura cómo un servicio de SOME/IP específico (descubierto o ofrecido en la red) se asigna a temas y canales de SDV. Permite asignaciones complejas con parámetros de eventos y RPCs.

Estructura de asignación de servicios de SOME/IP

  • someip_service_id, version_major, version_minor: Identifica el servicio de SOME/IP.
  • sd_behavior (opcional): Define el comportamiento de descubrimiento de servicios (EXACT_OR_ANY_MINOR_VERSION o MINIMUM_MINOR_VERSION).

  • instance: Parametriza las unidades de servicio y los temas de SDV para instancias instance_id de SOME/IP específicas.

  • instance_impl: Describe la implementación de la instancia, asignando eventos o métodos a las unidades de servicio con parámetros.

Ejemplo de asignación de eventos

En este ejemplo, se asigna un evento de SOME/IP a un tema de SDV. Usa instance para asignar el ID 1 a la cadena literal speed_sensor_unit.

someip_service_mapping {
  someip_service_id: 0x1001
  version_major: 1
  version_minor: 0
  # Parameterize instances
  instance {
    instance_id: 0x0001
    sdv_service_unit_parameterization {
      key: 1
      value: "speed_sensor_unit"
    }
    sdv_topic_parameterization {
      key: 1
      value {
        topic: "speed_topic"
        capacity: 10
      }
    }
  }
  # Description of all instances
  instance_impl {
    offered_event {
      group_id: 1
      event_id: 0x8001
      simple_event {
        sdv_unit_type {
          package_name: "com.android.sdv.samples"
          type_name: "SpeedData"
        }
        # Refers to key 1 in sdv_service_unit_parameterization. If unspecified,
        # service unit name will be automatically generated by the broker
        service_unit: 1
        topic: 1        # Refers to key 1 in sdv_topic_parameterization
        message_translation_mode: REFLECTION
        type_definition {
          # ... (SomeIpStruct definition) ...
        }
      }
    }
  }
}

Ejemplo de asignación de RPC

En este ejemplo, se asigna un servicio RPC de SOME/IP a una interfaz RPC de SDV. Al igual que las asignaciones de eventos, el servicio usa la instancia para parametrizar el nombre de la unidad de servicio. Esto corresponde al nombre del canal RPC en SDV. Luego, el bloque instance_impl define una instancia de offered_interface para vincular el method_id de SOME/IP al nombre del procedimiento de SDV:

someip_service_mapping {
  someip_service_id: 0x2001
  version_major: 1
  version_minor: 0
  # Parameterize instances
  instance {
    instance_id: 0x0001
    sdv_service_unit_parameterization {
      key: 1
      value: "door_control_unit"
    }
  }
  instance_impl {
    offered_interface {
      sdv_unit_type {
        package_name: "com.android.sdv.samples"
        type_name: "DoorControl"
      }
      # Refers to key 1 in sdv_service_unit_parameterization. This corresponds
      # to the RPC channel name in SDV.
      service_unit: 1
      method {
        procedure: "LockDoors"
        method_id: 0x0001
     # request_payload_mapping and response_payload_mapping can be defined here
      }
    }
  }
}

Funciones avanzadas

En esta sección, se describen las funciones avanzadas que admite la asignación de SOME/IP.

Eventos grupales

group_event permite que un solo evento de SOME/IP se divida y se asigne a varios temas de SDV de forma simultánea. Para ello, se especifican varias entradas event_part y se usa field_name_mapping para asignar los nombres de los campos de carga útil de SOME/IP entrantes a los nombres de los campos de carga útil de SDV:

offered_event {
  group_id: 1
  event_id: 0x8002
  group_event {
    type_definition {
      # Definition of the complete SOME/IP payload
    }
    event_part {
      sdv_unit_type {
        package_name: "com.android.sdv.samples"
        type_name: "PartAData"
      }
      service_unit: 1
      topic: 1
      field_name_mapping {
        key: "someip_field_a"
        value: "sdv_field_a"
      }
    }
    event_part {
      sdv_unit_type {
        package_name: "com.android.sdv.samples"
        type_name: "PartBData"
      }
      service_unit: 2
      topic: 2
      field_name_mapping {
        key: "someip_field_b"
        value: "sdv_field_b"
      }
    }
  }
}

Asignaciones de enviar y olvidar

Los métodos de enviar y olvidar (F&F) de SOME/IP no tienen un equivalente directo en las interfaces RPC de SDV. En cambio, se invocan asignando un tema de SDV (publicación) al método F&F con publication_mapping. Cuando se publican datos en el tema de SDV correspondiente, el agente los traduce a una llamada de método F&F de SOME/IP.

Para configurar esto, debes establecer someip_ff_methods: true dentro del bloque offered_topic y proporcionar los detalles de enrutamiento fire_and_forget_method de destino dentro de tu topic_mapping.

sdv_type_mapping {
  unit_type {
    package_name: "com.android.sdv.sample.someip"
    type_name: "CounterLoad"
  }
  someip_service_id: 0x13
  version_major: 1
  version_minor: 0
  service_oriented_mapping {
    publication_mapping {
      offered_topic {
        type_definition {
          # ... (SomeIpStruct definition) ...
        }
        someip_ff_methods: true
      }
      topic_mapping {
        topic: "counter-load-start-counter"
        instance_id: 0x1
        fire_and_forget_method {
          service_id: 0x3700
          instance_id: 0x1000
          version_major: 1
          version_minor: 0
          method_id: 0x1000
        }
      }
    }
  }
}