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