IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

socket avec script python


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut socket avec script python
    Bonjour à tous

    je suis entrain de coder une petite interface web pour diriger une voiture télécommandée (via wifi).

    J'ai un script pyhton coté "serveur" qui est écoute sur un port spécifique.
    Avec l'appli fournie en wifi je dirige bien la voiture.

    J'essaye de rajouter une couche web qui aura plus ou moins les mêmes fonctionnalités que l'appli (les fonctions de directions et retour video me suffisent)

    J'arrive à le faire en PHP avec l'utilisation des sockets.
    En d'autres j'envoie la commande, elle est reçue par le script python et il fait la commande....le hic c'est que c'est loin d'être du pas à pas. Quand j’envoie la commande, par exemple avancer, il avance pendant 1 à 2 secondes avant de s’arrêter. Pour tourner, il fait un demi-tour, impossible de faire un quart de tour par exemple.

    Je pense que c'est lié au fonctionnement de sockets PHP. A votre avis comment puis je améliorer les choses?

    merci

    voici un extrait du code que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    <table>
    <tr><td></td><td><a href="test.php?motor=avance"><img src="haut.png" width="100" height="100" alt="haut"></td><td></td></tr>
    <tr><td><a href="test.php?motor=gauche"><img src="gauche.png" width="100" height="100" alt="Gauche"></td><td></td><td><a href="test.php?motor=droite"><img src="droite.png" width="100" height="100" alt="droite"></td></tr>
    <tr><td></td><td><a href="test.php?motor=arriere"><img src="bas.png" width="100" height="100" alt="bas"></td><td></td></tr>
     
     
    <?php
    if($_GET['motor']!='')
        {
        //avance
        if($_GET['motor']=='avance')
            $message="\xff\x00\x01\x00\xff";
        //gauche
        if($_GET['motor']=='gauche')
            $message="\xff\x00\x03\x00\xff";
        //droite
        if($_GET['motor']=='droite')
            $message="\xff\x00\x04\x00\xff";
        //arriere
        if($_GET['motor']=='arriere')
            $message="\xff\x00\x02\x00\xff";
        echo strlen($message);
     
        //Send the message to the server
        if( ! socket_send ( $sock , $message , strlen($message) , 0))
        {
            $errorcode = socket_last_error();
            $errormsg = socket_strerror($errorcode);
     
            die("Could not send data: [$errorcode] $errormsg \n");
        }

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Je pense que c'est lié au fonctionnement de sockets PHP. A votre avis comment puis je améliorer les choses?
    PHP envoie ce que tu lui demandes d'envoyer, ni plus, ni moins.
    Après il y a peut-être un mécanisme de buffer/tampon qui vient fausser les choses.

    Je vois que tu envoies tes commandes depuis un formulaire, ce qui rajoute une bonne couche de bugs potentiels.

    Pour commencer je ferais un page test.php la plus simple possible pour voir le comportement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    // ...
     
    //avance
    $message="\xff\x00\x01\x00\xff";
     
    my_send_command($message);
     
    //gauche
    $message="\xff\x00\x03\x00\xff";
     
    my_send_command($message);
    Est-ce que le véhicule se déplace comme attendu au vu des commandes ?
    Si oui => Alors il y a un problème lors de la comm. client => serveur
    Si non => J'essaierai en ligne de commande PHP CLI

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    bonjour

    merci de ton retour.

    Oui avec ou sans le formulaire c'est pareil.

    PHP fait très bien ce que je lui demande, et ce n'est pas le problème, mais c'est que la commande semble envoyée "trop longtemps".
    Tu parles d'un buffer oui c'est possible. Je pense aussi que je ne suis pas vraiment en "temps reel"

    Peut etre dois je me tourner vers les websocket?

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Sans le formulaire, OK, mais as-tu testé en ligne de commandes PHP CLI ? (faudrait éviter de passer par le serveur web de quelques manière que ce soit pour être sûr que rien ne parasite)

    Sinon je ne vois pas comment PHP peut envoyer "trop longtemps" une commande qui se résume aux 5 octets "\xff\x00\x01\x00\xff".

    Si ta voiture commence à bouger c'est qu'elle a reçu ==5 octets==

    Si elle continue c'est qu'elle en a reçu 5 autres autant de fois qu'elle continue d'avancer

    Ou alors elle attend une commande qui demande l'arrêt ou autre chose ?

    Comment ça se passe pour avancer et tourner en même temps ? Avancer plus ou moins vite ? Il faudrait plus que ces quelques états non ? Tu as une doc du protocole ?

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Comme le dit Séb , pour ce genre de chose tu as globalement 3 solutions :

    - Soit tu envois un ordre de direction et le périphérique exécute jusqu'à contre ordre (stop, ou autre ordre)
    - Soit tu envois un ordre de direction et le périphérique exécute puis s'arrête
    - Soit tu envois un ordre de direction avec une durée d'exécution et le périphérique exécute l'ordre sur la durée prévue ou jusqu'à contre ordre.

    Dans ta socket PHP il n'est pas possible d'envoyer "trop longtemps". Tu demandes d'écrire x octet et c'est tout. Ce que tu peux avoir en revanche c'est une latence sur l'envoi ou la réception du message qui créer une latence dans l'execution de l'ordre mais pas dans sa durée d'exécution.

    Est ce que le fait d'ouvrir/fermer la socket à chaque commande n'est pas un problème ? Car c'est ce qui se passe avec un script PHP que tu appel via des boutons , contrairement à une application qui vie dans la durée et qui garde la socket ouverte en permanence (en théorie).

    Puurquoi passer par un script python intermédiaire ? Il n'est pas possible de s'interface directement sur le périphérique à piloter avec PHP ?

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Est ce que le fait d'ouvrir/fermer la socket à chaque commande n'est pas un problème ?
    C'est vrai qu'il y a ça aussi.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/01/2010, 14h13
  2. Affichage image en html avec script python et mysql blob
    Par senacle dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 18/11/2009, 19h22
  3. comparaison de deux fichiers textes avec un script python
    Par zekruss dans le forum Général Python
    Réponses: 1
    Dernier message: 10/11/2009, 05h52
  4. edition d'un fichier .txt avec un script python
    Par ziedzekri dans le forum Général Python
    Réponses: 7
    Dernier message: 06/10/2009, 00h14
  5. Executer un CppUnittest avec un script python
    Par merlinerick dans le forum Bibliothèques tierces
    Réponses: 6
    Dernier message: 20/08/2009, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo