martedì 17 marzo 2015

Microsoft Band SDK Preview - Personalizzazione

In questo post prenderemo in esame l’ultima serie di API attualmente disponibile per sviluppare con Microsoft Band ed in particolare le API relative alla personalizzazione del device.
Come già visto nei precedenti post della serie, tutte le API sono esposte dall’interfaccia IBandClient e, in particolare, da 4 proprietà esposte dalla stessa.
Nel caso della personalizzazione, la proprietà che funge da gateway per le API è la PersonalizationManager, di tipo IBandPersonalizationManager.

image

Possiamo suddividere le funzionalità di gestione della personalizzazione in due macro aree: gestione dell’immagine della “Me Tile” e gestione del tema.

Me Tile

La “Me Tile” è la finestra principale del Band, quella che mostra l'orario e uno a scelta (dell’utente) tra battito cardiaco, passi fatti, calorie bruciate o distanza percorsa.

image

E’ possibile personalizzare, al momento, lo sfondo della “Me Tile” utilizzando un’immagine 310x102 pixel.
L’interfaccia IBandPersonalizationManager mette a disposizione due metodi per la gestione di tale immagine:
  • GetMeTileImageAsync: permette di recuperare l’immagine corrente della “Me Tile”. Il valore restituito, se il Band è correttamente connesso, è un’istanza della classe BandImage;
  • SetMeTileImageAsync: consente di impostare l’immagine della “Me Tile”.

Entrambi i metodi lavorano su istanze della BandImage e l’SDK mette a disposizione dei metodi di estensione per convertire WriteableBitmap in BandImage e viceversa.

image

Nel seguente pezzo di codice possiamo vedere come recuperare l’immagine della “Me Tile”

Try
     Await App.CurrentBandClient.PersonalizationManager.SetMeTileImageAsync(wBitmap.ToBandImage())
 Catch ex As BandException

 End Try

Nel precedente esempio, App.CurrentBandClient è un’istanza valida di BandClient (come visto nei precedenti post) e wBitmap è la bitmap che vogliamo utilizzare.
In maniera analoga, per recuperare l’immagine corrente della “Me Tile” possiamo scrivere:

Try
     Dim bandImage = Await App.CurrentBandClient.PersonalizationManager.GetMeTileImageAsync()
Catch ex As BandException

End Try

Theme

L’altra macro area a cui possiamo accedere è quella della personalizzazione dei colori utilizzati dal Band: il tema.
Il tema del Band è composto da sei colori, il cui significato e nome è illustrato nella seguente immagine:

image

L’interfaccia IBandPersonalizationManager ci mette a disposizione due metodi (con relativi overload) per poter gestire il tema:
  • GetThemeAsync: consente di recuperare il tema corrente del Band. Il risultato è un’istanza della classe BandTheme;
  • SetThemeAsync: consente di impostare il tema del Band.

La classe BandTheme espone i sei colori illustrati nella precedente immagine come proprietà di tipo BandColor.
image

Come già visto in un precedente post della serie, abbiamo a disposizione degli extension method per poter convertire un oggetto di tipo Windows.UI.Color in BandColor e viceversa.
Il seguente pezzo di codice mostra come impostare un tema per il band:

Try
    Dim tema = New BandTheme()
    tema.Base = Colors.LightBlue.ToBandColor()
    tema.HighContrast = Colors.Blue.ToBandColor()
    tema.Highlight = Colors.BlueViolet.ToBandColor()
    tema.Lowlight = Colors.LightCyan.ToBandColor()
    tema.Muted = Colors.DarkBlue.ToBandColor()
    tema.SecondaryText = Colors.White.ToBandColor()

    Await App.CurrentBandClient.PersonalizationManager.SetThemeAsync(tema)
Catch ex As BandException

End Try

Con questo post termina la prima mini serie dedicata all’SDK del Band.

L’esempio completo utilizzato in questo post è scaricabile al seguente link.


giovedì 12 marzo 2015

Microsoft Band SDK Preview - Notifiche

