LINX 3.0 – Création d’un Service Web avec LabVIEW

Cet article fait partie d’une série consacrée à LINX 3.0.

Comme je vous l’ai expliqué dans l’article précédent, il est possible de déployer une application LabVIEW dans le Raspberry Pi. Il fonctionne alors en mode autonome, sans interface utilisateur. Je vais aujourd’hui vous présenter l’une des solution qui permet de communiquer avec son programme en utilisant un simple navigateur internet: le service Web.

Principe de fonctionnement

L’exécution d’une application LabVIEW sur une cible embarquée repose sur le moteur d’exécution (Run-Time Engine). Ce moteur fournit l’environnement d’exécution de l’application. Il fournit également un serveur de débogage distant, des modules d’accès aux ressources systèmes (réseau, fichiers, interpréteur de commande, …), le Vi Server et bien d’autres choses.

Il se trouve qu’il y a également a disposition des développeurs un serveur web. Il s’agit d’un environnement d’exécution particulier qui permet d’interroger un VI via une requête HTTP.

Comme illustré sur l’image d’introduction, ce serveur Web est dissocié de l’application principale. Cependant, il est possible de communiquer avec elle en utilisant le Vi Server ou d’autres mécanismes. Dans l’exemple qui va suivre, j’utiliserai des variables globales pour échanger de simples valeurs courantes.

Créer un Service Web

Pour créer un service Web sur une cible LabVIEW (PC ou embarquée), il suffit de faire un clic droit sur cette dernière et de choisir Nouveau > Service Web.

Ajouter un service Web

Un nouvel objet apparait alors dans le projet. Il contient deux sous sections, Ressources Web et VI de Démarrage. Nous nous intéresserons exclusivement à la première.

Le nouveau service Web

Ce service Web va servir de point d’entrée pour les requêtes HTTP. On va maintenant ajouter de nouvelles ressources. Chaque ressource sera liée d’une part à une URL, d’autre part à un VI.

Pour ajouter une ressource, il suffit là encore de faire un clic droit sur l’objet Ressources Web, puis Nouveau VI. Chaque nouveau VI sera lié à une URL. Il est également possible d’ajouter une Ressource Web. Ces ressources permettent simplement de structurer le service Web (un peu comme des dossiers pour un serveur Apache). Il faudra alors spécifier le nom de la ressource Web dans l’URL.

Ajouter un nouveau VI au service Web

Pour chaque VI, il est possible de définir le type de requête HTTP associé: GET, POST, PUT ou DELETE. Cela permet par exemple de développer des API REST.

Le type de requête HTTP associée à un VI est configurable

De manière générale, le VI sera accessible par l’URL suivante:

http://xxx.xxx.xxx.xxx:8001/RessourcesWeb/NomDuVi

Formater une réponse HTTP

Les VI ajoutés dans un Service Web sont exécutés dès qu’une requête HTTP est reçue sur l’URL associée. Voyons maintenant le type de code que peut contenir une ressource Web, et surtout comment formater la réponse HTTP.

1 – Formatage automatique

Pour un simple échange de valeurs courantes, il est possible de déléguer à LabVIEW la création de la réponse. Pour cela, il suffit de câbler les données à envoyer sur le terminal du VI.

Formatage automatique des données

Le diagramme du VI est lui chargé d’élaborer les données à transférer. Dans mon cas, je remonte simplement trois mesures. Le VI lit donc simplement trois variables globales et les envoie dans des indicateurs.

Remontée de valeurs courantes

Le code source pourrait être bien plus complexe, par exemple en réalisant des calculs, ou en interprétant la requête HTTP. Gardez cependant une chose à l’esprit: ce VI est exécuté pour chaque requête. Plus il est long, plus la réponse sera longue à obtenir…

Mais comment LabVIEW envoie les données ?

Et bien, on peut choisir ! En faisant un clic droit sur le Service Web dans le projet puis en allant dans Propriétés on obtient tous les paramètres voulus dans la section HTTP Method VI Settings:

Propriétés du service Web

Les paramètres sont réglés VI par VI.

La première sous section correspond à la mise en forme de l’URL d’accès et au type de requête attendu.

La deuxième sous section permet de configurer la réponse HTTP.

Propriétés de la réponse HTTP

Par défaut, le VI est configuré pour une sortie sur Terminaux avec un format HTML. Pour faire un formatage automatique, il faut impérativement choisir une sortie sur Terminal.

