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

php daemon

php daemon

In quest’ultimo articolo descrivo come si lancia in background lo script PHP su un server con sistema operativo Linux Ubuntu o Debian. Come vi sarete accorti lo script descritto nella seconda parte contiene nella prima riga il seguente codice:

#!/usr/bin/env php

in gergo questa sintassi si chiama Shebang e viene utilizzata per lanciare dalla shell l’interprete dello script che sta per essere eseguito. In questo caso il PHP. Sarà dunque necessario verificare che PHP5-CLI (command line interpreter) sia installato.

Continua a leggere

Pubblicato in Informatica | Contrassegnato , , , , | Commenti disabilitati

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

Socket PHP

Socket PHP

Nella prima parte di questo articolo ho illustrato come creare le tabelle del DB dove registrare i dati provenienti dal tracker GPS, le principali funzionalità dello script e la possibilità di “agganciare” questo socket direttamente al software Open Source: OpenGTS.

Quest’ultima caratteristica, la ritengo particolarmente interessante in quanto permette di evitare di scriversi tutta la parte che riguarda la visualizzazione dei punti inviati dal tracker, sulle mappe.

Settaggi del socket
Chiave Valori possibili Descrizione
VERBOSE true|false Se impostato a true fornisce un output dettagliato degli errori
MOVING_THRESHOLD .05 Soglia minima in Km per la registrazione del dato [.05 = 50 metri]
OPENGTS true|false Se impostato a true invia query per le tabelle OpenGTS
IP_ADDR xxx.xxx.xxx.xxx Indirizzo IP in ascolto [0 = tutti gli indirizzi]
TCP_PORT 0..65535 La porta TCP da utilizzare
DBHOST localhost Indirizzo del DB MySQL
DBUSER dbuser utente del DB MySQL
DBPASS dbpassword password dell’utente del DB MySQL
DBNAME gpsd nome del DB MySQL
POLL_TIME 20|30|60|300|600 Tempo di polling del tracker in secondi
SPEED_CONV 1.609344|1.852 Conversione da Miglia (terrestri|marine) a Km
DFLT_MSG ‘tracker’ Messaggio di default del tracker
SOCK_RCV_TIMEOUT 120 Timeout in secondi per il socket in ricezione

Ed ecco il codice PHP del loop del socket (L’intero script è disponibile qui):

Continua a leggere

Pubblicato in Informatica | Contrassegnato , , , , | 1 commento

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. Continua a leggere

Pubblicato in Informatica | Contrassegnato , , , , | 1 commento

P4A 3 Framework: helper per sincronizzare le tabelle sequence in MySQL

P4A 3 LogoChi utilizza l’RDBMS MySQL in P4A avrà certamente notato che il framework produce in certi casi, delle tabelle il cui nome termina in ‘_seq’. Queste tabelle servono ad avere una compatibilità nella gestione di tutti gli RDBMS supportati (MySQL, PostgreSQL, SQLite, Oracle). PostgreSQL e Oracle, non hanno lo stesso tipo di gestione delle chiavi primarie con l’attributo ‘AUTOINCREMENT‘, rispetto a MySQL e SQLite. La soluzione adottata è di costruire, per ogni tabella con chiave primaria di tipo ‘AUTOINCREMENT’, delle tabelle accessorie che hanno un campo ‘id’ di tipo ‘AUTOINCREMENT’ e di riferirsi a quest’ultime per ottenre il ‘LAST INSERT ID‘. In questo modo viene ricalcato il comportamento delle chiavi primarie di tipo ‘SERIAL’ in PostgreSQL, e anche quelle di Oracle (leggermente diverse).

Prima di tutto una precisazione: questo articolo è riferito esclusivamente agli utenti MySQL.
Se si pensa di utilizzare esclusivamente P4A Framework per la gestione dei dati del nostro database, sarebbe bene in fase di progettazione evitare di usare gli AUTOINCREMENT perché, come detto, non necessari. Nel caso in cui il framework venga utilizzato come ‘backoffice’ per la gestione di dati che vengono alimentati da un form di un sito web, oppure si abbia la necessità di utilizzare una struttura dati pre-esistente con tanto di chiavi primarie ‘AUTOINCREMENT’, potremmo prima o poi trovarci di fronte ad un problema di disallineamento dei valori fra la chiave primaria della tabella e l’id’ della tabella ‘_seq’ associata.