In questo post della serie dedicata all’SDK del Microsoft Band ci occuperemo delle funzioni messe a disposizione dello sviluppatore per l’invio di notifiche al device.
Nell’attuale versione dell’SDK (che ricordiamo essere la 1.3.10219), abbiamo a disposizione le seguenti tipologie di notifiche:
  • Messagge: il message è una notifica, inviata ad una tile particolare, composta da un titolo e da un testo che rimane memorizzata nel device. Il message può generare un avvertimento all’utente o meno;
  • Dialog: il dialog e’ una notifica, inviata ad una tile particolare, anch’essa composta da un titolo e da un testo ma non rimane memorizzata tra i messaggi della tile e genera sempre un avvertimento per l’utente (è un vero e proprio dialog).
Oltre alle notifiche che trasportano testo, è possibile anche far "vibrare" il device.
Tutte e funzionalità di notifiche sono esposte dall’interfaccia IBandNotificationManager. Possiamo recuperare un’istanza valida di questa interfaccia dalla proprietà NotificationManager dell’interfaccia IBandClient.

image

L’interfaccia IBandNotificationManager espone tre metodi (con opportuni overload) per gestire le notifiche.

SendMessageAsync

Il metodo SendMessageAsync permette di inviare una notifica di tipo Message ad una specifica Tile.

Try
    Await App.CurrentBandClient.NotificationManager.SendMessageAsync(TileFactory.AppTileId,
                                                                    NotificationTitleText.Text,
                                                                    NotificationBodyText.Text,
                                                                    DateTimeOffset.Now,
                                                                    Notifications.MessageFlags.ShowDialog )
Catch ex As BandException

End Try

Nell’esempio precedente App.CurrentBandClient è un’istanza valida di IBandClient e TileFactory.TileId è il Guid della tile a cui inviare la notifica.
Da notare la possibilità di definire anche un DateTimeOffset che apparirà all’utente sul Band e l’enumerazione MessageFlags indicare se deve essere visualizzato il messaggio all’utente o semplicemente accodato il messaggio a quelli presenti nella tile.
Questo tipo di notifica viene memorizzato sul Band e, in caso di messaggi non letti, viene visualizzato il badge numerico e la small tile per segnalare il numero di messaggi in attesa di lettura.

SendDialogAsync

Il metodo SendDialogAsync permette di inviare una notifica di tipo Dialog al Band.

Try
    Await App.CurrentBandClient.NotificationManager.ShowDialogAsync(TileFactory.AppTileId,
                                                                    NotificationTitleText.Text,
                                                                    NotificationBodyText.Text)
Catch ex As BandException

End Try

La notifica di tipo Dialog non viene memorizzata sul Band e viene sempre visualizzata la notifica all’utente.

SNAGHTMLa5b08cb

Sia per i Message che per i Dialog, se il guid della Tile non corrisponde ad una tile dell’app, si ottiene una eccezione di tipo BandException.

VibrateAsync

Il metodo VibrateAsync permette di inviare quello che viene chiamato “Haptics” (una vibrazione) al Band. L’invio di notifiche di tipo Message e Dialog genera automaticamente l’haptics del Band.

Try
    Await App.CurrentBandClient.NotificationManager.VibrateAsync(vibrationTypeSelected)
Catch ex As bandException

End Try

In questo caso non serve il tileid (la vibrazione viene inviata al band e non ad una tile specifica).
Il progetto completo riguardante le notifiche è scaricabile al seguente link.


lunedì 9 marzo 2015

Microsoft Band SDK Preview–Tile

In questo post dedicato alla Preview dell’SDK DI Microsoft Band ci occuperemo delle funzionalità relative alla gestione delle tile sullo smartwatch.

L’interfaccia IBandClient, tra le proprietà che espone e che ci consentono di accedere alle funzionalità del Band, espone anche la TileManager il cui nome è, evidentemente, tutto un programma.

image

