Close

Bluetooth Low Energy sous Windows Phone : Différences entre Silverlight et WinRT

Comme vous le savez très certainement, si vous suivez un peu ce blog, j’ai présenté une session aux TechDays 2015 sur le Bluetooth Low Energy dans les applications Windows (sous entendu applications universelles Windows Store et Windows Phone), vous trouverez d’ailleurs quelques infos ici.

Je suis en train de préparer un article complet qui reprendra chaque point de cette session, mais en attendant je vous propose de voir quelques différences entre la gestion du BLE en WinRT et en Silverlight.

Actuellement vous pouvez développer des applications Windows Store uniquement en utilisant Windows RT, alors que pour Windows Phone vous avez le choix entre Windows RT et Silverlight.

Chose importante aussi, BLE n’est supporté qu’à partir de Windows Phone 8.1 et Windows 8.1 donc pour les versions précédentes on se contentera du Bluetooth classique.

Dernièrement j’ai voulu ajouter des fonctions BLE (Bluetooth Low Energy) dans une applications Windows Phone Silverlight et je me suis rendu compte de 2 choses importantes :

  • Les fonctions BLE en WinRT sont accessibles depuis SL mais ne fonctionnent pas.
  • Les fonctions BLE incluses dans SL fonctionnent mais sont différentes de celles de WinRT

Capabilities

Elles doivent être placées au même endroit, dans le fichier « Package.appxmanifest » du projet, qu’on soit en SL ou en WinRT.

Par exemple, déclaration de 2 GATT services :

   <Capabilities>
    <Capability Name="internetClient" />
    <m2:DeviceCapability Name="bluetooth.genericAttributeProfile">
      <m2:Device Id="any">
        <m2:Function Type="serviceId:0000ffe0-0000-1000-8000-00805f9b34fb"/>
        <m2:Function Type="serviceId:f000aa50-0451-4000-b000-000000000000"/>
      </m2:Device>
    </m2:DeviceCapability>
  </Capabilities>

Connexion à un service

Le code de connexion à un service (qui aura au préalable été déclaré dans les capabilities sinon vous n’aurez aucune possibilité de vous y connecter) est légèrement différent en Silverlight et en WinRT.

Voici une fonction qui recherche à se connecter à un service avec la vérification que le serveur est un SensorTag (code en WinRT puis en Silverlight) :

WinRT

N’oubliez pas de déclarer les espaces de noms suivants :

Windows.Devices.Bluetooth.GenericAttributeProfile
Windows.Devices.Enumeration

private async Task<GattDeviceService> GetDeviceService(Guid service)
{
    var filter = GattDeviceService.GetDeviceSelectorFromUuid(service);
    var deviceInfos = await DeviceInformation.FindAllAsync(filter);

    foreach (var deviceInfo in deviceInfos)
    {
        if (deviceInfo.Name == "TI BLE Sensor Tag")
        {
            // On a trouvé un SensorTag qui implémente le service recherché
            return await GattDeviceService.FromIdAsync(deviceInfo.Id);
         }
     }

    return null;
}

Silverlight

N’oubliez pas de déclarer les espaces de noms suivants :

Windows.Devices.Enumeration
Windows.Devices.Bluetooth
Windows.Devices.Bluetooth.GenericAttributeProfile

private async Task<GattDeviceService> GetDeviceService(Guid service)
{
    var deviceInfos = await DeviceInformation.FindAllAsync(BluetoothLEDevice.GetDeviceSelector());

    foreach (var deviceInfo in deviceInfos)
    {
        if (deviceInfo.Name == "TI BLE Sensor Tag")
        {
            // On a trouvé un SensorTag qui implémente le service recherché

            var bluetoothDevice = await BluetoothLEDevice.FromIdAsync(deviceInfo.Id);
            var gattService = bluetoothDevice.GetGattService(service);

            return gattService;
        }
    }

    return null;
}

Accès aux caractéristiques

Pour ce qui est d’accéder aux caractéristiques, le principe est le même en WinRT et en Silverlight.

Par contre, en Silverlight la manipulation des buffers est moins simple car les classes DataReader et DataWriter de Silverlight ne travaillent pas directement sur un IBuffer qui est systématiquement utilisé pour lire et écrire des données au niveau des caractéristiques.

Dans Silverlight le plus simple est de passer par un tableau de bytes en utilisant les méthodes ToArray() pour passer du IBuffer au tableau et AsBuffer() pour passer du tableau de bytes au IBuffer.

Note : Pour avoir accès à la méthode AsBuffer depuis un tableau de bytes vous devez déclarer l’espace de nom System.Runtime.InteropServices.WindowsRuntime, que vous soyez en WinRT ou en Silverlight.

 

Conclusion

Les différences ne sont pas énormes mais suffisamment importantes pour dérouter le développeur qui débute dans ce genre de développement.

 

Stéphane Sibué