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.
| Caratteristica | S21L (Huabao 4G) | G11LSE (GT06) | C059 (JT708) |
|---|---|---|---|
| Modello Dati | Monolitico | Modulare | Ibrido |
| Payload | Un 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). |
| Overhead | Basso (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:
- Un pacchetto Heartbeat (
0x23) con livello voltaggio. - 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β
| Feature | S21L | G11LSE | C059 |
|---|---|---|---|
| ComplessitΓ Parsing | Alta (Bitmask + TLV) | Media (Switch case su Type) | Media (Simile a S21L) |
| AffidabilitΓ GPS | Alta (Sempre associata agli eventi) | Media (Eventi a volte senza GPS) | Alta |
| Diagnostica | Eccellente (Codici DTC, PID OBD) | Limitata (Solo base) | Buona (Messaggi dedicati) |
| Setup Server | Porta 5021 | Porta 5006 | Porta 5059 |
| Utilizzo Ideale | Flotte pesanti, Telemetria avanzata | Tracker economici, Auto private | Veicoli 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 }