PHP: un socket TCP per acquisire dati dal GPS Tracker GPS-102 compatibile OpenGTS (prima parte)

Tracker GPS 102

Tracker GPS 102

Alcuni mesi fa mi è stato regalato questo questo tracker GPS per studiare come registrare su un database MySQL i dati che vengono trasmessi. L’apparecchio si chiama GPS-102 viene prodotto dalla Cobanch ed è disponibile anche in Italia ad un costo inferiore a 100€ su questo sito: www.nonsoloprevenzione.it

Poiché le informazioni della documetazione allegata sono, come spesso accade, piuttosto scarse, mi sono messo alla ricerca nel Web delle specifiche tecniche e del datagramma per la comunicazione dei dati forniti dal tracker (coordinate, velocità, ecc). Fortunatamente ho trovato questo foglio di calcolo, che si riferisce ai modelli TK102, TK103 ma il protocollo risulta identico e fornisce dunque le informazioni necessarie allo sviluppo del software.

Va detto che l’apparecchio necessita di una scheda GSM (come mostrato in foto) e normalmente utilizza SMS sia per le impostazioni che per comunicare i dati relativi alla sua posizione. Se la scheda viene abilitata al traffico GPRS, è possibile inviare i dati sotto forma di pacchetti TCP direttamente ad un server nella rete semplicemente impostando, sempre tramite SMS, l’indirizzo IP del server e la porta di comunicazione TCP.

Sebbene una gran parte dei tracker in commercio utilizzino connessioni UDP, questo apparecchio utilizza il protocollo TCP orientato alla connessione, che a discapito di una maggiore banda richiesta e di una modesta diminuzione delle prestazioni velocistiche, garantisce una trasmissione senza errori.

I dati da registrare sono principalmente:

  1. Latitudine
  2. Longitudine
  3. Velocità

Questi sono i dati necessari per rendere su Google Maps, o qualsiasi altro sistema di mappe di geolocalizzazione (p.e.: OpenstreetMap) il percorso fornito dal tracker. Le altre informazioni sono: il codice IMEI (necessario per l’univoca identificazione dell’apparecchio), i codici di allarme (batteria scarica, ecc), la data e l’ora e la validità del dato.

Ecco l’SQL per la creazione delle due tabelle necessarie, in un DB MySQL:

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
-- DATABASE SCHEMA:
CREATE SCHEMA IF NOT EXISTS `gpsd` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `gpsd` ;
-- -----------------------------------------------------
-- Table `gpsd`.`devices`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `gpsd`.`devices` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `imeiNumber` VARCHAR(16) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = MyISAM;
-- -----------------------------------------------------
-- Table `gpsd`.`positions`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `gpsd`.`positions` (
  `IDpositions` INT NOT NULL AUTO_INCREMENT ,
  `msg` VARCHAR(255) NULL ,
  `timestamp` INT NOT NULL ,
  `acq_time` DATETIME NULL ,
  `track_time` TIME NULL ,
  `is_valid` TINYINT NOT NULL DEFAULT 0 ,
  `latitude` DOUBLE NULL ,
  `longitude` DOUBLE NULL ,
  `speedKPH` DOUBLE NULL ,
  `course` DOUBLE NULL DEFAULT 0 ,
  `device_id` INT NOT NULL ,
  PRIMARY KEY (`IDpositions`) )
ENGINE = MyISAM;

Veniamo al codice PHP per la realizzazione del socket. Le caratteristiche sviluppate sono:

  • Un socket in loop infinito, in ascolto sulla porta impostata
  • Un socket preposto alla comunicazione
  • Una funzione di decodifica dei dati
  • Una funzione per l’aggiornamento delle tabelle del DB
  • Una funzione per il controllo della distanza dall’ultimo punto memorizzato
  • Funzioni di servizio per la connessione al DB, l’eco dei messaggi, ecc

In particolare, da una analisi preventiva dello stream TCP attraverso TCPDUMP ho osservato che il tracker invia i dati secondo 2 differenti modalità:

  1. Single point: Richiede che il server risponda con un determinato messaggio, consente l’invio di particolare impostazioni come p.e. il tempo di polling.
  2. Multi point: non richiede alcuna risposta, invia direttamente il datagramma.

Per questo motivo ho realizzato il codice necessario a “capire” automaticamente se il client sta trasmettendo in una delle due modalità (quella multi point, l’ho chiamata “dirty”).

Un’altra osservazione è che quando il tracker è fermo, a causa di una relativa imprecisione del sistema GPS (i satelliti non sono immobili e non sono sempre gli stessi), le coordinate fornite differiscono leggermente. Questo, oltre a fornire un sovraccarico di dati inutili al DB, comporta come output grafico sulla mappa una nuvola indecifrabile di punti (markers). La contromisura è stata di realizzare una funzione che calcola la distanza fra le coordinate del punto appena trasmesso e quelle dell’ultimo punto registrato. Se la distanza è minore di una certa soglia (definita nei settaggi iniziali), il punto non viene registrato nel DB.

Screenshot di OpenGTS

Screenshot di OpenGTS

Un’ultima caratteristica da sottolineare è la possibilità di utilizzare il database MySQL dell’applicazione Open Source: OpenGTS, un sistema integrato basato su Java/Tomcat che permette di visualizzare su mappe personalizzabili, i dati delle coordinate fornite da un vasto numero di tracker commerciali.

Nel prossimo post, fornirò l’intero sorgente dello script e la spiegazione dettagliata dei settaggi iniziali.

Questo articolo è stato pubblicato in Informatica e contrassegnato con , , , , . Aggiungi ai segnalibri il permalink.

Una risposta a "PHP: un socket TCP per acquisire dati dal GPS Tracker GPS-102 compatibile OpenGTS (prima parte)"