Avete presente le famose cene di famiglia natalizie? 🎄
Quelle da film piene di parenti che, forse, avete visto una sola volta durante l’anno, magari per caso dal panettiere.
Zii e zie che si siedono accanto a voi e cercano di capire cosa fate con il “computer” (e puntualmente chiedono se potete sistemargli qualcosa sul cellulare o sul portatile).
Sì, lo so, è un cliché degli anni 2000 e forse ai più giovani non dice nulla, ma per chi ci è passato, beh, è un mix emotivo inconfondibile. Siamo nel 2024, è vero, e ormai tutti sembrano dei “mastri informatici” (persino la zia!), ma c’è ancora un momento in cui quel vecchio sentimento di “perché proprio a me?” riemerge.
Ed è quando devo spiegare cosa significa sviluppare in ambito IoT.
L’acronimo è noto: il famosissimo Internet of Things, che tradotto suonerebbe come “La Rete delle Cose” (ndr. forse ci potrebbero fare anche una serie TV con questo nome).
Ma spesso si aggiunge la parola magica smart al nome di un oggetto, trasformando un oggetto passivo e silenzioso in qualcosa di vivo e in grado di comunicare. È come dare un’anima digitale a ciò che ci circonda.
Così, dato che Natale si avvicina e tutti i parenti inizieranno a chiedermi cosa faccio davvero con “questi computer”, ho pensato di fare un po’ di pratica e condividere la mia esperienza con la community di Codemotion, spiegando in cosa consiste davvero sviluppare per l’IoT.
Alcuni esempi
Forse il modo più semplice per introdurre l’argomento è definire meglio i contorni. L’IoT può sembrare una nicchia e, in un certo senso, lo è, ma ha infinite sfaccettature.
Si tratta di un sistema vasto, che ricorda la “coda lunga” del mondo SEO: si parte da un semplice vaso di fiori e si arriva a una notifica push sul cellulare che ci dice: “Ehi, ricordati di bagnarmi!”.
Il processo copre ogni tipo di oggetto: qualsiasi cosa può diventare “smart” e iniziare a fornire dati, di qualsiasi genere.
Il tuo orologio, oltre a segnare l’ora, potrà monitorare la nostra ossigenazione, la temperatura corporea e il numero di passi fatti durante il giorno. Un frigorifero sarà in grado di informarci sulla temperatura interna, lo stato degli alimenti e persino ricordarci quando è il momento di buttare il latte.
Un sensore vicino a un grappolo d’uva potrà raccogliere dati dettagliati per produrre il Prosecco perfetto, mentre una bicicletta in ride sharing avrà tanta di quella telemetria che un team di Formula 1 ne sarebbe invidioso. Forse anche in modo bidirezionale per giunta!
Come dicevo, ci sono infiniti ambiti e angolazioni in cui un oggetto può diventare smart. E in questo mare di possibilità, tocca a me farvi da Virgilio e spiegare cosa vuol dire sviluppare un dispositivo IoT, passando attraverso tutte le fasi — dalla prototipazione all’integrazione, fino alla gestione dei dati che, in fondo, sono la vera anima di ogni oggetto connesso.
Dal prototipo alla produzione
La creazione di un dispositivo IoT, o “smart device” che dir si voglia, inizia definendo i requisiti e definendo i dati finali che dovrà fornire. Questa analisi preliminare permette di identificare, a grandi linee, i sensori necessari, le porte fisiche richieste e se il dispositivo sarà alimentato a corrente o con un accumulatore.
Lista dei componenti
Questa fase iniziale consente di definire il Bill of Materials (BOM), ovvero la lista dei componenti necessari per realizzare il prodotto finale. La scelta dei componenti è cruciale: bisogna considerare la disponibilità sul mercato, la compatibilità, le specifiche tecniche e il costo. Gestire il BOM in modo efficiente è essenziale per ottimizzare i costi di produzione e garantire la possibilità di produrre il dispositivo su larga scala senza problemi. Ad esempio, un microcontrollore con molteplici opzioni di connettività integrata (Wi-Fi, Bluetooth, ecc.) può semplificare lo sviluppo ma aumentare il costo per unità.
Prototipazione
Spesso, una prima iterazione prevede la creazione di un prototipo hardware per validare fisicamente il progetto e individuarne potenziali limiti o criticità, prima di passare alla fase di ottimizzazione e produzione in scala. Si utilizzano comunemente piattaforme di prototipazione rapida come Arduino, ESP32 o Raspberry Pi per ridurre tempi e costi iniziali, permettendo di testare e convalidare i concetti prima di passare a soluzioni più specifiche e personalizzate.
Un altro aspetto critico è la progettazione dell’enclosure, ovvero l’involucro del dispositivo. Questo deve essere non solo esteticamente gradevole, ma anche funzionale e resistente alle condizioni d’uso previste. Ad esempio, un dispositivo destinato all’uso subacqueo richiederà un’impermeabilità certificata (es. standard IP68), mentre uno per gli sport invernali dovrà resistere a temperature estreme e urti. In questa fase entrano in gioco studi ergonomici e di design industriale, che considerano anche l’interfaccia utente del dispositivo (display, pulsanti, feedback visivo o sonoro, ecc.).
Studi di costo
Parallelamente, si effettuano studi di costo e analisi di mercato. È fondamentale stimare con precisione i costi di produzione e sviluppo per stabilire un prezzo finale e valutare la fattibilità economica del prodotto. Questa fase richiede spesso una valutazione dei volumi di produzione previsti e delle economie di scala. L’analisi deve anche tenere conto di diversi scenari di produzione, compresi i costi di certificazione, specialmente per i prodotti destinati a settori regolamentati come quello medicale o automobilistico.
Architettura
Per quanto riguarda le modalità di comunicazione, i dispositivi IoT possono utilizzare diverse tecnologie, ognuna con vantaggi e limitazioni specifiche:
- USB: per connessioni cablate e alimentazione;
- Bluetooth Low Energy (BLE): ideale per dispositivi a basso consumo e comunicazioni a breve raggio;
- Wi-Fi: per connessioni ad alta velocità e copertura locale;
- LoRaWAN: per dispositivi che necessitano di lunghe distanze e consumi ridotti, come sensori in ambienti agricoli o remoti;
- Infrarossi: in alcuni contesti, per la trasmissione di informazioni a lettori ottici dedicati (es. i contatori dell’energia).
La scelta della tecnologia dipende dal contesto d’uso, dal tipo di dati che il dispositivo deve trasmettere e anche dalla modalità di alimentazione. Progettare correttamente l’architettura di comunicazione è fondamentale per garantire l’affidabilità del dispositivo e la sua capacità di integrarsi in una rete IoT esistente. Inoltre, è importante considerare la possibilità di aggiornamenti OTA (Over-The-Air) per garantire longevità e manutenzione, permettendo di aggiornare il software e risolvere eventuali bug in modo remoto.
Connettività e dati
Dopo che i miei colleghi hanno completato il prototipo e l’hardware è stato testato, arriva il mio turno: lo sviluppo dell’app mobile. Per dirlo con parole semplici (e magari spiegandolo anche a mio zio!), è qui che colleghiamo il mondo fisico con quello digitale, traducendo i dati grezzi provenienti dal dispositivo in un’esperienza d’uso concreta e intuitiva per l’utente finale.
Una volta validato il primo prototipo (anche se spesso, in questa fase, l’hardware potrebbe non essere ancora completamente disponibile), iniziamo a verificare che quanto discusso in fase progettuale sia stato rispettato. La verifica, però, non è un processo finale: avviene continuamente, ad ogni sprint, con demo periodiche del team firmware. Questo momento è cruciale: è l’equivalente del “shake down” in Formula 1, in cui testiamo il sistema completo per assicurarci che tutto funzioni correttamente e per identificare eventuali problemi prima che diventino critici.
Sviluppo mobile
Il nostro ruolo come sviluppatori mobile per dispositivi smart è fungere da ponte tra il mondo fisico (il dispositivo e i suoi sensori) e l’esperienza digitale (l’app). Per fare ciò, collaboriamo con una gamma di professionisti: ingegneri firmware e embedded, specialisti di UI/UX, ingegneri backend, esperti di AI/ML, ingegneri mobile e QA. Questo team multidisciplinare lavora in sinergia per creare un’esperienza coerente e integrata che connette perfettamente il mondo reale e quello digitale.
Spesso, l’interazione tra l’app e il dispositivo non avviene tramite una classica API RESTful, ma attraverso protocolli di comunicazione dedicati che stabiliscono una connessione diretta e one-to-one tra lo smartphone e il dispositivo periferico. La sinergia tra i vari componenti del team è fondamentale, e l’uso di metodologie come il fail-fast (FF) ci permette di identificare rapidamente i punti critici e risolverli nel modo più efficiente possibile. Per esempio, se notiamo che i dati non arrivano con la granularità richiesta, potrebbe essere necessario apportare modifiche hardware, il che potrebbe influire sui tempi di produzione e sui costi del BOM, richiedendo una ri-pianificazione.
Il nostro compito come team mobile è quindi di connettere il COSA (i dati forniti dal firmware, backend o calcolati tramite AI/ML) al COME (l’esperienza utente progettata dai team UX/UI). Sebbene alcune parti dello sviluppo possano somigliare a quelle di un’app tradizionale che si collega a un backend, ci sono aspetti unici e sfidanti. Ad esempio, il processo di onboarding di un dispositivo IoT va ben oltre il classico “carosello” informativo; richiede un’interazione intensa con l’utente attraverso un processo chiamato provisioning.
Il provisioning
Durante il provisioning, il dispositivo smart entra a far parte dell’ecosistema dell’utente. Esistono diverse modalità operative per eseguire questa integrazione, tra cui:
- Selezione di un dispositivo BLE da una lista rilevata dallo smartphone, in cui l’utente sceglie il dispositivo corretto;
- Connessione temporanea a un Access Point (AP) Wi-Fi per trasmettere le credenziali della rete e configurare il dispositivo;
- Utilizzo di un bump NFC per avviare il processo di associazione.
In alcuni casi, queste modalità possono essere combinate per garantire una connessione sicura e stabile. Una volta completato il provisioning, il dispositivo è pronto per inviare i suoi dati. Se la connessione avviene tramite Wi-Fi, i dati vengono spesso trasmessi a un backend che li raccoglie, li analizza e li rende accessibili tramite l’app. Se invece la comunicazione avviene tramite BLE o NFC, gran parte del lavoro di gestione dei dati viene eseguito dallo smartphone, che agisce come un ponte diretto tra il dispositivo e l’app.
Questa fase è particolarmente delicata perché la sincronizzazione e l’aggiornamento dei dati, specialmente con protocolli a basso consumo come BLE, richiedono un’attenzione particolare alla velocità di trasmissione (MTU) e alla quantità di dati da trasferire. Per questo motivo, spesso nelle app vediamo schermate di sincronizzazione la cui durata dipende da questi fattori.
Non esiste una regola fissa su come gestire i dati: in alcuni casi vengono salvati direttamente nei servizi nativi dello smartphone, come HealthKit per iOS o servizi equivalenti su Android, mentre in altri casi è necessario un backend per processarli e analizzarli, specialmente quando i dati raccolti sono complessi e richiedono una elaborazione più approfondita.
Aggiornamenti OTA
Un aspetto cruciale dello sviluppo IoT è la gestione degli aggiornamenti Over-The-Air (OTA), indispensabili per correggere bug, migliorare funzionalità e garantire la longevità del prodotto. Tuttavia, gli OTA rappresentano anche una delle fasi più critiche, perché se qualcosa va storto, c’è il rischio di “brickare” il dispositivo, rendendolo inutilizzabile. Per questo motivo, è essenziale progettare un’infrastruttura sicura e affidabile per la distribuzione degli aggiornamenti, minimizzando i rischi associati.
Per ridurre al minimo la possibilità di un brick, i dispositivi devono essere dotati di meccanismi di rollback, che permettono di ripristinare il firmware precedente in caso di errore durante un aggiornamento. Inoltre, è fondamentale implementare un sistema di verifica dell’integrità del firmware, usando ad esempio certificati e chiavi crittografiche, per garantire che solo firmware autorizzati e sicuri possano essere installati.
Articolo consigliato: Sicurezza “resource-costrained” nei dispositivi IoT
La coordinazione con il team QA è vitale in questa fase, poiché un approccio fail-fast permette di identificare rapidamente i problemi durante la distribuzione degli aggiornamenti e intervenire prima che i dispositivi finiscano nelle mani degli utenti. Le tecniche di testing includono simulazioni degli aggiornamenti su un gran numero di dispositivi, monitoraggio degli errori e feedback immediato in caso di malfunzionamenti.
TLDR;
Lo sviluppo mobile per dispositivi IoT è una sfida multidisciplinare che combina hardware, software e UX in un ecosistema complesso.
Dalla configurazione iniziale e provisioning fino alla gestione degli aggiornamenti OTA, ogni passo richiede attenzione ai dettagli, sincronizzazione tra i team e una profonda comprensione delle tecnologie coinvolte.
Alla fine, vedere un dispositivo prendere vita e funzionare come previsto, integrandosi perfettamente nella vita quotidiana dell’utente, è la ricompensa di un lavoro ben fatto.
Immagini designed by Freepik