19 maggio 2017

tutorial: come e per cosa usare androidthings con il raspberry pi 3


Benvenuti!
Questo tutorial comprende una panoramica generale sul sistema operativo Androidthings, i motivi della sua creazione ed i passi fondamentali per creare applicazioni compatibili con il sistema in esecuzione su un raspberry pi 3 (qui trovate tutti i miei focus sul dispositivo).

Nota: il presente articolo contiene una infarinatura generale. Se avete proposte al riguardo o volete approfondire, non esitate a lasciare un commento o a contattarmi sui canali social.

Prima di addentrarci, vi riporto il video di supporto a questa guida che ho pubblicato sul mio canale YouTube:


Inoltre vi segnalo che nella pagina dedicata troverete tutti i tutorial da me pubblicati.


1. l'attrezzatura minima per iniziare


Per utilizzare Androidthings occorrono:
  1. un raspberry pi 3 + una microSD + un alimentatore (da almeno 2.1A) + eventuali breadboard, cavi, LED e quant'altro da utilizzare per sperimentare con i PIN GPIO e le altre periferiche
  2. un cavo HDMI + un cavo di rete LAN (entrambi necessari almeno per la prima configurazione)
  3. Androidthings OS
  4. un PC (Windows/Linux/Mac) per sviluppare con Android Studio + ADB
Per quanto riguarda i primi due punti, il pi 3 deve potersi collegare ad una rete (via LAN o via WiFi) e qualsiasi "accessorio" aggiuntivo può essere utile per sperimentare: il consiglio è quello di procurarsi uno di quei kit che contemplano LED, cavi, breadboard, resistenze e quant'altro. Inoltre, sarà indispensabile avere un alimentatore che eroghi in uscita almeno 2.1A ed è consigliata una microSD sufficientemente veloce così da ridurre i tempi di installazione ed esecuzione degli apk delle app sviluppate.
Ovviamente Androidthings è un sistema operativo che va installato su di una microSD (con la classica procedura prevista da qualsiasi OS per raspberry pi), e potete scaricarlo da qui.
In quanto facente parte della famiglia Android, anche per things lo sviluppo prevede la creazione di applicazioni in Java tramite Android Studio, che potete scaricare da qui.


2. che cos'è Androidthings e cosa permette di fare


Androidthings è l'incarnazione IoT di Android, il sistema operativo del robottino verde che è stato declinato nel corso del tempo su varie piattaforme: mobile computing, smartwatch, intrattenimento domestico e perfino nelle automobili. Ora arriva anche sui single board computer (come il pi 3 appunto), e promette di velocizzare lo sviluppo di applicazioni per l'Internet delle Cose.
Il motivo principale della sua ideazione è quello di astrarre il codice dall'hardware sottostante, in modo che sia possibile sviluppare app senza la necessità di conoscere il funzionamento del sistema sul quale esse andranno ad essere eseguite.

Google offre una piattaforma che sarà aggiornata nel corso del tempo sulla quale lo sviluppatore può fare affidamento ed occuparsi -fondamentalmente- soltanto del proprio codice. Un po' come accade con smartphone, tablet, TV ed orologi: il sistema operativo offre delle API da richiamare e non ci si deve preoccupare di entrare nel dettaglio del funzionamento generale.
Ci sono sicuramente alcuni concetti base da conoscere, ad esempio cos'è e come usare una breadboard, come funzionano input ed output digitali, le resistenze pull up e pull down, e così via... Ma niente di troppo complicato, soprattutto se si è già "abili smanettoni" e si sa già come collegare componenti esterne (LED, switch, resistenze, cavi, e quant'altro).

Al momento Androidthings è giunto alla developer preview 4, e versione dopo versione google ha aggiunto sia il supporto a nuove piattaforme hardware (non solo il pi 3 quindi), sia a kit esterni che possono offrire rapidamente determinate funzionalità (HAT di varia natura e così via), ma soprattutto sono state integrate sempre più API. Dapprima con la versione 3.1 (in esclusiva proprio per il pi 3) ed ora con la 4 per tutti i dispositivi supportati, è arrivato il supporto per il Google Assistant SDK, sul quale tornerò prossimamente con un focus dedicato.



