Symfony et Yoctopuce

Symfony et Yoctopuce

Récemment, nous avons dû utiliser notre librairie PHP avec le framework Symfony. Nous y somme parvenu sans trop de problèmes, mais nous avons perdu un peu de temps avec quelques spécifiés de Symfony. Du coup, on s'est dit que ça pourrait vous intéresser.





Symfony est un framework PHP populaire qui permet de gagner du temps lors du développement d'un site web. En plus du framework MVC, Symfony permet d'automatiser une grande partie des tâches fastidieuses lors du développement grâce l’utilitaire en ligne de commande symfony. Cet utilitaire permet, par exemple, de télécommander l'ajout de packages, la migration de la base de données, ainsi que le déploiement du site. Cet utilitaire intègre même un serveur web qui peut être utilisé lors du développement.

Toutefois, pour vraiment profiter des avantages de ce framework, il convient de suivre les conventions de Symfony. En effet, Symfony n'est pas une simple librairie qui peut être ajoutée à un projet PHP existant, Symfony EST le projet PHP. Ce framework est prévu pour être le framework principal et le point d'entrée du site web.

Bref, Symfony est un outil pratique, mais comme tout framework il est nécessaire d’investir un certain nombre d'heures à apprendre son fonctionnement avant de pouvoir gagner du temps.

Un exemple


Nous allons voir comment créer une page qui utilise le mode callback HTTP des YoctoHubs. Ce mode permet de contrôler des modules Yoctopuce installés derrière un filtre NAT. Pour plus d'information sur le mode callback HTTP, vous pouvez consulter notre article sur le sujet ainsi que la documentation.

Nous partons du principe que vous avec un minimum de connaissances du framework Symfony. Si vous découvrez Symfony avec cet article, nous vous conseillons de commencer par lire les premiers chapitres de la documentation Symfony.

Créer le projet


La première étape est donc d'installer l'utilitaire Symfony CLI et de créer le projet de base. L'utilitaire Symfony CLI est disponible sur toutes les plateformes et est disponible sur le site de Symfony.

Pour créer un projet web, il faut utiliser la commande symfony new --full.

symfony new --full my_project_name


Cette commande crée l'arborescence de base, un repository git, et installe le framework Symfony.

Grâce au serveur web intégré, on peut tout de suite tester le projet. Il faut utiliser la commande suivante pour démarrer le serveur et ouvrir un browser à l'adresse affichée.

symfony server:start --allow-http -d




Ajouter le callback HTTP


Entrons dans le vif du sujet et regardons comment ajouter un Callback HTTP Yoctopuce à ce projet.

La première chose à faire est d'installer notre librairie PHP à l'aide de composer. Cette étape est très facile et peut être réalisée directement avec l'utilitaire Symfony CLI:

symfony composer require yoctopuce/yoctolib_php



En interne, Symfony utilise composer pour télécharger et installer notre librairie de programmation PHP.

Une fois cette étape réalisée, notre librairie est ajoutée à la liste des dépendances et est disponible partout dans le projet.

Il faut ensuite créer un controller dans lequel on écrira le code PHP qui utilise notre librairie. Un controller Symfony est simplement une classe PHP qui est responsable de traiter une requête HTTP.

Il est possible de créer ce fichier à la main, mais il est plus simple d'utiliser l'utilitaire Symfony pour créer ce contrôleur.

symfony console make:controller YoctopuceCallbackController



Cette commande crée un fichier YoctopuceCallbackController.php qui contient la logique du contrôleur, ainsi qu'un fichier index.html.twig qui est le template twig qui est utilisé par le code PHP.

Voilà le code du fichier YoctopuceCallbackController.php

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class YoctopuceCallbackController extends AbstractController
{
    /**
     * @Route("/yoctopuce/callback", name="yoctopuce_callback")
     */

    public function index(): Response
    {
        return $this->render('yoctopuce_callback/index.html.twig', [
            'controller_name' => 'YoctopuceCallbackController',
        ]);
    }
}



L’annotation @Route() de la méthode index enregistre l'URL qui est gérée par cette méthode. En d'autres mots, si on accède à l'URL "/yoctopuce/callback" du site, c'est la fonction index qui est exécutée.

