Skip to main content

Decoder Microservice - Architecture & Flow

Overview​

Il Decoder Γ¨ il microservizio che riceve dati GPS dai dispositivi tracker, li decodifica e li pubblica su Redis per il processing downstream.

πŸ“‚ Struttura Package​

com.visla.decoder/
β”œβ”€β”€ Main.java # Entry point
β”œβ”€β”€ MainModule.java # Dependency Injection
β”‚
β”œβ”€β”€ server/ # Gestione server TCP/UDP
β”‚ β”œβ”€β”€ ServerManager.java # Registra tutti i protocolli
β”‚ β”œβ”€β”€ TrackerServer.java # Server TCP/UDP per protocollo
β”‚ β”œβ”€β”€ TrackerConnector.java # Interfaccia connettore
β”‚ └── TrackerClient.java # Client outbound (opzionale)
β”‚
β”œβ”€β”€ pipeline/ # Pipeline Netty
β”‚ β”œβ”€β”€ BasePipelineFactory.java # Costruisce pipeline handler
β”‚ β”œβ”€β”€ PipelineBuilder.java # Builder per pipeline
β”‚ β”œβ”€β”€ ProcessingHandler.java # Pubblica su Redis
β”‚ β”œβ”€β”€ NetworkMessage.java # Wrapper messaggio rete
β”‚ β”œβ”€β”€ BufferingManager.java # Riordino posizioni
β”‚ β”œβ”€β”€ MediaManager.java # Gestione foto/video
β”‚ └── network/ # Handler Netty
β”‚ β”œβ”€β”€ MainEventHandler.java
β”‚ β”œβ”€β”€ AcknowledgementHandler.java
β”‚ └── ...
β”‚
β”œβ”€β”€ frame/ # Frame decoders
β”‚ β”œβ”€β”€ BaseFrameDecoder.java # Base per split messaggi
β”‚ β”œβ”€β”€ CharacterDelimiterFrameDecoder.java
β”‚ └── ExtendedObjectDecoder.java
β”‚
β”œβ”€β”€ protocol/ # Protocolli GPS
β”‚ β”œβ”€β”€ base/ # Classi base
β”‚ β”‚ β”œβ”€β”€ Protocol.java
β”‚ β”‚ β”œβ”€β”€ BaseProtocol.java
β”‚ β”‚ β”œβ”€β”€ BaseProtocolDecoder.java
β”‚ β”‚ └── BaseProtocolEncoder.java
β”‚ β”‚
β”‚ β”œβ”€β”€ s21l/ # S21L (porta 5052) βœ…
β”‚ β”œβ”€β”€ g11lse/ # G11L-SE (porta 5058) βœ…
β”‚ β”œβ”€β”€ c059/ # C059 (porta 5059) βœ…
β”‚ β”œβ”€β”€ p5/ # P5 (porta 5054) βœ…
β”‚ β”œβ”€β”€ huabao/ # Base per S21L, P5, C003...
β”‚ β”œβ”€β”€ gt06/ # Base per G11LSE, R12L...
β”‚ └── ... # Altri protocolli
β”‚
β”œβ”€β”€ model/ # Modelli dati
β”‚ β”œβ”€β”€ Position.java # Posizione GPS
β”‚ β”œβ”€β”€ Device.java # Dispositivo
β”‚ β”œβ”€β”€ Command.java # Comando da inviare
β”‚ β”œβ”€β”€ Event.java # Evento rilevato
β”‚ └── ...
β”‚
β”œβ”€β”€ session/ # Gestione sessioni
β”‚ β”œβ”€β”€ DeviceSession.java # Sessione per device
β”‚ β”œβ”€β”€ ConnectionManager.java # Manager connessioni
β”‚ └── cache/ # Cache device/position
β”‚
β”œβ”€β”€ command/ # Gestione comandi
β”‚ └── CommandConsumer.java # Riceve comandi da Redis
β”‚
β”œβ”€β”€ config/ # Configurazione
β”‚ β”œβ”€β”€ Config.java
β”‚ β”œβ”€β”€ Keys.java # Chiavi configurazione
β”‚ └── ...
β”‚
└── util/ # Utility
β”œβ”€β”€ Checksum.java
β”œβ”€β”€ Parser.java
β”œβ”€β”€ DateBuilder.java
└── ...

πŸ”„ Data Flow: Device β†’ Redis​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ GPS Device β”‚
β”‚ (S21L, G11L) β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ TCP/UDP (porta 5052, 5054, 5058, 5059)
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. TrackerServer (server/) β”‚
β”‚ - Accetta connessione β”‚
β”‚ - Crea pipeline Netty β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 2. FrameDecoder (frame/) β”‚
β”‚ - Split stream TCP in messaggi singoli β”‚
β”‚ - Ogni protocollo ha il suo frame decoder β”‚
β”‚ Input: [0x78][0x78][...data...][0x0D][0x0A] β”‚
β”‚ Output: ByteBuf con messaggio completo β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 3. ProtocolDecoder (protocol/) β”‚
β”‚ - Decodifica bytes β†’ Position object β”‚
β”‚ - Estrae: lat, lon, speed, course, attributes β”‚
β”‚ β”‚
β”‚ Input: ByteBuf β”‚
β”‚ Output: Position { β”‚
β”‚ deviceId: 123, β”‚
β”‚ latitude: 41.9028, β”‚
β”‚ longitude: 12.4964, β”‚
β”‚ speed: 45.5, β”‚
β”‚ attributes: {ignition: true, alarm: null} β”‚
β”‚ } β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 4. ProcessingHandler (pipeline/) β”‚
β”‚ - Serializza Position in JSON β”‚
β”‚ - Pubblica su Redis Pub/Sub β”‚
β”‚ β”‚
β”‚ Redis PUBLISH "positions" β†’ JSON β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 5. Downstream Microservices β”‚
β”‚ - position-filter (filtra posizioni invalide) β”‚
β”‚ - position-enricher (calcola distance, motion) β”‚
β”‚ - db-persister (salva su PostgreSQL) β”‚
β”‚ - event-detector (rileva eventi) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”™ Command Flow: Redis β†’ Device​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ API/Frontend β”‚
β”‚ POST /api/commands {deviceId: 123, type: "engineStop"} β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό Redis PUBLISH "commands"
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. CommandConsumer (command/) β”‚
β”‚ - Sottoscritto a Redis channel "commands" β”‚
β”‚ - Riceve comando JSON β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 2. ConnectionManager (session/) β”‚
β”‚ - Trova sessione attiva per deviceId β”‚
β”‚ - Recupera Netty Channel β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 3. ProtocolEncoder (protocol/) β”‚
β”‚ - Codifica Command β†’ bytes β”‚
β”‚ - Formatta secondo protocollo device β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό TCP/UDP
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ GPS Device β”‚
β”‚ - Riceve comando β”‚
β”‚ - Esegue azione (stop engine, unlock doors, etc.) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Protocolli Attivi​

ProtocolloPortaDevice Supportati
S21L5052S21L series
P55054P5 series
G11L-SE5058G11L-SE
C0595059C059 series

πŸ”§ Configurazione​

Le porte e i protocolli sono configurati tramite variabili d'ambiente o file di configurazione:

# Porta per protocollo S21L
s21l.port=5052

# Porta per protocollo G11L-SE
g11lse.port=5058

# Redis
redis.host=localhost
redis.port=6379

πŸ”— Dipendenze​

  • Netty - Framework I/O asincrono per TCP/UDP
  • Redis (Jedis) - Pub/Sub per comunicazione inter-service
  • Jackson - Serializzazione JSON
  • Guice - Dependency Injection