venerdì 6 marzo 2015

Microsoft Band SDK Preview - Accesso ai sensori

In questo post parleremo di quali sensori, presenti nel Microsoft Band, possiamo utilizzare sfruttando le API messe a disposizione dall’SDK.
I sensori utilizzabili grazie all’SDK sono i seguenti:
  • Accelerometro: fornisce l’accelerazione subita dal Band (in metri al secondo quadrato) lungo i tre assi (vedere figura per comprendere come sono disposti tali assi);
  • Giroscopio: fornisce la velocità angolare (gradi al secondo) attorno ai tre assi cartesiani;
  • Sensore di distanza: fornisce informazioni riguardanti la velocità corrente (in centimetri al secondo), la distanza percorsa (in centimetri), il passo (in millisecondi per metro) e il tipo di attività (camminata o corsa);
  • Cardio: fornisce le informazioni relative alla frequenza cardiaca (in battiti al minuto);
  • Pedometro: fornisce il numero di passi;
  • Sensore di temperatura della pelle: fornisce informazioni sulla temperatura della pelle (in gradi Celsius);
  • Sensore UV: fornisce informazioni sull’intensità dell’irraggiamento solare (in termini di radiazioni UV);
  • Sensore di contatto: fornisce informazioni sul fatto che il Band sia indossato o meno.
La seguente figura mostra la disposizione degli assi X, Y e Z per quel che riguarda giroscopio e accelerometro.
image

Ricevere i dati dal sensore

Nel precedente post della serie abbiamo visto come connettersi ad un Band (in pairing e collegato al nostro Windows Phone).

Dim bands = Await BandClientManager.Instance.GetBandsAsync()
If bands.Any() Then
    App.CurrentBandInfo = bands.First()
    BandInfoCtrl.BandInfo = App.CurrentBandInfo
    Try
        App.CurrentBandClient = Await BandClientManager.Instance.ConnectAsync(App.CurrentBandInfo)
        DisplayProgressIndicator(True, "Band connesso....")
    Catch ex As BandException

    End Try
Else
    Dim msgDlg = New MessageDialog("Nessun Band trovato")
    Await msgDlg.ShowAsync()
End If

Quello che otteniamo è un’istanza dell’interfaccia IBandClient la cui struttura è mostrata nella seguente figura
image

Come possiamo vedere, l’interfaccia espone 4 proprietà il cui scopo è quello di permetterci di accedere alle 4 aree funzionali che il Band ci consente di utilizzare in questa versione dell’SDK.
In particolare, quella che ci interessa è la SensorManager, di tipo IBandSensorManager, che ci permette di avere accesso ai sensori.

 image

Come si osserva dal class diagram, la IBandSensorManager espone 8 proprietà (una per sensore), tutte di tipo IBandSensor(Of T) dove T definisce la tipologia del sensore stesso.
La IBandSensor espone un evento che viene sollevato ogni qual volta il valore sotto esame cambia e due metodi per avviare e fermare il rilevamento dei cambiamenti (ogniuno con un overload che cosente di passare come argomento un CancelletionToken per gestire la cancellazione della richiesta asincrona in maniera corretta).
Unica differenza la fa il sensore di contatto (quello che ci permette di sapere se il Band è indossato o meno) che implementa una propria interfaccia (sempre derivata dalla IBandSensor) che ci fornisce, in più, un metodo per recuperare, in polling, il valore letto dal sensore.

image

Tutti i tipi che definiscono i sensori derivano dall’interfaccia IBandSensorReading. Il tipo su cui vengono chiuse le interfacce dei sensori contiene effettivamente i dati forniti dallo stesso. Ad esempio la IBandHeartRateSensorReading (che è il tipo caratteristico del sensore cardio) conterrà il valore dei battiti letti e la qualità con cui tale dato è letto (nel caso specifico Acquiring o Locked per segnalare se il sensore del battito cardiaco è effettivamente agganciato al nostro polso o se i dati sono soggetti ad errore perchè in fase di acquisizione).
SNAGHTML8afd5c
Quindi, una volta capito come funziona il meccanismo degli eventi, possiamo agganciare un gestore in modo da essere informati dall’SDK quando ci sono dei dati da utilizzare.
Nel seguente pezzo di codice andiamo a gestire i dati provenienti dall’accelerometro:

