Cisco Meraki
Durante Luglio ed Agosto abbiamo avuto l’opportunità (e la fortuna) di poter provare una Meraki Camera MV12W.
Col nome Meraki (https://meraki.cisco.com/) si identifica quella che Cisco definisce come “una soluzione di cloud networking completa” totalmente gestita a livello centrale via web mediante un unico dashboard ed una potente REST API.
La linea Meraki include hardware, software e servizi cloud integrati e la nostra MV12W e’ appunto la telecamera con ampio Field of View, destinata al controllo delle presenze del nutrito set di camere a disposizione (https://meraki.cisco.com/products/smart-cameras/)
Basta aprire il sito web cisco meraki e ci si accorge che le telecamere sono uno spettacolo a vedersi e quando ne maneggiate una, la fattura ed i materiali non deludono.
Il setup è risultato semplice: la camera si è configurata quasi in autonomia.
Una volta collegata ad una porta POE (Power Over Ethernet) sullo switch di test, la telecamera si è connessa alla rete (wired) e associata alla dashboard automaticamente.
Le caratteristiche dell’ottica, lo storage e l’uso della banda edd sono descritte più che ampiamente sul sito cisco; quello che interessava a noi non era testare il funzionamento dell’hardware ma piuttosto capire come usare le sue API.
REST APIs
Tutta la documentazione e’ facilmente reperibile sul sito developers.cicso.com: dove si trovano anche diversi esempi di integrazioni, che spaziano dalla gestione remota dei dispositivi all’uso di TensorFlow per fare la detection di oggetti, basando il calcolo a partire dalle immagini prodotte dalle telecamere.
Sperimentare le API e’ immediato, grazie anche al sito che in modo interattivo permette di fare direttamente richieste al dispositivo Meraki; ad esempio aprendo questo url:
Cisco Meraki – Create with the Meraki Platform
Il serial number e’ quello riportato sulla scatola, ma se provate riceverete subito un bel 401 Unauthorized
Manca infatti ancora di autorizzare le richieste. Per farlo è necessario generare una api key, come detto anche all’inizio della guida: Getting Started – Meraki-Dashboard-API-v1-Documentation – Document
Per generare la key dobbiamo prima aprire la dashboard ed abilitare “API Access”
tra i settings della nostra “Organization”:
Una volta abilitato l’accesso via API, andando sul profilo dell’utente (ad esempio usando il menù in alto a destra nella pagina Organization, oppure il link ‘profile’ che si vede anche nell’immagine precedente), e’ possibile generare una api_key.
Con l’api key a disposizione siamo ora abilitati a fare richieste alla meraki aggiungendo lo header “X-Cisco-Meraki-API-Key” all’api explorer, già visto prima, si ottiene una risposta alla richiesta come si vede in figura.
Naturalmente l’api explorer serve solo per renderci facile provare gli endpoint disponibili, ma e’ sempre possibile fare le richieste autonomamente, ad esempio usando curl come nell’esempio di seguito
curl \
-H “Accept: application/json” \
-H “Content-Type: application/json” \
-H “X-Cisco-Meraki-API-Key: ${KEY}” \
https://api.meraki.com/api/v1/devices/${SERIAL}/camera/analytics/overview
Oltre ad una decina di API Endpoint utili per il tuning dei settings delle telecamere, ci sono 5 endpoint per il monitoring:
GET:
/devices/{serial}/camera/analytics/live
Ritorna lo stato attuale dell’ambiente monitorato con il conteggio delle persone presenti nelle zone configurate.
Risposta
{
“ts”: “2018-08-15T18:32:38.123Z”,
“zones”: { “0”: { “person”: 0 } }
}
/devices/{serial}/camera/analytics/overview
Restituisce, per ogni zona, un aggregato delle informazioni disponibili (ingressi e conteggio delle presenze) in un determinato intervallo temporale specificabile con i query parameters ‘t0’ e ‘t1’
Risposta
[
{
“startTs”: “2018-08-15T18:32:38.123Z”,
“endTs”: “2018-08-15T18:33:38.123Z”,
“zoneId”: 0,
“entrances”: 254,
“averageCount”: 5
}
]
Questo endpoint, come il successivo, permette di specificare con il query parameter objectType il tipo di oggetto che deve essere contato che al momento può essere ‘person’ oppure ‘vehicle’ (utile per usi esterni delle telecamere).
/devices/{serial}/camera/analytics/recent
Identico al precedente, ma ritorna sempre l’ultimo record di analytics disponibile
/devices/{serial}/camera/analytics/zones
Ritorna la liste delle zone configurate per la telecamera.
POST
/devices/{serial}/camera/generateSnapshot
genera una snapshot della telecamera all’istante della chiamata oppure all’istante specificato dal parametro opzionale Timestamp che deve essere specificato in formato ISO 8601.
Web Hooks
Anche le API REST di cui parlavamo sopra, sarebbero sufficienti per integrare le Meraki Camera in servizi custom, c’è un’altra feature che rende l’integrazione ancora piu’ funzionale: gli webhooks.
Gli webhooks sono una funzionalità che permette di chiedere alle API meraki di chiamare un nostro endpoint web ad ogni evento.
Gli webhooks non servono per il processing real time degli eventi, quanto piuttosto per reagire ad eventi di alto livello già elaborato dagli algoritmi di CISCO.
Anche se non trattati in questo post, per processare in tempo reale gli eventi della meraki camera c’è la possibilità di configurare un server MQTT, o addirittura abilitare un
endpoint RTSP per accedere direttamente allo stream video
Per configurare gli web hooks (che si possono abilitare solamente per un intero network) e’ sufficiente accedere alla pagina Network-Wide → Alerts sulla Meraki dashboard
ed aggiungere gli endpoint che devono essere notificati.
Con piacevole sorpresa e’ possibile chiedere a Meraki di inviare gli alert non solo ad uno web endpoint, ma addirittura ad una email, cosa assai comoda per capire come funzionano le notifiche.
Il nostro approccio e’ stato quello di inviare gli alert dalla meraki ad un nostro stream processor che usiamo per tenere traccia degli gli accessi ai locali della nostra azienda e, grazie a qualche integrazione, ad esempio con le API Bticino/Legrand, abbiamo utilizzato i dati degli ingressi per controllare la chiusura dei locali e l’illuminazione.
Il funzionamento dello stream processor e’ fuori dallo scopo di questo post, ma di sicuro e’ interessante come con pochi passi, si possano inserire gli alert Meraki su una coda Kinesis (https://aws.amazon.com/it/kinesis/).
Il primo step e’ quello di creare una coda Kinesis, come mostrato nella guida Creating and Updating Data Streams – Amazon Kinesis Data Streams.
Abbiamo nominato la nostra coda di esempio ‘meraki’ e, visto che riceviamo per il momento notifiche per una singola camera, e’ stato sufficiente riservare un singolo shard.
Creata la coda non resta che procedere a realizzare un servizio con api gateway che esponga un endpoint che per ogni chiamata inserisca un messaggio sulla Kinesis.
Esiste un tutorial per questo, Tutorial: Create a REST API as an Amazon Kinesis proxy in API Gateway – Amazon API Gateway che descrive dettagliatamente tutti i passi, ma in buona sostanza quello che serve fare e’ costruire una nuova API, nella quale definire un endpoint POST come quello in figura, con “Integration Type” di tipo AWS Service.
con una template che trasformi il body della notifica in un messaggio kinesis, ed il gioco e’ fatto.
Naturalmente, una volta trasformate le notifiche Meraki in messaggi Kinesis, processarli con qualsiasi servizio AWS e’ a portata di mano.