Il faut maintenant "transformer" ce controller en callback HTTP Yoctopuce. La première chose à faire est d'utiliser la méthode YAPI::TestHub qui permet de déterminer si la requête est effectuée par un YoctoHub ou un browser Web. Si cette fonction retourne YAPI::SUCESS, il s’agit d'un callback HTTP effectué par un YoctoHub ou un VirtualHub. Dans ce cas, il est possible utiliser l'API Yoctopuce pour interagir avec les modules Yoctopuce connectés au YoctoHub.

S'il s'agit d'un callback HTTP d'un YoctoHub, on enregistre le YoctoHub à l'aide de la méthode YAPI::RegisterHub. On peut ensuite parcourir la liste des modules connectés à l'aide des méthodes YModule::FirstModule() et nextModule(). Pour chaque module, on inverse l’état de la LED balise à l'aide des méthodes get_beacon() et set_beacon(). Pour terminer, on retourne un objet Response avec une chaîne vide.

Si YAPI::TestHub retourne une erreur, il s'agit d'une requête faite par un browser web, et on garde le code par défaut qui affiche le template yoctopuce_callback/index.html.twig.

Voici le code complet de notre callback HTTP:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use YAPI;
use YModule;

class YoctopuceCallbackController extends AbstractController
{
    /**
     * @Route("/yoctopuce/callback", name="yoctopuce_callback")
     */

    public function index(): Response
    {
        $error = "";
        if(YAPI::TestHub("callback", 10, $error) == YAPI::SUCCESS) {
            YAPI::RegisterHub("callback");
            $module = YModule::FirstModule();
            while (!is_null($module)) {
                if ($module->get_beacon() == YModule::BEACON_ON) {
                    $module->set_beacon(YModule::BEACON_OFF);
                } else {
                    $module->set_beacon(YModule::BEACON_ON);
                }
                $module = $module->nextModule();
            }
            return new Response("");
       }
        return $this->render('yoctopuce_callback/index.html.twig', [
            'controller_name' => 'YoctopuceCallbackController',
        ]);
    }
}



Pour les gens qui on l'habitude de notre librairie PHP, notez qu'il n'est pas nécessaire d'inclure manuellement le fichier yocto_api.php. Il faut simplement importer les classes YAPI et YModule dans l'espace de nom.


Configurer le YoctoHub


Il ne reste plus qu'à configurer le YoctoHub, ou le VirtualHub, pour se connecter au callback HTTP avec l'URL de notre serveur. Dans notre cas l'adresse IP de la machine est 192.168.1.30. L'URL de notre callback est donc 192.168.1.30:8000/yoctopuce/callback.

Les paramètres à utiliser pour notre callback HTTP
Les paramètres à utiliser pour notre callback HTTP



En cliquant sur le bouton test, le YoctoHub se connecte au callback et les LEDs bleus de tous les modules devraient passer de statique à clignotant, ou l'inverse.

Éviter la redirection HTTPS


Vous avez peut-être remarqué l'utilisation de l'option --allow-http lors du démarrage du serveur web intégré.

Les YoctoHubs actuels ne supportent pas les connexions HTTPS. Nous avons du reste un article sur ce sujet. En conséquence, le serveur web doit supporter le trafic HTTP.

Par défaut le serveur web intégré de Symfony force une redirection de tout le trafic HTTP sur HTTPS. Donc, si on n'utilise pas l'option --allow-http, les YoctoHub n'arrivent pas à se connecter au callback, et lors du test le message suivant est affiché:

Il ne faut pas oublier l'option --allow-http lors du démarrage du serveur web
Il ne faut pas oublier l'option --allow-http lors du démarrage du serveur web



Conclusion


Symfony est un framework intéressant, mais assez complexe de premier abord. Mais, sachez que si vous devez utiliser les modules Yoctopuce dans un projet Symfony c'est possible.

Comme d'habitude, vous pouvez retrouver les sources de cet exemple sur GitHub:
https://github.com/yoctopuce-examples/symfony_test.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.