LabVIEW va prendre tous les terminaux du VI et mettre leurs valeurs dans une table HTML. Voici la page affichée par un navigateur Web pour mon VI simpliste:

<html>
    <body>
        <h1>URL: /WebService/RawData/HTTPMethod_Html</h1>
        <h2>Output Terminals</h2>
        <table  border=1.0>
            <tr>
                <th>Terminal Name</th>
                <th>Terminal Value</th>
            </tr>
            <tr>
                <td>Temperature</td>
                <td>25.32916641235352</td>
            </tr>
            <tr>
                <td>Hygrometrie</td>
                <td>30.240014152</td>
            </tr>
            <tr>
                <td>Pression</td>
                <td>907.505615234375</td>
            </tr>
        </table>
    </body>
</html>

 

Les autres formats de sortie sont les suivants:

  • XML
<Response>
    <Terminal>
        <Name>Temperature</Name>
        <Value>25.375</Value>
    </Terminal>
    <Terminal>
        <Name>Hygrometrie</Name>
        <Value>30.10982604800001</Value>
    </Terminal>
    <Terminal>
        <Name>Pression</Name>
        <Value>907.39013671875</Value>
    </Terminal>
</Response>

 

  • JSON
{
    "Temperature":25.39583396911621,
    "Hygrometrie":30.247509352,
    "Pression":907.404296875
}

 

  • Texte brut
Temperature=25.46249961853027
Hygrometrie=30.04304245000001
Pression=907.55322265625

 

La seule précaution à prendre pour ce type de Service Web est de ne pas utiliser de caractères accentués dans les étiquettes des terminaux.

Bien que LabVIEW renvoie du HTML par défaut, il est cependant préférable de se cantonner au XML ou au JSON, bien que le XML généré par LabVIEW soit assez mal organisé (requête XPath complexes à cause du manque d’utilisation de tags).

2 – Formatage manuel

Avec ce mode de formatage, il est possible de fabriquer par programme la réponse HTTP. Pour passer en formatage manuel, il faut choir une sortie de type Stream dans la fenêtre de propriétés du Service Web. Le diagramme du VI est un peu plus complexe: on utilise la sous palette Web Service de la palette Connectivity pour fabriquer toute la réponse HTTP:

  • Code de la réponse
  • type MIME
  • Contenu
Création manuelle de la réponse HTTP

Il devient alors possible de générer du code HTML plus évolué, d’ajouter du style CSS, d’envoyer des images, … Pour l’exemple, je me suis contenté d’une feuille HTML de base:

<!DOCTYPE html>
<html>
    <body>
        <h1>Température</h1><p>25.5 °C</p>
        <h1>Pression</h1><p>907.6 hPa</p>
        <h1>Hygrométrie</h1><p>30.2 %HR</p>
    </body>
</html>

 

Ce mode de création de la réponse HTTP permet par exemple de générer un code XML mieux organisé que celui de base.

Déploiement

Pour déployer un service Web en source, il suffit de faire un clic droit sur ce dernier et de choisir Démarrer. Cependant, il semble y avoir un problème avec LINX: quelques fois, il y a une erreur au déploiement (LabVIEW ne trouve pas le serveur web et échoue à démarrer l’application). Du coup, je préfère tester mes services Web directement en compilant mon application. Pour cela, il convient de modifier les spécifications de construction de l’application:

Inclure un service Web dans une application est des plus simple, il suffit de le cocher !

Il faut alors choisir les services Web à inclure dans l’application, recompiler l’ensemble, déployer et redémarrer le Raspberry Pi.

Conclusion

Les services Web sont une solution relativement simple pour communiquer avec une application LabVIEW.

Ils peuvent être utilisés pour surveiller une application ou consulter des valeurs courantes.

Ils peuvent également servir pour communiquer avec un système distant, tel qu’une base de données, une application Android, un site Web, … Les applications sont nombreuses et puissantes. Je n’ai qu’effleuré l’aspect « Service » pour me concentrer sur l’implémentation sous LabVIEW.

Si le sujet vous intéresse, vous trouverez plus d’informations sur OpenClassRoom.

La seule contrainte liée au formatage automatique est d’éviter les caractères ASCII étendus.

Enfin, il faut garder à l’esprit que les VI des services Web sont exécutés de manière asynchrone, et par conséquent ont un impacte important et non prédictible sur les performances globales du système.

2 thoughts on “LINX 3.0 – Création d’un Service Web avec LabVIEW”

Laisser un commentaire