AddHandler App.CurrentBandClient.SensorManager.Accelerometer.ReadingChanged,
    Async Sub(sender As Object, data As IBandAccelerometerReading)
        Await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                                  Sub(data)
                                      AccelerometerXText.Text = data.AccelerationX.ToString("###0.0")
                                      AccelerometerYText.Text = data.AccelerationY.ToString("###0.0")
                                      AccelerometerZText.Text = data.AccelerationZ.ToString("###0.0")
                                      AccelerometerTimestampText.Text = data.Timestamp.ToString()
                                  End Sub)
    End Sub

oppure, per chi ama la sintassi classica di VB.NET:

AddHandler App.CurrentBandClient.SensorManager.Accelerometer.ReadingChanged, AddressOf Accelerometer_ReadingChanged

Private Async Sub Accelerometer_ReadingChanged(sender As Object, e As BandSensorReadingEventArgs(Of IBandAccelerometerReading))
    Await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, Sub(data)
                                                                                 AccelerometerXText.Text = data.AccelerationX.ToString("###0.0")
                                                                                 AccelerometerYText.Text = data.AccelerationY.ToString("###0.0")
                                                                                 AccelerometerZText.Text = data.AccelerationZ.ToString("###0.0")
                                                                                 AccelerometerTimestampText.Text = data.Timestamp.ToString()
                                                                             End Sub)
End Sub

App.CurrentBandClient è un’istanza valida di IBandClient ottenuta dalla connessione.
Osserviamo che dobbiamo utilizzare il dispatcher per aggiornare la UI in quanto non è garantito che l’evento venga sollevato nello stesso thread dell’interfaccia.
I dati del sensore non arriveranno fino a che non diremo al sensore di cominciare a leggere:

Await App.CurrentBandClient.SensorManager.Accelerometer.StartReadingsAsync()

In maniera analoga possiamo arrestare il processo di recupero dei dati utilizzando il metodo StopReadingAsync:

Await App.CurrentBandClient.SensorManager.Accelerometer.StopReadingsAsync()


ReportingInterval

Prima di concludere osserviamo che l’interfaccia IBandSensor espone anche delle proprietà che ci permettono di capire se il sensore è supportato (IsSupported), di sapere quali sono gli intervalli di campionamento che il sensore è in grado di supportare (SupportedReportingIntervals) e quale è l’intervallo di campionamento scelto (ReportingInterval).
image
SupportedReportingIntervals è una collezione di TimeStamp i cui valori possono essere utilizzati per impostare la proprietà ReportingInterval e decidere, in questo modo, la frequenza di campionamento che ci fa più comodo.
L’esempio completo è disponibile al seguente link.

Nel prossimo post ci occuperemo della gestione delle tile nel Band e vedremo come possiamo creare la nostra tile e gestirla da codice.

Rimanete connessi!!!

mercoledì 4 marzo 2015

Microsoft Band SDK Preview - ”Hello Band”

In questo post cercheremo di avere un primo contatto con il nuovo SDK per Microsoft Band.
In particolare cercheremo di capire come è strutturato lo stesso e quali sono le classi fondamentali per iniziare a realizzare le nostre app che interfacciano lo smartwatch. Per finire vedremo come connettersi all’orologio e come ricavare alcune informazioni dallo stesso.
Prima di cominciare vi ricordo che avete bisogno di un Band fisico per poter eseguire delle prove e che il Band deve essere in pairing e connesso al device su cui state facendo i test.

Cominciare da zero

Per cominciare, creiamo un nuovo progetto per Windows Phone 8.1 (WinRT) e aggiungiamo il riferimento all’SDK del Band utilizzando NuGet come mostrato nella seguente figura:

SNAGHTML19b468f

L’SDK del Band è, infatti, distribuito attraverso NuGet e, di fatto, si tratta di una serie di dll (3 per l’esattezza) e di una trasformazione del manifest dell’applicazione. Al momento della scrittura di questo post la versione in distribuzione è la 1.3.10219 in prerelease (includete le prerelease nella tendina del Manager  NuGet Packages altrimenti non la vedrete).
Partiamo dalle dll che vengono referenziate.

image

La Microsoft.Band contiene le interfacce e i tipi comuni ad entrambe le piattaforme. A tal proposito è opportuno evidenziare (e lo faremo anche in seguito) il fatto che tutte le funzionalità vengono erogate tramite interfacce. Questo garantisce un ottimo disaccoppiamento e, in linea teorica, fa ben sperare per un simulatore/emulatore che permetterebbe a coloro che non hanno un Band fisico di poter sviluppare e testare le proprie app.

 

Capabilities