La proprietà TileManager è un’ istanza dell’interfaccia IBandTileManager che, a sua volta espone, 4 operazioni:
  • AddTileAsync : permette di aggiungere (ove ce ne fosse spazio) una tile all’interno della stripe delle tile del Band;
  • GetRemainingTileCapacityAsync: restituisce il numero di posizioni disponibili all’interno della stripe delle tile del Band. Se non c’è più posto otterremo il valore 0;
  • GetTilesAsync: restituisce l’elenco delle tile aggiunte alla stripe del Band da parte della nostra applicazione;
  • RemoveTileAsync: rimuove una tile dalla stripe delle tile del Band.
Prima di entrare nel merito delle operazioni offerte dall’interfaccia IBandTileManager, diamo un’occhiata all’oggetto Tile del Band.

image

Come possiamo vedere dalla precedente figura una tile è composta da:
  • TileId: un guid che identifica univocamente la tile e che ci consentirà di gestire le notifiche alla tile stessa;
  • Name: una stringa che definisce il nome della tile;
  • IsBadgingEnabled: indica se la tile può visualizzare il numero di notifiche ricevute o meno;
  • SmallIcon e TileIcon: rappresentano rispettivamente l’immagine della tile quando appare il numero delle notifiche e l’immagine della tile in visualizzazione normale. La TileIcon è obbligatoria, la SmallIcon no;
  • Theme: permette di impostare un tema particolare per la tile.
Le immagini che possiamo utilizzare nelle tile debbono essere monocolore (bianche) con trasparenza e debbono avere dimensioni 46x46 pixel per la TileIcon e 24x24 pixels per la SmallIcon.

image

Inoltre le due immagini debbono essere istanze della classe BandIcon. Questa classe non ha costruttore ma fortunatamente l’SDK del Band ci mette a disposizione un paio di metodi di estensione per poter convertire una WriteableBitmap in una BandIcon e viceversa:

Dim bitmap As WriteableBitmap=New WriteableBitmap(46,46)
' WriteableBitmap --> BandIcon
Dim bandIcon as BandIcon = bitmap.ToBandIcon()
' BandIcon --> WriteableBitmap
Dim newBitmap=bandIcon.ToWriteableBitmap()

Nel pezzo di codice seguente viene mostrato come creare una Tile con delle immagini memorizzate nell’asset dell’applicazione:

Public Shared Async Function CreateStandardTileAsync(tileName As String, isBadgingEnabled As Boolean) As Task(Of BandTile)
    Dim tile = New BandTile(Guid.NewGuid())
    
    tile.Name = tileName
    tile.IsBadgingEnabled = isBadgingEnabled
    Dim icon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconLarge.png"))
    Dim smallIcon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconSmall.png"))
    tile.TileIcon =  icon.ToBandIcon()
    tile.SmallIcon = smallIcon.ToBandIcon()

    Return tile
End Function

In questo caso si e’ utilizzato il package WriteableBitmapEx, disponibile su NuGet, per poter avere a disposizione la classe BitmapFactory.

GetRemainingTileCapacityAsync

L’operazione GetRemainingTileCapacityAsync, dell’interfaccia IBandTileManager, ci permette di sapere quanti “posti” sono disponibili per le nostre tile.

Try
    Dim tileCapacity = Await App.CurrentBandClient.TileManager.GetRemainingTileCapacityAsync()
    RemainingTileCapacityText.Text = tileCapacity.ToString()
Catch ex As BandException

End Try

Nell’esempio precedente App.CurrentBandClient è un’istanza valida di IBandClient che possiamo ottenere, come visto nei precedenti post della serie, connettendoci ad un Band.
Se non ci sono slot disponibili per le tile, il risultato della chiamata al metodo è il valore 0.
La nostra app dovrebbe sempre controllare, prima di aggiungere una tile, che ci sia posto in modo da evitare di generare eccezione nel momento in cui si tenta di aggiungere una nuova tile.

GetTilesAsync

Il metodo GetTilesAsync permette di recuperare l’elenco delle BandTile che la nostra app ha aggiunto al Band.

