Démarrer dans l’IoT avec le Raspberry Pi 3 et Windows 10 : Développement UWP (3/N)

Démarrer dans l’IoT avec le Raspberry Pi 3 et Windows 10 : Développement UWP (3/N)

Vous l’avez attendu, le voici le voilà, le troisième (en réalité il s’agit du quatrième) article de ma série sur l’IoT, Windows 10 IoT Core et le Raspberry Pi 3 !

Après avoir regardé en détails l’installation, la prise en main et quelques outils, je vais aborder maintenant les bases du développement UWP pour Windows IoT.

Mais attention SPOILERS : En fait, vous vous rendrez vite compte que c ‘est presque comme sur les autres plateformes 🙂 Vive UWP !

1 – Démarrer dans l’IoT avec le Raspberry Pi 3 et Windows 10 : Installation & Prise en Main (1/N)
1,5 – Démarrer dans l’IoT avec le Raspberry Pi 3 et Windows 10 : Utiliser des Builds Insider (1,5/N)
2 – Démarrer dans l’IoT avec le Raspberry Pi 3 et Windows 10 : Windows Device Portal (2/N)
3 – Démarrer dans l’IoT avec le Raspberry Pi 3 et Windows 10 : Développement UWP (3/N)

Création d’un projet standard

Comme annoncé avec le spoiler, avec la plateforme UWP (Universal Windows Platform) et son intégration dans Windows 10, Microsoft propose ENFIN un framework de développement d’applications unifié pour ses smartphones, tablettes & PC mais qui profitera aussi à des nouveaux devices comme la Xbox One, la Surface Hub, les lunettes HoloLens et pour ce qui nous concerne les périphériques IoT.

La création d’un projet de développement IoT passe donc par Visual Studio 2015 ou 2017 et la création d’un projet de type « Windows Universal » . Si vous possédez déjà un projet existant, pas de modification à faire. Il suffit juste de vérifier que votre niveau d’API ne soit pas supérieur à celui de votre périphérique IoT. (Un projet créé avec la mise à jour Creators Update ne fonctionnera pas avec un périphérique sous Anniversary Update car antérieure).

 

 

A la création d’un projet de type « blank application » celui-ci se buildera et s’exécutera sans autre ajout de votre part.

Remote Debug

Comme pour un projet UWP classique, il est possible de directement tester notre projet sur une machine distante (ici le périphérique IoT).

On peut soit faire une recherche et avoir le périphérique distant proposé, soit il faudra indiquer l’adresse IP. Il faut bien sûr être sur le même réseau (Wifi ou Ethernet)

A noter que le premier déploiement pourra nécessiter quelques minutes dans le cas où le package doit transiter par Wifi. Pour les déploiements suivants, Visual Studio est capable de dissocier les modifications apportées et au final de n’envoyer que le delta, ce qui ne prend plus que quelques secondes.

Comme un remote debug classique, les fonctionnalités complètes de Visual Studio sont disponibles, comme les points d’arrêts (breakpoints), le pas à pas ou encore la visualisation des données de variables.

Ici par exemple, à la suite d’un breakpoint je visualise la donnée de ma variable gpio. Le programme s’exécutant sur mon Raspberry Pi 3 via mon Visual Studio.

Events Tracing

Comme n’importe quel périphérique Windows 10, il est possible d’accéder/écrire des données de logs avec le Event Tracing for Windows. Le code nécessaire est le même dans le cadre d’une application UWP.

L’utilisation de la classe LoggingChannel est simple et permet un niveau de précision suffisant pour la majorité des projets. Il est possible de loguer des messages, des évènements, des variables type clés/valeurs, le tout avec différents niveaux de logs possibles (Verbose, Information, Warning, Error, Critical)

Concernant la partie visualisation, on peut regarder les logs directement par le Windows Device Portal, Onglet Debug puis ETW.

En choisissant le provider Custom (Guid 96D417AA-628A-416D-B12B-C495145148B1 utilisé), nous allons pouvoir voir en direct nos données de logs mais aussi récupérer les données sous format fichier (csv) afin de les ré-exploiter.

Le contenu de la colonne Payload contient des métadonnées (ProcessId, ThreadId) et bien sur le contenu du message que l’on a envoyé.

