Quando mi capita di avere tempo, mi metto a giocare. Forse non ho un modo molto convenzionale di giocare, ma oggi che l’elettronica e’ tornata popolare, mi sto divertendo con tutti i vari IoT che sono in giro. In particolare, non per fare pubblicita’, ho diversi cosini divertenti in casa. Il problema e’ che qualsiasi di questi “cosini” che compriate, quando sono relativamente semplici da usare vi offrono, di fatto, di tenere sul loro cloud i dati che avete.

I dati di casa vostra. Per cui, ho dovuto scrivere un software per gestire io i segnali.

I cosini divertenti che ho scoperto sono questi:

https://www.particle.io/products/hardware/photon-wifi

Tutto il sistema di provisioning e di deploy del software sono encomiabili, e lo rendono abbastanza facile da usare, ma… i dati? E gli eventi? Devo rendere edotto il mondo di ogni cosa faccio in casa? No. E allora, siccome possiedo uno di questi:

che con un SSD da un TB e’ un robo fantastico, ho deciso di fare qualcosa per tenere i miei dati a casa.

Mi serviva un gestore di FIFO che mantenesse l’ordine degli eventi (se una porta si chiude e POI si apre, non devo avere gli eventi in maniera invertita) e che fosse semplice da installare e non richiedesse configurazione. Significa che se voglio aggiungere un Photon al mio sciame, non devo creare una fifo dedicata.

Installare un pachiderma come Kafka , come idea, mi piaceva quanto un’unghia incarnita. Peraltro, Kafka mantiene l’ordine dentro le partizioni, e non ha un gran senso montarsi un Kafka per limitarlo in modo che si comporti come una FIFO.

Cosi’ ne ho scritto uno: Codino.

Codino si limita a ricevere degli eventi dentro delle inbox, che esistono senza bisogno di essere configurate. Qualsiasi cosa scriviate nel body di una chiamata HTTP/POST, diventa un evento. A Codino non frega niente.

Se per dire lo fate partire su una porta , tipo 8080, potete provarlo cosi’:

echo "DoorOpen"   | curl -X POST -v -d @- https://[myhost]:8080/inbox/livingroomdoor

Ed ecco che avete caricato un evento, “DoorOpen” dentro una FIFO chiamata “livingroomdoor”.

Se volete leggere la FIFO (quindi nell’ordine di una FIFO) dovete solo fare una cosa analoga:

curl -X GET -v  https://[myhost]:8080/outbox/livingroomdoor

Codino se ne infischia degli header, in ogni caso. Attenzione: quando leggete la outbox state CONSUMANDO l’evento, e quindi l’evento dopo non sara’ piu’ in coda. E’ una FIFO, appunto. La O sta per “out”.

Se volete sapere quanti eventi ascoltano in una specifica FIFO, potete sempre fare polling, tipo:

curl -X GET -v  https://[myhost]:8080/list/livingroomdoor

Ovviamente e’ una scemenza semplice, ma si deploya copiando un solo eseguibile sulla macchina linux a scelta, e il file di configurazione e’ di due righe:

port = 8080
cache = 2097152

Ovviamente, “port” e’ la porta ove volete che ascolti, e “cache” e’ la cache in memoria delle code su disco, che sono permanenti in caso di riavvio di Codino. Ma una cache aiuta sempre. Con un paio di Megabyte di cache, Codino e’ ok per quasi tutti i bisogni di “code”. Un pochino come 640KB, ma meglio.

Implementare queste chiamate con un Photon e’ triviale, che era lo scopo che mi prefiggevo. Implementare interfacce Kafka o Qpid o RabbitMQ sarebbe stato molto piu’ complicato.

Se vi serve, potete scaricarlo da qui:

https://git.keinpfusch.net/LowEel/codino

Di fatto sono poche righe di codice, la buona notizia e’ che l’ho collaudato e funziona benissimo con uno “sciame” di 11 photon che fanno le cose piu’ bizzarre. Quindi non dovete reinventare la ruota. La seconda buona notizia e’ che si usa anche con CURL, il che vi offre altri modi di giocare se avete robini con linux su cui non volete piazzare framework IoT e ve la volete cavare con qualche script.

Siccome ho scoperto che alcuni oggetti “intelligenti” usano un’interfaccia SMTP , probabilmente aggiungero’ anche quella.