Skip to main content

Confronto Tecnico Protocolli: S21L vs G11LSE vs C059

Questa pagina analizza nel dettaglio le differenze architetturali e implementative tra i tre principali protocolli supportati da Visla.

🧠 Filosofia Architetturale​

La differenza fondamentale risiede nel modo in cui i dati vengono impacchettati e trasmessi.

CaratteristicaS21L (Huabao 4G)G11LSE (GT06)C059 (JT708)
Modello DatiMonoliticoModulareIbrido
PayloadUn unico pacchetto Location contiene TUTTO (GPS, Allarmi, Stato, Sensori).Tipi di messaggio distinti per ogni evento (Alarm, Heartbeat, Status).Simile a S21L, con alcuni messaggi dedicati (Testo, Diagnostica).
OverheadBasso (meno pacchetti, payload piΓΉ grandi).Medio/Alto (molti piccoli pacchetti).Basso.
EstensibilitΓ Altissima (TLV dinamici).Media (dipende dalla variante HW).Alta.

πŸ“¦ Struttura del Frame a Confronto​

Analizziamo come un byte-stream grezzo viene interpretato dai decoder.

S21L & C059 (Simili)​

Utilizzano un delimitatore 0x7E e un meccanismo di escape per evitare che il delimitatore appaia nel payload.

// Esempio struttura S21L/C059
7E [Tipo:2] [Attr:2] [ID:6] [Seq:2] [PAYLOAD... 0x7D 0x02 ...] [CS:1] 7E

Codice Decoder (S21L):

// S21lFrameDecoder.java
if (delim != 0x7E && delim != 0xE7) return; // Sync
ByteBuf raw = in.readSlice(endIndex);
ByteBuf frame = unescapeFrame(raw); // Rimuove 0x7D escape
// ... decodeMessage(frame)

G11LSE (GT06)​

Utilizza header fissi 0x7878 (corto) o 0x7979 (lungo) e lunghezza esplicita. Niente escape.

// Esempio struttura G11LSE
78 78 [Len:1] [Tipo:1] [PAYLOAD...] [Seq:2] [CRC:2] 0D 0A

Codice Decoder (G11LSE):

// G11lseFrameDecoder.java
if (header == 0x7878) {
length = in.getUnsignedByte(index + 2);
} else if (header == 0x7979) {
length = in.getUnsignedShort(index + 2);
}
// NESSUN unescape necessario. Si legge la lunghezza fissa.

🚨 Gestione Eventi e Allarmi​

Qui la differenza Γ¨ sostanziale e impatta come il backend deve processare i dati.

Scenario: "Batteria Bassa e Veicolo in Movimento"​

🟒 S21L (Unico Messaggio)​

Il dispositivo invia un solo pacchetto 0x0200 (Location). Nel campo Alarm Flag (4 byte), accende il bit LowBattery.

// S21lFrameDecoder.java -> decodeLocation
long alarm = buf.readUnsignedInt(); // Legge 32 bit di flag

if ((alarm & 0x00020000) != 0) {
position.addAlarm("lowBattery");
}
// Il resto del pacchetto contiene Lat, Lon, Speed, etc.
// Risultato: 1 Posizione con attributo 'alarm: lowBattery'

🟑 G11LSE (Messaggi Multipli o Specifici)​

Il dispositivo potrebbe inviare:

  1. Un pacchetto Heartbeat (0x23) con livello voltaggio.
  2. Un pacchetto Alarm dedicato (0x95) OPPURE un pacchetto Status con bit di allarme.
// G11lseFrameDecoder.java
switch (type) {
case MSG_HEARTBEAT:
// Aggiorna solo stato batteria, NO posizione GPS
break;

case MSG_ALARM:
// Pacchetto specifico che dice "SONO IN ALLARME"
// Spesso NON ha coordinate GPS precise, o usa l'ultima nota.
decodeAlarm(position);
break;
}

Nota: In G11LSE, un allarme potrebbe arrivare senza coordinate aggiornate se il GPS non ha fix in quel momento preciso, mentre S21L tende ad aspettare di avere un pacchetto completo.


πŸ“Š Estensione Dati (Telemetria)​

Come vengono aggiunti nuovi sensori (es. Temperatura)?

S21L (TLV Dinamici)​

Usa il concetto standard Tag-Length-Value. Il decoder cicla finchΓ© ci sono dati.

// S21L Loop di estensioni
while (buf.readableBytes() > 0) {
int tag = buf.readUnsignedByte();
int len = buf.readUnsignedByte();

switch(tag) {
case 0x01: pos.setOdometer(readInt()); break;
case 0x02: pos.setFuel(readShort()); break;
case 0x51: pos.setTemp(readByte()); break; // Aggiungere questo Γ¨ banale
}
}

G11LSE (Varianti Hardcoded)​

Non c'Γ¨ un vero standard dinamico. Ogni produttore (Wanway, Concox, etc.) inventa la sua variante del pacchetto.

// G11LSE Riconoscimento Variante
if (type == MSG_GPS_LBS_1 && length == 0x24) {
variant = Variant.VXT01; // Ha questi campi specifici
} else if (length == 0x2B) {
variant = Variant.S5; // Ha sensore carburante in posizione fissa
}

// Parsing rigido basato sulla variante
if (variant == Variant.S5) {
// Leggi byte al offset 15 per il carburante
}

πŸš€ Tabella Riassuntiva per Sviluppatori​

FeatureS21LG11LSEC059
ComplessitΓ  ParsingAlta (Bitmask + TLV)Media (Switch case su Type)Media (Simile a S21L)
AffidabilitΓ  GPSAlta (Sempre associata agli eventi)Media (Eventi a volte senza GPS)Alta
DiagnosticaEccellente (Codici DTC, PID OBD)Limitata (Solo base)Buona (Messaggi dedicati)
Setup ServerPorta 5021Porta 5006Porta 5059
Utilizzo IdealeFlotte pesanti, Telemetria avanzataTracker economici, Auto privateVeicoli commerciali leggeri

Esempio Pratico di Log​

S21L (Unico messaggio ricco):

{
"type": "buffers",
"protocol": "s21l",
"alarms": ["overspeed", "lowBattery"],
"attributes": {
"fuel": 45.5,
"temp": 85,
"odometer": 120500
},
"lat": 45.123,
"lon": 9.456
}

G11LSE (Sequenza di messaggi):

// Messaggio 1
{ "type": "heartbeat", "battery": 3.7 }

// Messaggio 2 (subito dopo)
{ "type": "alarm", "alarm": "overspeed" }

// Messaggio 3
{ "type": "gps", "lat": 45.123, "lon": 9.456 }