12/21/2017-15:35:55.0096688,IoTDemoAPP,0,ActivityId:{00000000-0000-0000-0000-000000000000},Keyword:1,Level:5,OpCode:0,ProcessId:4768:3460,ProviderName:IoTDemoAPP,RelatedActivityId:{00000000-0000-0000-0000-000000000000},StringMessage: »Initialisation du logging »,TaskName:LogMsgVerbose,ThreadId:3460,WebbCompletePayload:ActivityId:{00000000-0000-0000-0000-000000000000}, OpCode:0, RelatedActivityId:{00000000-0000-0000-0000-000000000000}, StringMessage: »Initialisation du logging »,

Pourquoi choisir cette méthode plutôt qu’une solution tierce comme NLog ? ETW apporte en plus sa propre fonctionnalité d’API, ce qui permet ainsi de mettre en place un système de rapatriement des logs de manière simple et efficace. Pour en savoir plus sur les API de Device Portal et notamment celles pour ETW, c’est ici : https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-core#etw

Les différences

Windows IoT Extensions for UWP

Comme démontré auparavant, beaucoup de fonctions sont partagées entre les différents périphériques au sein d’une application UWP. Mais certaines sont uniquement disponibles pour IoT. Pour cela, une extension Visual Studio (versionnée par niveau d’API) existe, l’extension « Windows IoT Extensions for UWP« .

Cette extension donne droit à une nouvelle branche d’API :

Windows.System.SystemManagementContract

Cet ensemble d’API permet d’accéder notamment à la méthode « ProcessLauncher.RunToCompletionAsync()« , méthode permettant de lancer un autre process/application avec des paramètres ou encore à la méthode  » ShutdownManager.BeginShutdown() » qui permet d’éteindre/relancer le périphérique.

Les APIs non-disponibles

Comme expliqué auparavant, Windows 10 IoT Core est un sous-ensemble de Windows 10 et ne propose pas l’intégralité des fonctionnalités. Eh bien, cela se retrouve aussi dans les fonctionnalités que le développeur a à sa disposition. Certaines APIs ne sont pas disponibles dans le cadre d’un projet ciblant Windows 10 IoT Core, mais cela reste très logique.

Par exemple :

Windows.ApplicationModel.Calls.PhoneLine 
Windows.ApplicationModel.Chat.ChatMessage 
Windows.Security.Credentials.UI.CredentialPicker

Ce ne sont que quelques exemples, mais rapidement on remarque que leur absence est dû au besoin même du périphérique IoT, qui n’aura pas forcément d’interface visuelle ou encore de type d’input possible.

Dans le cadre d’un projet multi-périphériques, il faudra donc faire attention à ne pas utiliser ces APIs spécifiques.

La liste entière des APIs UWP non-disponibles sous Windows 10 IoT Core est disponible (temporairement) ici : https://developer.microsoft.com/en-us/windows/iot/docs/unavailableapis

Background Application

A contrario du point précédent, voici une nouveauté disponible uniquement dans IoT Core. Les background applications ! En supplément des applications UWP traditionnelles, Microsoft permet d’avoir des applications en tâche de fond, ne disposant pas d’interface graphique. Celles-ci implémentent l’interface « IBackgroundTask », disposent d’une unique méthode d’entrée « Run » et se comportent comme les BackgroundAgents que l’on pouvait retrouver sur Windows Phone et/ou Windows 8.

Une background application peut, après configuration, se lancer à chaque démarrage du périphérique, ne sera pas concernée par les limites d’utilisations de ressource et après crash, le système la relancera automatiquement.

Mais, sur le même principe qu’un BackgroundAgent, une fois la méthode « Run » finie, l’application se fermera. Pour développer avec de l’asynchronisme ou faire exécuter notre application continuellement, il faut utiliser l’objet « BackgroundTaskDeferral » et faire appel à sa méthode « deferral.Complete() » afin de fermer définitivement l’application.

Afin de créer une application en arrière-plan, Microsoft ne propose pas directement cette possibilité. Fait étonnant, il faut passer par l’installation d’une extension Visual Studio, Windows IoT Core Project Template. Attention là encore, 2 liens sont disponibles, un pour Visual Studio 2015 (https://marketplace.visualstudio.com/items?itemName=MicrosoftIoT.WindowsIoTCoreProjectTemplates) et un pour Visual Studio 2017 (https://marketplace.visualstudio.com/items?itemName=MicrosoftIoT.WindowsIoTCoreProjectTemplatesforVS15).

Maintenant que nous avons vu le développement classique avec UWP, dans le prochain article je parlerais du développement spécifique à l’IoT avec l’utilisation des capteurs.

 

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

%d blogueurs aiment cette page :