Partage
  • Partager sur Facebook
  • Partager sur Twitter

MQTT Mosquitto et MySQL

    21 septembre 2021 à 11:29:45

    Bonjour,

    Je possède une VM Windows avec WAMP et le framework CodeIgniter. J'ai également un broker MQTT Mosquitto.

    J'aimerai savoir comment il est possible de déclencher un script PHP lorsqu'un message arrive sur le broker pour l'insérer ensuite sur une base MySQL. Tout c que je trouve sur internet n'est pas clair sur le sujet.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      21 septembre 2021 à 14:52:44

      il faut s'inscrire (subscribe) à ce que l'on veut recevoir et quand on reçoit quelque chose sur cette inscription, écrire la fonction qui va traiter et insérer les données en base; c'est facilité par cette extension https://github.com/php-mqtt/client#subscribe 
      • Partager sur Facebook
      • Partager sur Twitter
        22 septembre 2021 à 6:41:48

        Bonjour,

        Pour recevoir un message du broker, il faut souscrire (subscribe) au sujet (topic) qui intéresse puis être à l'écoute de l'arrivée d'un message sur le topic.

        Pour cela, il faut donc un client (au sens logiciel) qui écoute en permanence le topic.

        Pour ma part en php, j'écoute avec le client existant en php : https://pecl.php.net/package/Mosquitto

        Même s'il semble ancien, il fonctionne depuis des années dans mon système qui est développé avec Symfony 4.4 et en version php 7.4

        Il faut bien-sûr l'enrober en fonction de ses besoins et en l'occurrence dans ton cas, récupérer le message (payload) puis l'enregistrer en base.

        Il y a d'autres clients disponibles dans d'autres techno mais dans ce cas il faut faire la passerelle entre php et l'autre techno.

        A+

        • Partager sur Facebook
        • Partager sur Twitter
          23 septembre 2021 à 12:51:12

          Merci pour vos réponses.

          umfred a écrit:

          il faut s'inscrire (subscribe) à ce que l'on veut recevoir et quand on reçoit quelque chose sur cette inscription, écrire la fonction qui va traiter et insérer les données en base; c'est facilité par cette extension https://github.com/php-mqtt/client#subscribe 

          J'ai déjà téléchargé la librairie php-mqtt dans codeigniter.

          Maintenant comment faire pour que PHP écoute en permanence le broker ?

          La solution de monkey3d n'est plus mis à jour. N'y a -t-il pas d'autres librairies plus récentes ?



          • Partager sur Facebook
          • Partager sur Twitter
            23 septembre 2021 à 15:20:36

            Tout me semble indiqué dans la doc + les exemples sur la page du projet github (RTFM) 

            Dans le subscribe, tu fournis une fonction (en 2nd paramètre) qui se lancera à la réception d'un message de cette souscription (1er paramètre de la fonction)

            Il y a peut-être une requête à publier avant pour pouvoir recevoir une réponse à la souscription.

            • Partager sur Facebook
            • Partager sur Twitter
              23 septembre 2021 à 15:36:09

              Ok je vais regarder ça.

              Merci

              • Partager sur Facebook
              • Partager sur Twitter
                24 septembre 2021 à 7:33:46

                J'ai précisé que même si le package est ancien, il est adapté à php 7 et fonctionne chez moi avec Symfony en version 4 et 5.

                Pour écouter en permanence c'est toujours une boucle infinie ...

                C'est le cas dans l'autre solution proposée.

                $mqtt->loop(true);

                A+

                • Partager sur Facebook
                • Partager sur Twitter
                  8 octobre 2021 à 11:24:47

                  Ca veut dire qu'il faut qu'un script s'exécute en permanence ?

                  Il faut donc que j'enlève la limitation de temps d'execution PHP (max_execution_time) ou alors mettre une execution windows fréquente.

                  Une boucle infinie dans un script qui s'execute à l'infini ca me parait pas très propre comme solution.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 octobre 2021 à 11:33:43

                    Non, il ne faut pas modifier le paramètre de temps car en fait le process est juste en attente (ce n'est pas vraiment une boucle au sens que tu l'entends) donc il ne consomme pas de ressources tant que rien ne se présente dans la file.

                    C'est ainsi qu'il faut faire : cela fonctionne en continu chez moi depuis des années.

                    A+

                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 octobre 2021 à 12:43:00

                      Mon script fonctionne et récupère les messages qui arrivent dans le broker et les inscris dans un fichier txt.

                      Par contre quand le script cesse de s'exécuter, il ne lit plus le broker. Je dois louper un truc.

                      Pour info j'exécute mon script depuis le navigateur web.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 octobre 2021 à 12:48:26

                        comment il pourrait lire quelque chose si il n'est pas exécuté ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 octobre 2021 à 13:59:41

                          Le script est en php alors je ne vois pas comment il peut être exécuté depuis le navigateur web qui ne sait pas exécuter du php ...

                          Ce script doit être mis en tâche de fond sur le serveur. Le mieux étant de le démarrer automatiquement au boot du serveur.

                          Je n'ai pas dis que le script n'était pas exécuté : j'ai dis qu'il était en attente ... 

                          C'est ainsi pour plein de process sur un système informatique : en attente en attendant qu'on le réveille.

                          Bref c'est ainsi que cela fonctionne comme indiqué dans les posts et cela fonctionne ainsi chez moi depuis des années.

                          Le script d'écoute ne cesse de s'exécuter que s'il rencontre un problème : par exemple le process mosquitto tombe. Il est à noter que l'on peut manager des alertes quand cela arrive.

                          A+

                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 octobre 2021 à 14:26:04

                            monkey3d a écrit:

                            Le script est en php alors je ne vois pas comment il peut être exécuté depuis le navigateur web qui ne sait pas exécuter du php ...

                            Ce script doit être mis en tâche de fond sur le serveur. Le mieux étant de le démarrer automatiquement au boot du serveur.

                            Je n'ai pas dis que le script n'était pas exécuté : j'ai dis qu'il était en attente ... 

                            C'est ainsi pour plein de process sur un système informatique : en attente en attendant qu'on le réveille.

                            Bref c'est ainsi que cela fonctionne comme indiqué dans les posts et cela fonctionne ainsi chez moi depuis des années.

                            Le script d'écoute ne cesse de s'exécuter que s'il rencontre un problème : par exemple le process mosquitto tombe. Il est à noter que l'on peut manager des alertes quand cela arrive.

                            A+

                            Comment on met un script php en attente du coup ? C'est l'arrivée d'un msg dans le broker qui devrait l'enclencher dans l'idéal.



                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 octobre 2021 à 14:33:18

                              on l'a dit, la boucle de lecture ($mqtt->loop(true);) met le script en attente de message
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 octobre 2021 à 16:04:26

                                Relis la doc tout est indiqué :

                                $mqtt->loop(true);

                                Permet d'avoir une process qui fonctionne en continu tant que la connexion avec le broker (serveur) n'est pas coupée.

                                C'est la fonction de callback qui est réveillée par l'arrivée d'un message sur le topic souscrit par le client.

                                $mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
                                    echo sprintf("Received message on topic [%s]: %s\n", $topic, $message);
                                }, 0);


                                Faut bien comprendre que tu es dans de la programmation événementielle et non procédurale classique.

                                A+

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 octobre 2021 à 16:04:45

                                  umfred a écrit:

                                  on l'a dit, la boucle de lecture ($mqtt->loop(true);) met le script en attente de message


                                  C'est ce que j'ai fait. Peut-être que ça ne marche pas avec le framework Codeigniter.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 octobre 2021 à 16:07:59

                                    Mais qu'est-ce qui ne marche pas ???? cela ne veut rien dire.

                                    De plus c'est du php et le framework n'a rien à voir. Moi je suis avec Symfony et cela fonctionne car ... c'est du php.

                                    As tu lu mon dernier post ?

                                    A+

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      12 octobre 2021 à 15:28:33

                                      waikiki88 a écrit:

                                      Par contre quand le script cesse de s'exécuter, il ne lit plus le broker. Je dois louper un truc.


                                      C'est quand même bizarre cette phrase... Le script marche, il lit bien le broker, mais quand il cesse de s'exécuter il ne le lit plus ? :lol:
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      MQTT Mosquitto et MySQL

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      • Editeur
                                      • Markdown