Gravar um arquivo de mapeamento SOME/IP

Este documento orienta você na criação de um arquivo de mapeamento SOME/IP. Um arquivo de mapeamento SOME/IP define como os serviços SDV são mapeados para serviços SOME/IP e vice-versa, facilitando a comunicação entre ECUs SDV e não SDV.

O campo some_ip_mapping na mensagem VsidlEntry do arquivo .vsidl contém as informações de mapeamento do SOME/IP. O campo some_ip_mapping permite definir mapeamentos SOME/IP separadamente das definições de serviço SDV.

O SomeIp Mapping proto contém todas as informações necessárias para o broker SOME/IP para transformações entre SDV e ECUs SOME/IP. Esse proto pode mapear um serviço SOME/IP para o ecossistema SDV ou unidades de serviço SDV para o ecossistema AUTOSAR.

Principais conceitos

Antes de escrever seu arquivo de mapeamento, entenda estes conceitos e identificadores principais:

  • Nome de instância totalmente qualificado (FQIN) do SDV: essa string exclusiva identifica instâncias de serviço do SDV. Ele é composto pelo nome da VM, do pacote, do serviço e da instância.

  • Tipo de SDV:esse nome é um identificador exclusivo do formato de dados de uma carga útil de mensagem SDV e corresponde a uma mensagem proto.

  • SOME/IP ServiceIdentifier (SOME/IP SID): identifica exclusivamente serviços SOME/IP com uma combinação de ID do serviço (uint16), ID da instância (uint16), versão principal (uint8) e versão secundária (uint32).

  • RPC do SDV:métodos oferecidos pelos serviços do SDV, identificados por method name (string), o Type que o contém e um nome channel.

  • Pub/Sub do SDV:tópicos publicados ou assinados por serviços do SDV e identificados por um nome Type e Topic

  • RPC SOME/IP:identificada pelo ID do serviço, ID da instância e ID do método (uint16).

  • Eventos SOME/IP:publicados por serviços SOME/IP para Pub/Sub e identificados por ID de serviço, ID de instância, ID de evento (uint16) e pertencentes a um grupo de eventos (uint16).

  • Broker SOME/IP:um componente de ponte no SDV que consome o arquivo de mapeamento SOME/IP para ativar a comunicação entre o SDV e os serviços SOME/IP.

Estrutura e local do arquivo

As informações de mapeamento do SOME/IP são incluídas como um campo repetido, some_ip_mapping, na mensagem VsidlEntry do arquivo .vsidl. Isso permite que os mapeamentos SOME/IP sejam definidos separadamente das definições de serviço SDV, permitindo que você gerencie os mapeamentos em um arquivo 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;
}

Criar um arquivo de mapeamento

Um arquivo de mapeamento SOME/IP geralmente contém definições que traduzem entre o ecossistema SDV e o protocolo de rede SOME/IP. É possível definir mapeamentos de duas maneiras principais:

  • sdv_type_mapping: mapeia um tipo de SDV (como uma interface RPC ou um tópico de publicação) para um serviço SOME/IP.
  • someip_service_mapping: mapeia um serviço SOME/IP bruto (e suas instâncias, eventos ou métodos) para tópicos do Pub/Sub do SDV ou canais RPC.

Um único arquivo de mapeamento consiste em uma ou mais definições de SomeIpMapping.

Mapeamento de tipo de SDV

sdv_type_mapping é para tipos de SDV atuais que você quer expor à rede SOME/IP.

Estrutura de mapeamento de tipo de SDV

Você precisa especificar:

  • unit_type: o tipo de SDV que está sendo mapeado (identificado por package_name e type_name).
  • someip_service_id: o ID do serviço SOME/IP de 16 bits.
  • version_major e version_minor: o controle de versões do serviço SOME/IP.
  • service_oriented_mapping: define o comportamento de mapeamento específico (para uma interface RPC ou uma publicação).

Exemplo de mapeamento de publicação

Se o tipo de SDV for um tópico (publicação), use publication_mapping. Isso mapeia a estrutura dos dados (type_definition) e o ID do evento SOME/IP ou o ID do EventGroup, seguido do mapeamento de tópicos específicos de SDV para instâncias 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
      }
    }
  }
}

Exemplo de mapeamento de interface RPC

Se o tipo de SDV for uma interface RPC, use rpc_interface_mapping. Mapeie os nomes de procedimentos do SDV para as instâncias method_id do SOME/IP e vincule os canais do SDV às instâncias do 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
      }
    }
  }
}

Mapeamento de serviços SOME/IP

someip_service_mapping configura como um serviço SOME/IP específico (descoberto ou oferecido na rede) é mapeado em tópicos e canais do SDV. Ele permite mapeamentos parametrizados complexos de eventos e RPCs.

Estrutura de mapeamento de serviços SOME/IP

  • someip_service_id, version_major, version_minor: identificam o serviço SOME/IP.
  • sd_behavior (opcional): define o comportamento de descoberta de serviços (EXACT_OR_ANY_MINOR_VERSION ou MINIMUM_MINOR_VERSION)

  • instance: parametriza unidades de serviço e tópicos de SDV para instâncias específicas de instance_id SOME/IP.

  • instance_impl: descreve a implementação da instância, mapeando eventos ou métodos para as unidades de serviço parametrizadas.

Exemplo de mapeamento de eventos

Este exemplo mapeia um evento SOME/IP para um tópico SDV. Ele usa instance para mapear o ID 1 para a string 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) ...
        }
      }
    }
  }
}

Exemplo de mapeamento de RPC

Este exemplo mapeia um serviço RPC SOME/IP para uma interface RPC SDV. Assim como os mapeamentos de eventos, o serviço usa a instância para parametrizar o nome da unidade de serviço. Isso corresponde ao nome do canal RPC no SDV. O bloco instance_impl define uma instância de offered_interface para vincular o method_id SOME/IP ao nome do procedimento 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
      }
    }
  }
}

Recursos avançados

Esta seção descreve os recursos avançados compatíveis com o mapeamento SOME/IP.

Eventos em grupo

O group_event permite que um único evento SOME/IP seja dividido e mapeado para vários tópicos de SDV simultaneamente. Isso é feito especificando várias entradas event_part e usando field_name_mapping para mapear os nomes de campo de payload SOME/IP de entrada para os nomes de campo de payload 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"
      }
    }
  }
}

Mapeamentos de execução e esquecimento

Alguns métodos fire and forget (F&F) do SOME/IP não têm um equivalente direto nas interfaces SDV RPC. Em vez disso, eles são invocados mapeando um tópico SDV (publicação) para o método F&F usando publication_mapping. Quando os dados são publicados no tópico SDV correspondente, o broker os traduz em uma chamada de método F&F do SOME/IP.

Para configurar isso, defina someip_ff_methods: true no bloco offered_topic e forneça os detalhes de roteamento fire_and_forget_method de destino dentro do 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
        }
      }
    }
  }
}