Il Band è un dispositivo Bluetooth LE, quindi, è necessario definire le capabilities opportune per permettere alla nostra app di utilizzare ii servizi Bluetooth LE (che, sfortunatamente, non aderiscono ad un profilo standard).
La prima volta che agganciamo l’SDK tramite NuGet, il package dovrebbe automaticamente abilitare le opportune capabilities. Se nella solution avete due progetti su cui volete utilizzare il Band SDK, il secondo progetto che referenzierà l’SDK tramite NuGet non avrà le capabilities automaticamente abilitate.
In ogni caso, le capabilities essenziali sono la Proximity (impostabile tramite designer dell’app manifest).

SNAGHTMLedfbd

e i servizi Bluetooth LE abilitabili aprendo il file XML dell’App Manifest e aggiungendo:

<Capabilities>
  <Capability Name="internetClientServer" />
  <DeviceCapability Name="proximity" />
  <DeviceCapability Name="bluetooth.rfcomm" xmlns="http://schemas.microsoft.com/appx/2013/manifest">
    <Device Id="any">
      <!-- Used by the Microsoft Band SDK Preview -->
      <Function Type="serviceId:A502CA9A-2BA5-413C-A4E0-13804E47B38F" />
      <!-- Used by the Microsoft Band SDK Preview -->
      <Function Type="serviceId:C742E1A2-6320-5ABC-9643-D206C677E580" />
    </Device>
  </DeviceCapability>
</Capabilities>

 

La classe BandClientManager

Una volta definite ed impostate opportunamente le capabilities, possiamo cominciare a lavorare sul nostro Band.
La classe principale per accedere al Band, è la BandClientManager.

image

BandClientManager è un singleton che aderisce all’interfaccia IBandClientManager. Possiamo accedere ad un’istanza di quest’ultima interfaccia utilizzando la proprietà statica Instance.
L’interfaccia IBandClientManager espone due metodi asincroni:
  • GetBandsAsync: permette di ottenere l’array di oggetti IBandInfo che forniscono informazioni sui Band connessi;
  • ConnectAsync: permette il collegamento ad uno specifico Band (identificato da un’istanza di IBandInfo) e restituisce, in caso di successo, un’istanza di IBandClient).
La seguente figura riporta la struttura delle interfacce IBandInfo e IBandClient:

image
Parlando con il codice, se vogliamo ottenere l’elenco dei Band collegati ci basta scrivere:

Dim bands = Await BandClientManager.Instance.GetBandsAsync()
If bands.Any() Then
    BandList.ItemsSource = bands
    MessageText.Visibility = Windows.UI.Xaml.Visibility.Collapsed
Else
    BandList.ItemsSource = Nothing
    MessageText.Visibility = Windows.UI.Xaml.Visibility.Visible
End If

Ogni istanza di IBandInfo espone il nome del Band e la tipologia di connessione che lo stesso ha con il device che stiamo utilizzando (attualmente Bluetooth o Usb).
Osserviamo che, se non abbiamo band connessi, l’elenco ritornato dal metodo GetBandsAsync è un array con zero elementi. In linea teorica, quindi, questo metodo non dovrebbe sollevare eccezioni di alcun tipo.
Utilizzando l’istanza di IBandInfo, possiamo tentare di eseguire la connessione utilizzando il metodo ConnectAsync

Try
    Using bandClient = Await BandClientManager.Instance.ConnectAsync(bandInfo)
        '
        '
        '
    End Using
Catch ex As BandException
    
End Try

Se la connessione va a buon fine, otteniamo un’istanza di IBandClient.
IBandClient espone due metodi che permettono di recuperare la versione del firmware e dell’hardware del Band e 4 proprietà che ci permettono di accedere alle vere e proprie funzionalità del Band:

image
  • NotificationManager: espone l’interfaccia tramite la quale è possibile gestire l’invio di messaggi al Band;
  • PersonalizationManager: espone l’interfaccia tramite la quale è possibile personalizzare;
  • SensorManager: espone l’interfaccia tramite la quale si ha accesso ai sensori presenti nel Band;
  • TileManager: espone l’interfaccia tramite la quale gestire la propria tile all’interno delle tile del Band.
Vedremo ogni singola interfaccia in altrettanti post.
Nel frattempo possiamo utilizzare i metodi GetFirmwareVersionAsync e GetHardwareVersionAsync della IBandClient per recuperare le versioni del firmware e dell’hardware del Band connesso.

