Forum Linux.général Créer un démon : surveiller la présence d'un périphérique USB

Posté par . Licence CC by-sa
Tags : aucun
1
16
avr.
2015

Bonjour à tous,

Je souhaite vérifier la présence d'un matériel USB afin de lancer une procédure d'acquisition de donnée du matériel en question.

Comme en Unix tout est fichier, il doit y avoir un moyen d'analyser un fichier qui gère les périphériques USB et de savoir si un certain type de matériel USB c'est connecté à l'ordinateur!

J'aimerais faire une acquisition unique des paramètres puis laisser tourner le démon si un autre périphérique se connecte ou se déconnecte.

Je ne sais pas si c'est compliqué de gérer cela. En tout cas j'ai le .rules qui permet aux différents matériels de se connecter à mon OS Linux.

Merci

  • # USB, peripherique => udev

    Posté par . Évalué à 5.

    sur les systemes unix, tu peux detecter le branchement d'un peripherique USB et lancer des actions en utilisant udev et les udev.rules.

    on trouve plein d'info ici par exemple
    http://doc.ubuntu-fr.org/udev

    meme si c'est pour ubuntu, ca va marcher pour d'autres Linux

  • # USB Dumper

    Posté par (page perso) . Évalué à 3. Dernière modification le 16/04/15 à 09:08.

    USB Dumper détecte la connexion sur un port USB et copie l’intégralité des données qui s’y trouvent. Il y a un paquet Debian, ainsi que les sources en Python qui sont fournies. ttps ://codingteam.net/project/usb-dumper
    Tu peux peut-être adapter ça à ton besoin.

  • # Solution

    Posté par . Évalué à 2.

    Après une lecture du site d'ubuntu à propos de Udev et de la syntaxe des fichiers .rules, je pense qu'il suffi de surveiller avec un démon si un fichier se créé au chemin /dev/truc et après lancer les commandes à partir d'un fichier.

    Je ne sais pas si surveiller en permanence si un fichier existe peut poser problème, ou s'il se créé !

    • [^] # Re: Solution

      Posté par . Évalué à 2.

      Pour l'USB dumping, je ne connais pas le langage python mais peut être que je vais m'y mettre.

      Je viens de le décompresser !

      Des astuces pour compiler tout ça ? comment on se sert des fichiers pythons

    • [^] # Re: Solution

      Posté par (page perso) . Évalué à 2.

      Justement, udev est un daemon qui permet de faire ça. Par exemple, quelqu'un ici a cherché à exécuter certaines commandes quand il branche un appareil photo : https://linuxfr.org/forums/linux-general/posts/rule-elegante-pour-udev

      Il ne faut pas copier sa règle directement, c'est juste pour te montrer ce que tu peux faire.

      • [^] # Re: Solution

        Posté par . Évalué à 2. Dernière modification le 18/04/15 à 21:14.

        Je comprends ce qu'il veut faire sauf pour monusb.sh et la ligne de code suivante :

        /bin/stty -F /dev/$1 57600

        fichier /etc/udev/rules.d/70-monusb.rules :

            UBSYSTEMS=="usb", KERNEL=="ttyUSB?",
            ATTRS{interface}=="??",MODE="0666", SYMLINK+="monusb", RUN+="/bin/monusb.sh %k"**

        fichier /bin/monusb.sh :

            #!/bin/bash
        
            sleep 1
        
            /bin/stty -F /dev/$1 57600
            /bin/stty -F /dev/$1 -icanon
            /bin/stty -F /dev/$1 min 1

        L'inconvéniant est que sous QtCreator, je sais lancer un processus en parallèle (ou fils) et lire la sortie standard du processus fils avec l'entrée standard du processus père.

        Maintenant, je veux bien lancer un script depuis le .rules avec la commande RUN+="…"
        Le souci c'est que je ne sais pas comment créer un tube entre le processus lancé depuis le .rules et le processus père (interface.cpp)

        Désolé pour l'affichage … c'est du copie colle!

        • [^] # Re: Solution

          Posté par . Évalué à 2.

          Solution, connaitre le PID sous le processus lancé de l'interface.cpp !

          Peut être que j'arriverai à faire quelque chose et encore c'est pas trop sur

          • [^] # Re: Solution

            Posté par (page perso) . Évalué à 3.

            Ah, je n'avais pas compris que tu voulais le faire directement dans un programme en C++.

            En fait, je n'ai utilisé udev jusqu'à maintenant que pour exécuter 2-3 petits programmes en bash qui complètent une configuration lors d'insertion d'appareil usb (par exemple, je peux désactiver mon clavier quand je branche ma tablette tactile).

            Pour Qt, il y a ce post qui peut être intéressant: http://stackoverflow.com/questions/8190542/how-do-i-detect-usb-drive-insertion-in-linux , ça me semble en effet plus logique de passer par la lib d'udev pour monitorer tes ports usb depuis Qt.

            • [^] # Re: Solution

              Posté par . Évalué à 2.

              Un grand merci, je vous ferais un retour dès que ça fonctionne!

              Bonne fin de semaine à vous tous

            • [^] # Re: Solution

              Posté par . Évalué à 3.

              je suis d'accord avec Adrien,

              ce qu'il te faut, c'est utiliser une bibliotheque QT, qui va surveiller le port USB pour toi, et t'envoyer une info quand il y aura un evenement sur ce port USB.

              du coup, tu vas aussi te rendre compte que tu peux lire/ecrire sur le port USB directement depuis QT,
              donc t'affranchir de la communication entre le processus pere/fils puisque tout sera alors géré par QT.

              • [^] # Re: Solution

                Posté par . Évalué à 1.

                Ha ben j'ai pas penser directement passer par une lib Qt pour discuter depuis tous les OS en USB mais effectivement …

                Je vais me diriger vers cette option multiplatforme.

                • [^] # Re: Solution

                  Posté par . Évalué à 1.

                  Problème : la lib qui récupère les infos de mon matériel n'est pas compilable en C++

                  Solution :
                  -soit faire un programme pour la gestion de l'USB sous Linux
                  -soit utiliser une bibliothèque QtCreator pour l'USB, peut être QSerialPort pour gérer l'USB pour toute les platforme et appeler ensuite le programme qui va interroger le matériel.

                  La deuxième solution serait l'idéal.

                • [^] # Re: Solution

                  Posté par . Évalué à 1.

                  Avec ce lien, je ne pense pas qu'il existe de bibliothèque Qt permettant la discussion par USB sur toutes les platformes.

                  Texte du lien

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.