.Net Core 3.0 (C#,F#, Visual basic .Net)

Parce qu'il en faut pour tout le monde, discutez ici d'ADA, de shell et autres Wolfram...

Modérateur : Francois

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » mer. 11 déc. 2019 15:51

Pour l’exemple d‘utilisation du GPIO, on va faire un grand classique à savoir, faire clignoter une led. On ne va pas la faire clignoter pour rien, on va dire que son clignotement indique que l’application est bien démarrée et qu’elle tourne. Pour ça, je vais créer un service que je vais inclure dans l’application (si si, on peut …) et je ne vais bien sûr pas utiliser un abominable pool while comme on le voit dans des millions de tuto qui font ça, mais utiliser un timer asynchrone exclusivement dédié à ce service.

Comme ici tout est objet, le service est aussi un objet, donc première chose à faire, créer une nouvelle class que l’on appellera par exemple AppRunning.cs
Clik droit sur le projet (MyApp)->Ajouter->Classes … et dans le champ Nom : on replace Class.cs par AppRunning.cs puis on clique sur le bouton Ajouter. Le fichier est maintenant dans l’explorateur de solution et on l’ouvre en double cliquant dessus.

Dans un premier temps je ne vais pas utiliser de led mais me contenter de logger l’état d’un boolean dans la console. Pour ça, je vais permettre à mon service de logger, ce qui me permettra de savoir quand il démarre ce qu’il fait et quand il s’arrête. En plus ce service va utiliser un timer et une pin du GPIO, il faut donc que je puisse libérer proprement ces ressources si je décidais de disposer du service ou tout simplement quand l’application s’arrêtera. Voila donc le code que je mets dans la classe AppRunning.cs (1). Bon si vous le tapez à la main, vous aller vite vous rendre compte que VS écrit la moitié du code tout seul juste en cliquant sur les bons choix proposés en temps réel par l’IntelliSense. Ensuite, il ne reste plus qu’à ajouter le service dans le conteneur d’injection prévu a cet effet (ConfigureServices dans le fichier Startup.cs) (2).
service#1.png
service#1.png (115.32 Kio) Vu 768 fois
Démarrez l’application (MyApp) depuis l’IDE. On accède toujours à la page hello world, dans la console on a bien l’indication que le service a démarré (AppRunning Service Started). Toutes les seconde on à l’état changeant du booléen qui prouve bien que le service tourne. Faite maintenant un ctrl+c dans la console, l’application s’arrête et on a bien l’indication que le service s’est arrêté (AppRunning Service Stopped) et que le timer a bien été libérer (Timer Dispose).

Dans le post suivant, je remplacerais le logger par un contrôleur GPIO et j’attacherai une pin au booléen _etat.


Ps : Pour avoir de l’aide sur un mot clé que vous ne comprenez pas, sélectionnez le dans l’éditeur de code et faite F1. Dans la plus grande majorité des cas, ça vous ouvrira une page qui pointe sur la doc.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » mer. 11 déc. 2019 20:49

Voilà le code du service AppRunning modifié ou j’ai juste remplacé le logger par une led que j’ai planté sur la gpio18 (marquage BCM)(1) et comme je suis susceptible d’utiliser le GpioControleur dans d’autre classes, je l’ai directement ajouté comme un sigleton dans le conteneur de services (2).

Alors bien sur si maintenant je démarre l’appli sur le pc, j’ai un merveilleux message qui me dit qu’il ni a pas de contrôleur de GPIO mais Je pense qu’il y a moyens de détecter ça et de conditionner pour pouvoir malgré tout démarrer l’appli pour profiter de tout ce qu’elle contient n’utilise pas de gpio. Là j’ai déjà l’assurance que je peux déployer exactement le meme programme en toute transparence sur n’importe quel plateforme linux, unix, android ou windows qui possède une gpio 18.
led.png
led.png (152.41 Kio) Vu 759 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » jeu. 12 déc. 2019 11:13

Je vous ai trouvé quelques trucs intéressants pour utiliser .Net Core 3 avec le PI

Déjà un petit HowTo ou l’auteur part d’un simple blink en .Net Core console codé comme un petit cochon dans un while et qui migre doucement vers ASP.Net Core pour piloter la led au travers d’une API Rest qui utilise un design pattern MVC. Apparemment il utilise ça avec un pi sous W10IoT, mais ça fonctionne tout pareil avec n’importe quel distri Linux
https://dzone.com/articles/aspnet-core- ... olling-led

Puis un tuto en 5 partie qui explique comment le faire en partant de 0 (install rapbian ….) pour aller jusqu’au pilotage d’une led et la relève temps reel d’une sonde DHT dans une application Blazor (Donc qui utilise du code C# dans le navigateur coté client) connectée avec SignalR (qui est a ASP.Net Core ce que Socket.IO est à NodeJs). L’auteur utilise Visual Studio Code et .Net Core Cli, ce qui peut intéresser ceux qui sont sous linux ou mac ou qui n’ont pas le réel besoin d’un Visual Studio Community.
https://codedbeard.com/iot-with-blazor-on-raspberry-pi/

Voila, cette petite présentation devrait suffire pour mettre le pied a l’étrier de ceux qui veulent découvrir cette solution. Si je tombe sur d’autre liens intéressant je viendrais les mettre ici.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » dim. 15 déc. 2019 10:54

Ce matin, petit test vite fait pour essayer l’espace System.Device.Spi avec IoT.Device.Adc en utilisant le meme principe d'injection de dépendance que pour le contrôleur GPIO. Le composant est un MCP3208 (8 x ADC 12 Bits) ou j’ai utilisé le meme montage que j’avais proposé sur le tuto NodeJS.

1 : Ajout des référence et ajout du composant dans le conteneur de dépendance.
2 : Injection du composant dans le constructeur de la classe du service et ajout d’une ligne pour logger le canal 0
3 : sortie

mcp3208.png
mcp3208.png (259.84 Kio) Vu 700 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » mar. 17 déc. 2019 11:51

Le Template vide que j’ai utilisé ne renvois qu’un string Hello World dans un réponse http. On peut remplacer ça par une page Razor. Les pages Razor sont un nouveau concept dASP.Net qui permet de simplifier l’approche MVC en regroupant le modèle, la vue et le contrôleur de chaque pages (ce qui s’approche plus d’un modèle MVVM). L’utilisation de pages Razor dans une application ASP.Net n’empêche pas d’y utiliser aussi un design pattern MVC conventionnel.

Si on veut distribuer des pages, on a tout intérêt à s’organiser un peu sinon ça risque vite d’être le boxon. Pour ça le mieux est de créer un sous répertoire dans l’application que l’on appelle ‘Pages’ (click droit sur le projet MyApp->Ajouter->Nouveau Dossier … que l’on nomme Pages). Ensuite click droit sur le dossier Pages->Ajouter->Page Razor->Bouton Ajouter et on l’appelle Index (1). Le projet contient maintenant la page MyApp/Pages/Index.cshtml.

Il faut ensuite ajouter l’extension RazorPages dans le conteneur de service et remplacer le point de terminaison (ici mis en commentaire) pour cibler la page razor (2). Tout ça se trouve dans la class Startup. La page par défaut devient automatiquement celle qui vient d’être créée (Index)
indexrazor.png
indexrazor.png (107.56 Kio) Vu 677 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » mar. 17 déc. 2019 17:26

Le modèle Razor simplifie énormément le codage des pages. On se balade très aisément entre le code du model, les codes c#, javascript et html de la vue
indexrazor2.png
indexrazor2.png (220.34 Kio) Vu 665 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » mar. 17 déc. 2019 21:41

Comme on ne fait pas de page web sans javascript et que l’on ne fait pas de javascript sans JQuery, on l’ajoute au projet. Comme pour tout le reste Visual Studio simplifie aussi l’ajout de bibliothèque à utiliser coté client. Clic droit sur le projet->Ajouter-> Bibliothèque coté client.

1 : On saisit jquery dans le champs bibliothèque (la recherche instantanée le propose en début de liste). On n’est pas obligé de tout importer et on peut se contenter du min.js et on définit bien l’emplacement cible. Clic sur le bouton Installer et l’Ide se charge de tout le boulot.

2 : Il créer wwwroot (et le décore d’une planète parce qu’il a compris ce que c’était) et ses sous dossier dans le projet et y place la librairie qu’il télécharge automatiquement.

3 : J’autorise mon application à servir des fichiers en ajoutant UseStaticFiles() (toujours dans Configure de la class Startup)

4 : Je peux maintenant inclure la librairie dans mes pages avec un classique src
addjs.png
addjs.png (47.93 Kio) Vu 646 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » mer. 18 déc. 2019 10:32

Le gestionnaire de bibliothèque coté client intégré à Visual studio est LibMan. Il est très light et permet de gérer plusieurs dépôts. Si on sait ce que l’on veut, on peut directement l’écrire dans le fichier libman.json (accessible par clic droit sur le projet->gérer les bibliothèques coté client). Exemple pour ajouter le min.js de jquery-ajax-unobtrusive depuis le dépôt unpkg :

Ensuite Il suffit juste d’enregistrer le fichier pour que VS créé les éventuels sous répertoires et rapatrie la bibliothèque (la saisie est controlée et auto-complémentée et les erreurs (mauvais nom de package …) sont clairement indiquées.
libman.png
libman.png (54.65 Kio) Vu 627 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » jeu. 19 déc. 2019 10:33

Le socket qui permet des échanges bi-lateraux en temps réel entre le serveur et les clients se nomme SignalR. Pour la mise en œuvre coté serveur, cela consiste à créer des Hubs dans lesquels on écrit les différentes méthodes à exposer aux clients. On peut aussi injecter ces Hubs pour pousser des données vers les clients. Comme pour tout le reste, un Hub est une class mais elle doit héritée de Hub (using Microsoft.AspNetCore.SignalR). Si c’est juste pour pousser des données vers les clients, elle n’a même pas besoin de contenir de méthode et le hub peut être injecter comme n’importe quel autre objet. Pour l’exemple, je vais créer un hub que je vais injecter dans mon service AppRunning pour pousser l’état de la led (le booléen _etat pour l’exemple) en temps réel vers des clients.

1 :Création d’un Hub : MyApp->Ajouter->Classe… , je l’apelle AppHub.cs et je la fait hérité de Hub et j’ajoute le using de l’espace Microsoft.AspNetCore.SignalR

2 : J’ajoute le service SignalR au conteneur de dépendance et une route vers le Hub.

3 J’injecte le Hub dans la classe de mon service AppRunning en utilisant l'interface IHubContext et J’ajoute un appel asynchrone pour pousser la valeur de _etat vers tous les clients du Hub. pour rendre la méthode asynhrone , je la défini avec 'async' .
signalr_srv.png
signalr_srv.png (80.64 Kio) Vu 614 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 877
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 (C#,F#, Visual basic .Net)

Message par Bud Spencer » jeu. 19 déc. 2019 11:11

Les clients SignalR peuvent être toute sorte d’applications. Ici je vais utiliser ma page razor Index comme client en utilisant la bibliothèque javascript @microsoft/signalr

1 : Ajout de la bibliothèque cliente au projet.

2 : Chargement de la bibliothèque dans le client, définition de la connexion et implémentation des méthode pour afficher l’état du service en temps réel sur la page.

3 : J’ai donc maintenant le nbr de secondes avant Noel qui a été initialisé par le serveur à l’appel de la page, qui décrémente par un timer écrit dans le client et le heart de mon service (True/False) qui est poussé toutes les secondes dans le client par le service AppRunning du serveur.
signalr_clt.png
signalr_clt.png (49.53 Kio) Vu 611 fois

Comme je l’avais fait en présentant Socket.IO et NodeJs dans le tuto des applications web dynamique, on peut ici aussi facilement imaginer tout un tas d’applications pour visualiser et piloter en temps réel tout ce qui se trouve sur les GPIO du PI depuis un navigateur local ou distant ou depuis un client lourd pc (win/mac/linux) et même une appli smartphone Android ou IoS (notamment avec Xamarin) .
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « Autres langages »