Try
    Using bandClient = Await BandClientManager.Instance.ConnectAsync(bandInfo)
        BandNameText.Text = bandInfo.Name
        BandConnectionTypeText.Text = bandInfo.ConnectionType.ToString()

        Dim firmTask = bandClient.GetFirmwareVersionAsync()
        Dim hardTask = bandClient.GetHardwareVersionAsync()
        Await Task.WhenAll(firmTask, hardTask)

        BandFirmwareVersionText.Text = firmTask.Result
        BandHardwareVersionText.Text = hardTask.Result
    End Using
Catch ex As BandException
    
End Try

I due metodi tornano semplicemente delle stringhe (al netto dell’async, ovviamente) che contengono le versioni cercate.
Al seguente link potete scaricare l’esempio del post.

Nel prossimo post cercheremo di capire come interagire con i sensori del Band, quindi non ve lo potete perdere.

lunedì 2 marzo 2015

Microsoft Band SDK Preview - First Look

E’ un pò di tempo che non scrivo post e vorrei riprendere proponendovi qualche post relativo all’SDK del Microsoft Band recentemente rilasciato da Microsoft.

Per chi non conoscesse Microsoft Band, si tratta di uno smart watch, fornito di innumerevoli sensori (tra i quali giroscopio, accelerometro, GPS, cardio, sensore UV e così via) con la caratteristica, abbastanza rara tra gli smart watch in commercio, di essere compatibile con le tre piattaforme mobile più diffuse cioè iOS, Android e, ovviamente, Windows Phone. Maggiori info su Microsoft Band sono disponibili nel sito ufficiale Microsoft http://www.microsoft.com/Microsoft-Band

Come dicevo in apertura del post, recentemente Microsoft ha rilasciato l’SDK per poter sviluppare applicazioni che si integrano e sfruttano il Band come possibile estensione per fornire funzionalità accessorie.
Ad oggi sono stati rilasciati l’SDK per Windows Phone e per Android, mentre prossimamente verrà rilasciato quello per iOS. L’SDK è in preview il che significa che, pur essendo utilizzabile per realizzare applicazioni che possono finire nello store, le funzionalità esposte dalle API non sono omnicomprensive e, soprattutto, la struttura delle API potrebbe cambiare prima della versione definitiva.

In questi post mi occuperò della versione Windows Phone, ma maggiori informazioni sulla versione Android e sulla futura iOS sono disponibili all’indirizzo http://developer.microsoftband.com/

SNAGHTML8817d
La pagina developers del Microsoft Band SDK Preview
Di fatto, quello che possiamo fare con questa versione dell’SDK è:
  • Ricevere (o leggere) informazioni da alcuni sensori contenuti nel device;
  • Inviare notifiche e creare tile sul device;
  • Personalizzare il tema del device.

Cosa serve per iniziare

Se vogliamo cominciare a sviluppare applicazioni per il nostro Windows Phone che fanno uso del Microsoft Band ci occorre:
  • Visual Studio 2013;
  • Windows Phone 8.1 SDK;
  • Un band.
Avere il Band fisico è al momento l’unico modo per poter sviluppare con questo SDK non essendo stato rilasciato alcun simulatore/emulatore per lo stesso.

Vedremo che l’architettura dell’SDK si basa molto sul concetto di interfaccia e, quindi, l’idea di poter usare un simulatore al posto del device fisico non è così campata in aria.

Nel prossimo post cominceremo a dare un’occhiata approfondita all’SDK realizzando la nostra prima applicazione "Hello Band!" che si connetterà al Band in pairing con il telefono e ne recupererà la versione software e hardware. Cercheremo anche di dare un’occhiata a come è strutturato l’SDK e quali sono le classi che entrano in gioco.

Rimanete collegati!!


martedì 20 gennaio 2015

I CommunityDays dei record!!!

So che non sono solo i numeri a fare un evento o una conferenza ma:

  • 3 giornate
  • 15 track
  • 101 sessioni
  • 50 speaker

sono gran bei numeri!!!!

Community Days 2015

Da pochi giorni è on-line l’agenda dei prossimi Community Days che si terranno a Milano dal 24 al 26 Marzo 2015 ed il parterre degli speaker è di tutto rispetto e degno di una conferenza a pagamento.

Le sessioni, poi, non sono state mai così tante (per far capire la portata, le sessioni della scorsa edizione, quella del 2014, erano circa una 90-ina ed il terzo giorno era una giornata non-tecnica) e, soprattutto, così varie.
Si va dal C++ a Kinect passando per Architettura, Cross-Platform, Windows 10, Azure, IoT e quanto di più all’avanguardia si può trovare nell’ecosistema Microsoft (e non solo).