Try
    Dim tiles = Await App.CurrentBandClient.TileManager.GetTilesAsync()
    TileList.ItemsSource = tiles
Catch ex As BandException

End Try

La collezione non conterrà alcun elemento se non abbiamo mai aggiunto tile.

AddTileAsync

Il metodo AddTileAsync permette di aggiungere una tile alla stripe delle tile del Band (se ci sono posti liberi).

Try
    If Await App.CurrentBandClient.TileManager.AddTileAsync(tile) Then
        Dim msgDlg = New MessageDialog("Tile added!!")
        Await msgDlg.ShowAsync()
        NavigationHelper.GoBack()
    End If
Catch ex As Exception

End Try

Se non ci sono posti liberi e tentiamo di aggiungere una tile, otteniamo un’eccezione di tipo InvalidOperationException.
Se, invece, abbiamo spazio per inserire la tile, il sistema mostrerà all’utente la finestra di conferma (attualmente non bypassabile) mostrata nella seguente figura:

SNAGHTML53355a7


RemoveTileAsync

Il metodo RemoveTileAsync permette la rimozione di una tile dalla stripe delle tile del Band. Il metodo accetta sia una tile (magari recuperata utilizzando il metodo GetTilesAsync esposto in precedenza), sia il guid di una tile.

Try
     If Await App.CurrentBandClient.TileManager.RemoveTileAsync(tile) Then
         Dim msgDlg = New MessageDialog("Tile removed!!")
         Await msgDlg.ShowAsync()
     End If
 Catch ex As Exception

 End Try

Se la tile (o il guid della tile) non esiste, il metodo restituisce false. Se la rimozione avviene con successo, il metodo restituisce true.

Cambiare il tema della tile

E’ possibile impostare un tema differente rispetto a quello del Band nel momento in cui si aggiunge una tile, semplicemente valorizzando la proprieta’ Theme dell’istanza di BandTile.

Public Shared Async Function CreateStandardTileAsync(tileName As String, isBadgingEnabled As Boolean) As Task(Of BandTile)
    Dim tile = New BandTile(Guid.NewGuid())
    
    tile.Name = tileName
    tile.IsBadgingEnabled = isBadgingEnabled
    Dim icon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconLarge.png"))
    Dim smallIcon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconSmall.png"))
    tile.TileIcon =  icon.ToBandIcon()
    tile.SmallIcon = smallIcon.ToBandIcon()

    Return tile
End Function

Public Shared Async Function CreateRedTileAsync(tileName As String, isBadgingEnabled As Boolean) As Task(Of BandTile)
    Dim tile = Await CreateStandardTileAsync(tileName, isBadgingEnabled)
    tile.Theme=New Personalization.BandTheme()
    With tile.Theme
        .Base=Colors.Red.ToBandColor()
        .HighContrast=Colors.blueviolet.ToBandColor()
        .Highlight=Colors.blueviolet.ToBandColor()
        .SecondaryText=Colors.LightGray.ToBandColor()
        .Muted=Colors.DarkRed.ToBandColor()
        .Lowlight=Colors.DarkRed.ToBandColor()
    End With

    Return tile
End Function

Nell’esempio precedente viene impostato il tema della tile valorizzando opportunamente i colori. Il significato dei colori è riportato nella seguente figura.

image

La classe BandTheme (che vedremo dettagliatamente in un successivo post) una proprieta’ per ogni colore del tema. Queste proprietà sono di tipo BandColor, una struttura proprietaria dell’SDK del Band. Anche in questo caso abbiamo un metodo di estensione (il metodo ToBandColor) che ci consente di convertire un colore espresso con la classe Windows.UI.Color nella struttura BandColor corrispondente.

Nell’attuale versione dell’SDK sembrerebbe che il colore Base (cioè quello dello sfondo dell’icona non venga preso in considerazione).

Vedremo in un post apposito i dettagli sulla personalizzazione del Band e su come usare l’SDK per impostare il tema del device.

Il codice sorgente dell’esempio usato in questo post è disponibile al seguente link.

Rimanete connessi!!!


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.