-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprotocolo.txt
188 lines (113 loc) · 11.3 KB
/
protocolo.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
*********************************
** Protocolo registro de datos ** (borrador v0.1)
*********************************
El "centro" de todo es el registro Gps.
Usaremos un número de secuencia (SEC) de 4 bytes para cada entrada del registro (desde el 0x00000001 hasta el 0xFFFFFEFF, reservando 257 valores). Esto es independiente del tamaño de la memoria del localizador, que deberá ser capaz de traducir este direccionamiento virtual al físico (en la comunicación con el servidor se usará siempre el virtual).
El SEC es tan grande que es imposible que en el servidor haya 2 SECs iguales si no hay huecos (tardaría muchos años en dar la vuelta incluso aunque se usase un SEC por segundo).
Cada entrada del registro lleva obligatoriamente un SEC y una subtrama Gps. Adicionalmente puede llevar subtramas de sensores (incluído tacógrafo, canbus...). [en ppio. lo que venga de la placa de periféricos lo podemos enviar sin SEC ni subtrama Gps]
El SEC puede cambiar drásticamente si la memoria del localizador falla o se sustituye un localizador por otro. Cuando el servidor detecte este caso, ordenará al localizador que actualice su SEC al que tenía antes, ya que el servidor necesita que un número de secuencia no se repita en el sistema.
*********************************
***** Protocolo transmisión ***** (borrador v0.5)
*********************************
El formato de la trama de transporte es el mismo en ambos sentidos, no obstante hay dos salvedades:
- En sentido servidor a localizador, el máximo teórico es 1536 bytes, pero con algunos operadores no, por lo que pondremos un límite de 1465 bytes.
- En sentido servidor a localizador, el NS puede ser 0x00000000, para casos dónde es útil no indicar el NS del localizador (p.e. tramas "prefabricadas", órdenes de cambio de nserie que no tienen éxito...)
-Formato trama de transporte:
Start(1) Lon(2) NS(4) DATOS(n) CHK(1/2)
- Entre paréntesis se indica el nº de bytes
- Start: ecxx vvvv (e=bit extremista menor ,, c=CRC en vez de XOR ,, v=versión del protocolo) [en ppio. solo v]
- Lon: nº de bytes que vienen a continuación (incluído checksum); puede ser 0 (desconocida), en cuyo caso si el paquete no llega entero no se puede recomponer [en ppio. será así para las tramas que envía el localizador provenientes de su puerto serie]
- NS = Número de Serie (el localizador aceptará cualquier trama que contenga su NS o 0x00000000, aunque el servidor debe evitar usar esto)
- CHK: checksum de todo lo anterior; 1 byte si es XOR, 2 bytes si es CRC [en ppio. solo XOR]
- Datos: en sentido servidor a localizador tiene un tamaño máximo de 1456 bytes.
El formato de las trama de datos, es diferente en el sentido localizador a servidor, del de servidor a localizador.
LOCALIZADOR a SERVIDOR
--------------------------------------------
-Transmite a otro(s) puerto(s):
- UDP 4490 a 4497
- TCP 4480 a 4487
[en principio seguiremos con UDP y al puerto 4490]
-Formato trama de datos:
Una trama de datos se puede componer de varias subtramas de comandos/eventos, de igual o distinto tipo, una tras otra. Las subtramas pueden estar ordenadas de cualquier forma, salvo las de Gps, ya que dan su hora y posición a todas las que vengan después (hasta que aparezca otra de Gps).
El localizador decide cuántas subtramas quiere enviar en una trama de transporte (y por tanto su longitud).
Todo lo que envíe el localizador debe llevar una trama de Gps (excepto las tramas binarias de la placa de periféricos y las tramas internas -cosas irrelevantes para el cliente como tramas de reprogramación-).
- Comando(1) Lon(0/1/2) Datos(n) XOR(0/1)
- Lon: puede no existir, ser de 1 byte o de 2 (dependiendo del comando)
- Datos: es de longitud fija para algunos comandos y variable para otros
- XOR: puede no existir o ser de 1 byte (dependiendo del comando) [en ppio. no existirá para las tramas que envía el localizador provenientes de su puerto serie, ya que no provienen de su memoria y probablemente tengan también su propio checksum]
Relación de comandos:
- 0x04 = trama "compatible": tt(1) Datos(n) [no necesita ir acompañada de una trama Gps; además en transporte la longitud puede ser 0, si el localizador no la conoce y tiene que transmitirla "al vuelo"]
- tt: tipo de trama del sistema viejo (p.e. 58 para checksums, 43 para bloques eeprom, 64 para respuesta AT...)
- Datos: cualquier trama del sistema viejo
- NOTA: si usamos este comando para enviar la trama de IMEI "vieja", podemos mejorarla añadiendo el XOR del IMEI en el último nibble de los 8 bytes de IMEI.
- 0x06 = conexión: Lon(1) IMEI(15) IMEI_XOR(1) MO(1) VS(2) MC(1) [preferiblemente irá acompañando a una trama Gps] [tb. podría usar el formato "viejo" dentro de una trama compatible; en este caso tb. sería preferible que fuese precedida de una trama Gps]
-Lon: puede ser 0 (toma valor implícito) o >20 (cuando queramos añadir bytes nuevos)
-IMEI: podría ser guardado en Ascii en otra zona de la memoria (o en "hexa" por el método viejo, en el lugar "viejo")
-IMEI_XOR: XOR de los dígitos del IMEI (se alamcena con el mismo método que se almacene el IMEI)
-MO: Modo operación (0, 4, 5)
-VS: Versión Software
-MC: Motivo Conexión
- 0x0A = mensaje de texto puerto serie: Datos(n) [irá siempre acompañando a una trama Gps]
- Datos: formato Display (245 bytes máximo) = empieza siempre por "|" seguido por 2 dígitos con el tipo de datos ("TF", "DV", "AK"...) y termina siempre con 0x0D ,, Ejemplo de Datos "texto": "|TF" & texto (239 bytes máximo) & CHK_DISPLAY (2 bytes) & 0x0D.
- 0x0B = trama binaria puerto serie: Datos(n) [no necesita ir acompañada de una trama Gps; además en transporte la longitud puede ser 0, si el localizador no la conoce y tiene que transmitirla "al vuelo"]
- Datos: formato Binario (251 bytes máximo) = # LON LON Datos2 (247 bytes máximo) CHK
- 0x10 = Gps con hora humana: SEC(4) signo_lat+latitud(3) longitud(3) signo_longitud+rumbo(1) velocidad(1) fix+hdop(1) hora_humana(4)
- SEC es el número de secuencia del registro de datos del localizador
- signo_latitud(1 bit): Sur=1
- latitud: 7 bits de grado + 2 bytes de minutos multiplicados por 1000
- longitud: 8 bits de grado + 2 bytes de minutos multiplicados por 1000
- signo_longitud(1 bit): Oeste=1
- rumbo(7 bits) = (rumbo_real/4 => de 0º a 90º)
- velocidad en nudos
- fix: 1 bit
- hdop: 7 bits
- hora_humana: año (6 bits) + mes (4 bits) + día (5 bits) + hora (5 bits) + min (6 bits) + seg (6 bits) ,, puede escogerse una ordenación diferente que sea mejor para el microcontrolador
- 0x11 = Gps con hora epoch unix: SEC(4) signo_lat+latitud(3) longitud(3) signo_longitud+rumbo(1) velocidad(1) fix+hdop(1) hora_epoch(4)
- es idéntica a 0x10 pero la fecha y hora son los segundos transcurridos desde 1/1/1970 0h UTC.
- 0x12 = hora RTC: epoch(4) ,, p.e. la hora del tacógrafo; aún así conviene que vaya acompañada de 0x10 o 0x11 para calcular la deriva del RTC (además de para localizar los datos)
- 0xAs = sonda analógica: signo+divisor+lon(1) valor(n)
- s = nº de sonda
- signo+divisor+lon: signo(1bit) es 1 si valor es negativo ,, divisor(3 bits) es la potencia de 10 por la que hay que dividir el valor (así siempre enviamos enteros) ,, lon(4 bits) es el nº de bytes de valor
- 0xDsssv = sensor digital de 2 estados: (1 byte)
- s(3 bits)=número_sensor: 0=contacto real, 1=S1, 2=S2, 3=S3, ..., 7=S7
- v(1 bit)=valor (booleano)
- 0xEsssv = sensor digital de 2 estados: (1 byte)
- s(3 bits)=número_sensor: 0=S8, 1=S9, 2=S10, 3=S11, 4=S12, 5=S13, 6=sensor_movimiento, 7=contacto_simulado
- v(1 bit)=valor (booleano)
Ejemplos:
- Gps "humano" (lat=42,22 lon=-8,65 rumbo=67º velocidad=60nudos fix=1 hdop=12 fh=20131231235959):
00 0017 NSNSNSNS 10 00000001 2A3390 089858 91 3C 8C FHFHFHFH XO
- Gps "epoch" (lat=42,22 lon=-8,65 rumbo=67º velocidad=60nudos fix=1 hdop=12 fh=20131231235959) + contacto=on + S1=off + S.A.1=-15.34ºC:
00 001F NSNSNSNS 10 00000001 2A3390 089858 91 3C 8C 52C35A7F D001 D100 A1A205FE XO
- Gps + mensaje de texto puerto serie (|YT):
00 002E NSNSNSNS 10 00000001 2A3390 089858 91 3C 8C 52C35A7F 0A 7C59543031333735313032333136373230303144340D XO
- trama binaria puerto serie (asentimiento binario):
00 000C NSNSNSNS 0B 230003999730 XO
- trama compatible (bloque 1):
00 0102 NSNSNSNS 04 2B 010400D6000000FFFF55FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF351777040553248000060079A43C0505000000173C000000000600008240FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C0001FF1E0000000505000040000000010101FF01010001000003FF00FF003200FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF012301FF02FF02FF020F0203FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF001200FF01FF01FF01FF01FF01FF01FF0101 XO
DUDA: ¿añadimos XOR a las tramas de Gps? (tendría que estar escrito tb. en la memoria)
DUDA: ¿añadimos XOR a las tramas de sensor analógico? (tendríamos que reducir 1 bit el divisor y 2 la longitud, para implementar ¡un checksum de 3 bits!)
SERVIDOR a LOCALIZADOR
--------------------------------------------
Cada trama de datos solo llevará una subtrama de comando, para facilitar la tarea al localizador.
-Formato trama de datos:
- Comando(1) Lon(1/2) Datos(n)
- Lon: puede ser de 1 byte o de 2 (dependiendo del comando)
- Datos: es de longitud fija para algunos comandos y variable para otros (1453 bytes máximo)
Relación de comandos:
- 0xE1 = pet. registro datos: Lon(1) SEC_ini(4) SEC_fin(4)
-Lon: puede ser 0 (toma valor implícito) o >8 (cuando queramos añadir bytes nuevos)
- 0xE2 = escribe byte: Lon(1) Pos(2) Valor(1)
-Lon: puede ser 0 (toma valor implícito) o >3 (cuando queramos añadir bytes nuevos)
- 0xE3 = cambio SEC: Lon(1) SECnuevo(4)
-Lon: puede ser 0 (toma valor implícito) o >4 (cuando queramos añadir bytes nuevos)
- 0xE5 = puerto serie corta: Lon-1(1) Datos(256 bytes máximo)
-Tiene variante para tramas más largas (0xF5)
- 0xE8 = control remoto: Lon(1) Orden(1)
-Lon: puede ser 0 (toma valor implícito) o >2 (cuando queramos añadir bytes nuevos)
-Orden: 1=resetea, 2=resetea y conecta
- 0xE9 = cambio nserie: Lon(1) NSnuevo(4)
-Lon: puede ser 0 (toma valor implícito) o >4 (cuando queramos añadir bytes nuevos)
- 0xEA = pet. ckecksums: Lon(1) BL_ini(2) BL_fin(2)
-Lon: puede ser 0 (toma valor implícito) o >4 (cuando queramos añadir bytes nuevos)
DUDA: ¿agrupamos tramas con similar funcionalidad?: p.e. añadir a "comando remoto" los casos: "apagado", "comando at", "poner en hora RTC", "cambio nserie", "cambio SEC" ¿y "fin reprogr."?.