Considerato che di mancata di formazione e aggiornamento in questo lavoro si muore (lavorativamente parlando, ovviamente), mi sembra il caso di partecipare. Un viaggio e due notti in hotel (se non siete di Milano o di zone limitrofe) sono ampiamente ripagate dal know-how e dalla carica che un evento del genere puo’ portare!!!

Quindi non ci sono scuse: tutti a Milano e facciamo “debordare” la sede Microsoft!!!!

 

lunedì 19 gennaio 2015

MSDN Blog Guest Post: Microsoft OCR Library per Windows Runtime

Vi segnalo il mio post pubblicato sul blog ufficiale del team MSDN Italia dal titolo Microsoft OCR Library per Windows Runtime che tratta della libreria OCR per Windows Store App e Windows Phone rilasciata da Microsoft a meta’ del 2014.
Il blog del team MSDN Italia
Potete trovare l’esempio completo per Windows Phone nella sample gallery di Microsoft al seguente link.

lunedì 12 gennaio 2015

Anno nuovo …..expertise nuova!!!

Quest’oggi è arrivato a casa il kit MVP per l’anno 2015 (per noi MVP è come se tornasse Babbo Natale una seconda volta) e, assieme al kit, è arrivata anche una sorpresa: il cambio di expertise.

Per chi non lo sapesse, l’expertise è la categoria, la specializzazione, di noi MVP e ci caratterizza.

Fino al 2014 sono stato orgogliosamente MVP per la categoria VB.NET, ma ora le categorie di linguaggio (VB.NET e C#) sono state fuse in un unica categoria: .NET MVP!

WP_20150112_19_46_55_Pro

Dentro di me sono un VB.NET fan, però, è altrettanto vero che nel mio lavoro quotidiano mi trovo a che fare anche con clienti che lavorano in C#.

Quindi, alla fine, sono contento della nuova categoria, ma non vi libererete facilmente degli esempi e dei post in VB.NET!!!! SmileSmile

lunedì 5 gennaio 2015

Kinect V2 e le espressioni facciali su ioProgrammo di gennaio

Vi segnalo il mio articolo su ioProgrammo di gennaio/febbraio 2015 (numero 195) riguardante il Kinect V2 e le funzionalita’ di riconoscimento delle espressioni facciali.

4-195g

Nell’articolo trovate la realizzazione di una semplice applicazione che recupera le espressioni facciali tramite l’SDk del Kinect e le mostra utilizzando un “orsetto” come avatar.

Figura08

Nell’immagine l’orsetto ha l’occhio sinistro chiuso come l’utente posto di fronte al Kinect.

 

giovedì 1 gennaio 2015

E sono 5!!!!!

 

MVP_Logo_Horizontal_Secondary_Blue286_CMYK_300ppi

Sono orgoglioso di condividere con tutti il fatto di essere stato eletto, per la quinta volta consecutiva, Microsoft MVP!!!

Per chi non ci è passato può sembrare strano, ma attendere la mail da Microsoft che conferma l’award è una piacevole sofferenza….e, io, ho avuto la fortuna di provarla per la quinta volta!!!

Uno stimolo a fare meglio e di più, ma soprattutto l’onore di appartenere ad una meravigliosa famigghia, quella di tutti gli MVP mondiali!!!

Ancora grazie a DomusDotNet e a tutti i suoi componenti , a dotNet{podcast} (appena nata ma che già mi ha dato grosse soddisfazioni) e ai mie due soci fondatori, a tutti quelli che mi sopportano e mi supportano (in primis il mio capo che ha a che fare con uno come me e ancora non mi ha licenziato Smile ) e a quella santa donna di mia moglie (il vero CAPO).

Ora scusate ma vi devo lasciare, mi debbo mettere al lavoro per tentare di arrivare alla 6a nomination!!! Smile Smile

 

martedì 30 dicembre 2014

lunedì 15 dicembre 2014

“Bluetooth LE & Lumia Sensor Core” al Mobile Camp del 10/12/2014

Vi condivido il materiale della mia sessione riguardante “Bluetooth LE & Lumia Sensor Core con Windows Phone 8.1” tenuta al Mobile Camp di Roma del 10/12/2014.


Appena possibile metterò on-line anche il video della sessione.

Saluti!