Sul sito ufficiale del progetto sono riportate tutte le informazioni generali sulla piattaforma, le sue peculiarità e -nel dettaglio- su cosa fare per utilizzarlo sui vari SBC supportati, come il nostro pi 3.
Come anticipato, Androidthings va flashato su microSD esattamente come qualsiasi altro sistema operativo per raspberry pi, e può funzionare con o senza connessione HDMI (non è indispensabile mostrare l'app a video) e con connettività LAN o Wi-Fi. È supportato anche il Bluetooth e -fondamentalmente- dovrebbero funzionare tutte le componenti presenti sul nostro piccolo computerino, come ad esempio il connettore per la pi camera.

La cosa interessante di Androidthings è che offre lo stesso framework di sviluppo di Android (in Java) per smartphone e altri dispositivi; oltre ad esso vengono offerte alcune API di Google tramite i Google Services ed ovviamente troviamo una libreria di supporto apposita per il mondo things che, invece, è assente su smartphone ed affini. Al di sotto di questo strato ci sono ovviamente le librerie native C/C++, HAL per l'astrazione dall'hardware ed il kernel Linux. Questi ultimi due strati possono essere completamente ignorati dagli sviluppatori.
Androidthings non include alcuna applicazione di sistema per cui molti intent che possono essere utilizzati su Android "generico" qui non hanno senso: ad esempio quelli per il Calendario, Contatti, Telefono, e quant'altro...

I Google Services offerti al momento sono un subset di tutte le API invece presenti su Android. Molto interessante la presenza di Firebase e di Mobile Vision, oltre ovviamente ai vari Location, Drive, Cast, etc... Le notifiche non sono supportate, vista l'assenza della barra di sistema.


Detto ciò, che cosa consente di fare questa piattaforma? Lo scopo è quello di permettere la creazione di applicazioni che "prendano possesso" del sistema per sfruttare ad esempio i sensori collegati al pi 3, magari per farci qualcosa di utile... :-P
Sviluppare per Androidthings è come sviluppare per Android, per questo è praticamente indispensabile installare Android Studio che è compatibile con Windows, Linux e Mac, e per l'installazione rimando al sito ufficiale.

Per connettersi al pi 3 si deve utilizzare ADB da linea di comando. Con il comando adb connect <ip-address> riuscirete a collegarvi da remoto al pi 3 cosicché sia possibile eseguire il deploy della vostra app, fare debug e quant'altro.

Una volta che Android Studio, ADB ed Androidthings sul pi 3 saranno avviati e funzionanti, sarete pronti ad iniziare a sviluppare la vostra prima applicazione. E sul sito del progetto è possibile scaricare alcune app demo che aiutano ad iniziare.


3. applicazioni demo


Qualsiasi applicazione sviluppata per Androidthings ha dei prerequisiti:
  • nel build.gradle deve essere aggiunta la dipendenza alla piattaforma things:
    dependencies {
        ...
        provided 'com.google.android.things:androidthings:0.4-devpreview'
    }

  • nell'app manifest.xml deve essere aggiunta la libreria condivisa di things:
    <application ...>
        <uses-library android:name="com.google.android.things"/>
        ...
    </application>


  • deve esistere una Activity home che fungerà da entry point al boot del dispositivo (sì perché, come anticipato, può esistere una sola applicazione per volta in esecuzione, e gli input vengono rilevati dall'Activity che ha il focus). Questa Activity home deve rispondere all'intent scatenato al boot del device, e per comodità di sviluppo anche a quello scatenato da Android Studio all'installazione dell'apk sul device:
    <application android:label="Nome Applicazione">
        <uses-library android:name="com.google.android.things"/>
        <activity android:name=".HomeActivity">
            <!-- Launch activity as default from Android Studio -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <!-- Launch activity automatically on boot -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.IOT_LAUNCHER"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    </application>

Fatto ciò possiamo iniziare a pensare a qualcosa di dedicato per il pi 3: un primo esempio basilare può essere quello di creare una piccola board che permetta di far lampeggiare un LED.

Androidthings offre dei servizi che ci fanno dialogare con le periferiche connesse al pi 3 in modo rapido: ad esempio il PeripheralManagerService ci fa interagire con i PIN GPIO ed è possibile eseguire diverse operazioni su di essi (qui la lista di tutte le operazioni possibili):

Di seguito un codice di esempio per far lampeggiare il LED collegato ad un PIN del pi 3:

public class BlinkActivity extends Activity {
    private static final String TAG = "BlinkActivity";
    private static final int INTERVAL_BETWEEN_BLINKS_MS = 1000;
    private static final String LED_PIN_NAME = ...; // «- qui il PIN da utilizzare

    private Handler mHandler = new Handler();

    private Gpio mLedGpio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Step 1. Create GPIO connection.
        PeripheralManagerService service = new PeripheralManagerService();
        try {
            mLedGpio = service.openGpio(LED_PIN_NAME);
            // Step 2. Configure as an output.
            mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);

            // Step 4. Repeat using a handler.
            mHandler.post(mBlinkRunnable);
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // Step 4. Remove handler events on close.
        mHandler.removeCallbacks(mBlinkRunnable);

        // Step 5. Close the resource.
        if (mLedGpio != null) {
            try {
                mLedGpio.close();
            } catch (IOException e) {
                Log.e(TAG, "Error on PeripheralIO API", e);
            }
        }
    }

    private Runnable mBlinkRunnable = new Runnable() {
        @Override
        public void run() {
            // Exit if the GPIO is already closed
            if (mLedGpio == null) {
                return;
            }

            try {
                // Step 3. Toggle the LED state
                mLedGpio.setValue(!mLedGpio.getValue());

                // Step 4. Schedule another event after delay.
                mHandler.postDelayed(mBlinkRunnable, INTERVAL_BETWEEN_BLINKS_MS);
            } catch (IOException e) {
                Log.e(TAG, "Error on PeripheralIO API", e);
            }
        }
    };
}


Chiaramente è possibile complicare l'esempio a piacere, aggiungendo un pulsante che se premuto accende il LED, e così via.
Si tratta chiaramente di un primo passo, talmente banale che potrebbe non aver senso utilizzare Androidthings per realizzarlo: con l'utilizzo di Raspbian OS e Python, digitando pochissime righe di codice, si può ottenere lo stesso risultato in tempi decisamente minori.


Dove le cose iniziano a farsi più interessanti, ovviamente, è quando si vanno ad utilizzare i servizi offerti da Google. Ad esempio se volessimo creare un videocitofono smart, grazie alle Mobile Vision API di BigG potremmo catturare l'immagine di chi ha suonato alla porta e via FireBase mostrare il risultato su di una app companion per smartphone.
Ed è proprio in esempi come questo che si capisce la potenza della piattaforma: fondere assieme i potenti servizi di google alla facilità d'uso del pi 3 e delle sue periferiche.

Questi erano due esempi tra i tanti presenti sul sito del progetto a cui rimando per ulteriori dettagli e spunti.


4. conclusioni ed ultime note


Con questa guida ho provato a chiarire le idee su che cos'è e a che cosa serve Androidthings, come utilizzarlo e perché (se ci si pensa) il suo arrivo potrà rivoluzionare il mondo dell'IoT così come Android lo ha fatto per smartphone, tablet, TV (e forse in futuro anche smartwatch ed automobili). La piattaforma non consente la creazione di progetti altrimenti irrealizzabili senza di essa ma, sfruttando librerie e servizi già disponibili per quello che è il sistema operativo per dispositivi smart più diffuso al mondo, essa facilita il lavoro dello sviluppatore che avrà tutta una serie di tool (decisamente molto potenti) già integrati e pronti all'uso.


Bene: come indicato ad inizio guida, alcuni aspetti sono stati appositamente lasciati in secondo piano, ma se siete interessati ad approfondirli non esitate a contattarmi nei commenti di questo tutorial o del video ad esso correlato, oppure sui canali social!

Spero che la guida vi sia stata utile. Al prossimo tutorial!

Nessun commento:

Posta un commento