Immaginiamo di avere una tabella “test” con questi due campi:

+----+---------+
| id | name    |
+----+---------+

con ‘id’ chiave primaria, P4A creerà automaticamente una tabella “test_id_seq” con una campo ‘id’ chiave primaria e ‘AUTOINCREMENT’, ed userà i valori forniti da quest’ultima sia per l’inserimento di nuovi record nella tabella “test“, che per altre operazioni sulla chiave primaria. Dunque utilizzando un programma esterno al framework per fare degli inserimenti e volendo mantenere allineate le tabelle principali e le tabelle “_seq” sarà necessario, per ogni “INSERT” nella tabella principale, fare altrettanto nella “_seq”!
Anche utilizzando questo metodo, potrebbe verificarsi prima o poi il problema di un disallineamento, in questo caso ho pensato potesse utile scrivere un metodo della classe “P4A_DB_SOURCE” da utilizzare in extremis, per risistemare le cose.

Per maggiori informazioni sull’utilizzo degli ‘helper’ in P4A suggerisco questo link

Ecco il codice dell’helper, in pratica viene prelevato il valore massimo della chiave primaria ‘AUTOINCREMENT’ della tabella che funge da sorgente dati, quindi viene eliminata la tabella ‘_seq’ associata e successivamente ricostruita con il valore corretto.

 function p4a_db_source_resync_seq($source)

 {
	$table = $source->getTable();
	$pKField = $source->getPk();
	$seqTable =  $table."_".$pKField."_seq";
	$lastId = P4A_DB::singleton()->fetchOne("SELECT MAX($pKField) FROM $table");
	$query = "DROP TABLE IF EXISTS `$seqTable`";
	$resQ1 = P4A_DB::singleton()->query($query);
	$query = "CREATE TABLE `$seqTable` (
	`id` int(11) NOT NULL auto_increment,
	PRIMARY KEY  (`id`)
	) TYPE=MyISAM AUTO_INCREMENT=$lastId";

	$resQ2 = P4A_DB::singleton()->query($query);
	$query = "INSERT INTO `$seqTable` VALUES ($lastId)";
	$resQ3 = P4A_DB::singleton()->query($query);
  return ($resQ1 && $resQ2 && $resQ3); 

 }

Questo codice deve essere inserito in un file con il nome: “p4a_db_source_resync_seq.php” che deve essere posizionato nella directory “libraries” della nostra applicazione P4A.

Ecco infine un po’ di codice di esempio da aggiungere alla nostra ipotetica maschera di manutenzione del db:

class test extends P4A_Base_Mask

{

	public function __construct()

	{

		parent::__construct();

		// DB Source

		$this->build("p4a_db_source", "source")

			->setTable("test")
			->setPk("id")
			->load();
		$this->setSource($this->source);

		// ....

	    $this->build("p4a_button", "btn_resync")

			->setLabel("resync")

			->implement("onclick", $this, "resync_seq_table");

		// ....
	}

	public function resync_seq_table()
	{
		$res = $this->source->resync_seq();
	}

	// ....
}

Conclusioni

Questo metodo dovrebbe essere usato con una certa cautela, e solo come procedura di emergenza. Non consiglio l’utilizzo se c’è la possibilità di accesso in scrittura alla tabella coinvolta da parte di altri utenti.

Riferimenti ed approfondimenti:

Pubblicato in Informatica | Contrassegnato , , , | Commenti disabilitati

OpenOffice Calc: come creare una funzione che genera password random

Logo della OpenOffice Calc

Vi è mai capitato di dover generare una lunga serie di password random da inserire in un database? Esistono diversi generatori, anche piuttosto sofisticati e flessibili nelle regole, ma normalmente generano una password alla volta. Ne ho trovati alcuni, che nelle versioni freeware, generano un massimo di 100 password. Ma se abbiamo la necessità di generarne 10000 o più?

Ho pensato di creare una formula per OpenOffice Calc, che possa generare una stringa alfanumerica rispettando certi requisiti di casualità, lunghezza e robustezza.

Il codice che genera la password è tratto da questo articolo, e tradotto in linguaggio Basic per OO.

