View this PageEdit this PageUploads to this PageVersions of this PageHomeRecent ChangesSearchHelp Guide

Apuntes sobre el stack del protocolo Dimetra (TETRA)

Overview


El protocolo lo que hace es encapsular los mensajes que se van a mandar por radio en un Servidor de Mensajes TETRA (SDR: Short Data Router) de manera que puedan viajar por una red TCP/IP sobre ethernet.

Motorola es el responsable del protocolo Dimetra SDTS (Short Data Transport Service).

Arquitectura de comunicación



+---------------------------------+
| Tren:                           |
| Aplicacion de Tectronic o Amper |
+---------------------------------+
                ^
                |
                | Protocolo SDS-TL
                |
                V
+---------------------------------+
| SDR:                            |
| Servidor de Motorola            |
+---------------------------------+
                ^
                |
                | Protocolo SDTS-CM
                |           SDTS-TL
                V
+---------------------------------+
| datos1_moviles:                 |
| Aplicacion de SICO              |
+---------------------------------+


Capas sobre TCP/IP


Son las que usamos para comunicarnos entre SICO y el SDR, ya que usamos una red ethernet.

  1. SDTS-CM: Adaptador a TCP/IP Lo que hace es poner la longitud total del mensaje en bytes, identificador de protocolo (el famoso 0xC0), el ISSI origen y destino, algunos bits poco importantes y por último el número de bits que le siguen: las que corresponden a las capas que "quedan".
  2. SDTS-TL: Identifica el mensaje, pone las confirmaciones, se encarga de la fiabilidad de extremo a extremo (como el TCP) tipo de PDU (es decir, el tipo de mensaje: de datos, report, ack, etc), flags de confirmación, periodo de validez, un forward address que no usamos, y la parte de DATOS-USUARIO

Capas sobre serie o radio


Son las que usa Tectronic en los trenes, que se comunican directamente por radio.

  1. SDS-TL Capa única con tan sólo tres tipos de mensaje: SDS-TL-TRANSFER/SDS-TL-REPORT/SDS-TL-ACK.

El contenido del SDTS-TL-TRANSFER es la siguiente
  • byte de identificador de protocolo
  • tipo de mensaje(si es un transfer, ack, etc) junto con los bits de flags (acuse de recibo, selección de servicio, almacenamiento permitido).
  • número de referencia del mensaje
  • DATOS-USUARIO

Equivalencias entre SDS-TL y SDTS-CM/TL


  • El tipo de protocolo que está en SDS-TL, queda para SDTS en el SDTS-CM
  • los bytes 4 y siguientes del SDS-TL son el byte 0 y siguientes de DATOS-USUARIO de SDTS-TL (es decir, lo que va detrás del forward address).

Implementación TETRA de SICO


Las capas están de la siguiente manera:

SDTS-CM: sdts-cm.h

typedef struct sdts_cm_data_ {
  unsigned char src[3];
  unsigned char dest[3];
  unsigned char app_id;
  unsigned char sds_type;
  unsigned char ref;
  unsigned char area;
  unsigned short len;
  char data;
} sdts_cm_data_t;

typedef struct sdts_cm_register_ sdts_cm_register_t;
typedef struct sdts_cm_report_ sdts_cm_report_t;

typedef struct sdts_cm_message_ {
  unsigned char type;
  union {
    sdts_cm_data_t cm_data;
    sdts_cm_register_t cm_register;
    sdts_cm_report_t cm_report;
  } cm __attribute__ ((packed));
} sdts_cm_message_t;

/* Estructuras para casos especiales O:-) */
typedef struct sdts_cm_register_ {
  in_addr_t ip;
  unsigned char issi[3];
  unsigned char reg_type;
  unsigned char status;
} sdts_cm_register_t;

typedef struct sdts_cm_report_ {
  unsigned char src[3];
  unsigned char dest[3];
  unsigned char app_id;
  unsigned char ref;
  unsigned char status;
} sdts_cm_report_t;


SDTS-TL: sdts-tl.h

typedef struct sdts_tl_data_ {
  unsigned char flags;
  unsigned char validity;
  unsigned char fwd_addr[3];
  char data;
} sdts_tl_data_t;

typedef struct sdts_tl_report_message {
  unsigned char status;
} sdts_tl_report_t;

typedef struct sdts_tl_message_ {
  unsigned char type;
  union {
    sdts_tl_data_t tl_data;
    sdts_tl_report_t tl_report;
  } tl __attribute__ ((packed));
} sdts_tl_message_t;


DATOS-USUARIO: app.h

typedef struct app_message_ {
  unsigned char unused[2];
  unsigned char type;
  unsigned char data[133];
} app_message_t;