E’ possibile stabilire la lunghezza della password e la robustezza. Quest’ultima viene definita da un valore minimo di 0 fin ad un massimo di 8

  • Robustezza = 0, solo consonanti e vocali minuscole
  • Robustezza = 1, consonanti minuscole e maiuscole e vocali minuscole
  • Robustezza = 2, consonanti minuscole e maiuscole e vocali minuscole e maiuscole
  • Robustezza = 4, consonanti minuscole e maiuscole, numeri e vocali minuscole e maiuscole
  • Robustezza = 8, consonanti minuscole e maiuscole, numeri, caratteri speciali e vocali minuscole e maiuscole

Per la compilazione e l’esecuzione della macro in OpenOffice Calc, ho seguito scrupolosamente le indicazioni di questo post sul sito Wiki di OpenOffice.
In pratica si tratta di creare una nuova macro associata ad un foglio di calcolo “Calc”, utilizzando:

Strumenti > Macro > Organizza Macro > OpenOffice.org Basic

Qunidi cliccando sul bottone “Gestisci” e sul tab “Libreria”, è possibile creare una nuova libreria associata al foglio di calcolo, nel nostro caso in calcTestMacros.ods creo (con poca fantasia…) la libreria: AuthorsCalcMacros.

Utilizzando il bottone “Modifica” si apre un IDE per poter scrivere, con l’aiuto del Syntax highlighting, il codice della macro in linguaggio Basic.
La macro in realtà corrisponde all’implementazione, ma non è la funzione che richiameremo all’interno delle celle del foglio di lavoro. Il motivo è da imputarsi al fatto che, a parte la libreria di default denominata “Standard”, tutte le altre non vengono automaticamente caricate all’avvio, dunque si rende necessario creare una funzione che potremmo chiamare “prototipo” nella libreria “Standard”, che a sua volta richiama l’implementazione vera e propria.

Questo è il codice della implementazione inserito nella libreria “AuthorsCalcMacros”:

Function Passwdgen_implementation(ByVal length AS Integer, ByVal strength As Integer)
	Dim vowels As string
	Dim consonants As string
	Dim password As string
	Dim alt As Integer
	Dim i As Integer

	vowels = "aeuy"
	consonants = "bdghjmnpqrstvz"
	If (strength >= 1) Then
		consonants = consonants + "BDGHJLMNPQRSTVWXZ"
	End If
	If (strength >= 2) Then
		vowels = vowels + "AEUY"
	End If
	If (strength >= 4) Then
		consonants = consonants + "23456789"
	End If
	If (strength >= 8) Then
		consonants = consonants + "@#$%"
	End If
	password = ""
	Randomize()
	alt = Int((2 * Rnd) + 1)
	For i = 0 To length-1
		If (alt = 2) Then
			password = password + Mid(consonants, Int((Len(consonants) * Rnd) + 1), 1)
			alt = 1
		Else
			password = password + Mid(vowels, Int((Len(vowels) * Rnd) + 1), 1)
			alt = 2
		End If
	Next i
	Passwdgen_implementation = password
End Function

Questo è il codice del “prototipo” inserito nella libreria “Standard”:

Function Passwdgen(ByVal l as Integer, ByVal s as Integer)
  If NOT BasicLibraries.isLibraryLoaded("AuthorsCalcMacros") Then
    BasicLibraries.LoadLibrary("AuthorsCalcMacros")
  End If
  Passwdgen = Passwdgen_Implementation(l, s)
End Function

Ed ecco infine il risultato della funzione nel foglio di calcolo:

screenshot del foglio di calcolo: calcTestMacros.ods

Per permettere l’esecuzione delle macro, è necessario impostare il livello di sicurezza su “Medio”
Questo parametro si imposta da:

Strumenti > Opzioni

Selezionare: “Sicurezza, quindi premere il bottone “Sicurezza delle macro…”

Aprendo il documento, ovviamente è necessario abilitare le macro, come mostrato nella figura qui sotto:

screenshot della finestra di dialogo abilita macro

Download:

Il documento ods che contiene la macro è disponibile qui

Riferimenti e Links:

Pubblicato in Informatica | Contrassegnato , , | Commenti disabilitati