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_read et caractère NULL


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut socket_read et caractère NULL
    Bonjour,

    Je suis en train de concevoir un application web, afin de communiquer avec un automate, sous forme TCP/IP. J'ai déjà fait une application en C++ qui communique avec un automate, donc je crois quand même bien connaitre le principe des sockets, mais je n'ai pratiquement jamais fait de programmation web.

    La petite application est fort simple, j'envoie une commande de type Modbus, pour activer/désactiver des relais. Pour l'envoie de la commande, tout fonctionne très bien. Par la suite, j'essaie d'aller lire l'état de mes relais. Et la rien ne se passe, je ne suis pas capable de lire ce que l'automate me retourne. La valeur de retour est 0x00, 0x00, 0x00, 0x00, 0x06 etc ..... Je soupçonnes que ce soit à cause des caractères NULL (0x00) que je reçoit au début de la commande.

    Voici tout de même à quoi ressemble mon code pour la communication avec les sockets pour ma lecture.

    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
    33
     
    Public function ReceiveCommand($Relais)
    {
    	$Result='';
    	/* Cree une socket TCP/IP. */
     
    	$Result= "Essai de connexion à 128.1.1.100 sur le port 5020 ...";
     
    	$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die ('Création de socket refusée');	
    	socket_connect($socket, "128.1.1.100", 5020) or die ('Connexion impossible');
     
    	$idtransaction =chr(0x00);
    	$idtransaction2 = chr(0x00);
    	$idprotocole = chr(0x00);
    	$idprotocole2 = chr(0x00);
    	$esclave = chr(0x00);
    	$longueur = chr(0x06);
    	$longueur2 = chr(0x01);
    	$fonction = chr(0x01);
    	$adressemot = chr(0x00);
    	$comptemot = chr($Relais);
    	$compteoctet = chr(0x00);
    	$valeur = chr(0x01);
     
    	$req = $idtransaction.$idtransaction2.$idprotocole.$idprotocole2.$esclave.$longueur.$longueur2.$fonction.$adressemot.$comptemot.$compteoctet.$valeur; 
     
    	$write_len=strlen($req);
    	socket_write($socket,$req,$write_len);	
     
    	$str= socket_read($socket, 1024);
     
    	return $str;
    }
    Merci de votre aide

  2. #2
    FoxLeRenard
    Invité(e)
    Par défaut
    Bonjour,
    tu auras peut'étre du mal a trouver réponse ici, moi je connais trés peut la robotisation .

    Simplement je me souviens que l'analyse du trafic avec un genre Ethereal,
    prouvait qu'il se trimballait dans les dialogues PC/Machine des checksum
    Le C devrait s'en débrouiller mais le PHP ???

    Désolé de ne pas t'aider d'avantage

    Autre point, tu es bien OK que ton PHP dialogue entre PC/Machine, pas question de croiser une notion de visiteur externe comme sur un web , je me trompes ?

  3. #3
    FoxLeRenard
    Invité(e)
    Par défaut
    Je te mets a part un truc qui m'étonnes
    dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    socket_write($socket,$req,$write_len);
    tu ne test pas avec "===" le false du retour, tu saurais au moins si
    le socket_write "passe"


    Et bien sur je me disais que si tu faisait ça sur ton micro ????
    tu n'oublies pas que tes drivers et librairies du protocol Modbus
    sont pas les mêmes en C et en PHP

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 373
    Billets dans le blog
    17
    Par défaut
    Il ne devrait pas y avoir de pb pour les caractères 0x00.
    Comment traites-tu le retour de l'appel à ReceiveCommand( ) ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Bonjour,

    Ce que je fais, pour le moment, tout ce que je vérifie c'est la string qui m'est retourné, à l'aide du browser de PHP. Car je connais la string qui doit m'être retournée de l'automate.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 373
    Billets dans le blog
    17
    Par défaut
    tout ce que je vérifie c'est la string qui m'est retourné
    Comment t'y prends-tu ?

    à l'aide du browser de PHP
    Qu'est-ce que c'est ? Le navigateur web ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Avec cet outil

    flashservices/browser

    de amfphp

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 373
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 373
    Billets dans le blog
    17
    Par défaut
    Je ne connaîs pas flashservices/browser, à savoir que tu t'exposes aux bugs éventuels de cet outil.

    Que donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $result = $o->ReceiveCommand($Relais) ;
    $n = strlen($result) ;
    for ( $i = 0 ; $i < $n ; $i++ ) {
        echo ord($result[$i]), ' ' ;
    }
    ??

    Fais en sorte d'exécuter cela sans passer par un quelconque intermédiaire.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Comme je le disait plus haut, je suis un débutant en PHP.

    1 - Où dois-je mettre ce code ?
    2 - Que signifie la variable $o qui appelle la fonction ?

  10. #10
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 373
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 373
    Billets dans le blog
    17
    Par défaut
    1 - Où dois-je mettre ce code ?
    Où tu veux, il faut juste l'exécuter.

    2 - Que signifie la variable $o qui appelle la fonction ?
    Public function ReceiveCommand($Relais)
    Le Public laisse penser que ReceiveCommand est un méthode d'objet.
    $o est une instance de la classe dans laquelle ReceiveCommand est définie.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Ce que j'ai fait, j'ai créer une nouvelle fonction avec le code que tu m'as donné. Mais maintenant, je ne sais plus quoi faire, j'ai toujours exécuté mon code à partir de Flash, par des boutons, c'est par ce moyen que je réussis à activer mes relais. Je sais donc pas du tout comme faire pour exécuter la fonction directement sans passer par un intermédiaire.

  12. #12
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 373
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 373
    Billets dans le blog
    17
    Par défaut
    Mais maintenant, je ne sais plus quoi faire, j'ai toujours exécuté mon code à partir de Flash, par des boutons, c'est par ce moyen que je réussis à activer mes relais. Je sais donc pas du tout comme faire pour exécuter la fonction directement sans passer par un intermédiaire.
    Où se trouve l'interpréteur PHP ? Tu peux faire /path/to/php.exe /path/to/test.php ( http://fr.php.net/cli ).
    Sinon si PHP est installé en tant que module Apache (ou autre serveur HTTP) alors tu peux créer une page qui affichera directement les valeurs.

    Voici le script test.php à exécuter :

    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
    33
    34
    35
    36
    37
    38
    39
    <?php
    function ReceiveCommand( )
    {
    	$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
    		or die ('Création de socket refusée');	
     
    	socket_connect($socket, "128.1.1.100", 5020) 
    		or die ('Connexion impossible');
     
    	$idtransaction =chr(0x00);
    	$idtransaction2 = chr(0x00);
    	$idprotocole = chr(0x00);
    	$idprotocole2 = chr(0x00);
    	$esclave = chr(0x00);
    	$longueur = chr(0x06);
    	$longueur2 = chr(0x01);
    	$fonction = chr(0x01);
    	$adressemot = chr(0x00);
    	$comptemot = chr($Relais);
    	$compteoctet = chr(0x00);
    	$valeur = chr(0x01);
     
    	$req = $idtransaction.$idtransaction2.$idprotocole.$idprotocole2
    		.$esclave.$longueur.$longueur2.$fonction.$adressemot
    		.$comptemot.$compteoctet.$valeur; 
     
    	$write_len=strlen($req);
    	socket_write($socket,$req,$write_len);	
     
    	$str= socket_read($socket, 1024);
     
    	return $str;
    }	
     
    $result = ReceiveCommand( ) ;
    $n = strlen($result) ;
    for ( $i = 0 ; $i < $n ; $i++ ) {
        echo ord($result[$i]), ' ' ;
    }
    Ainsi tu pourras contrôler les octets retournés par le socket_read( ).

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Super !!!!

    Je te remerci beaucoup pour ton aide et ta patience

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de caractère NULL
    Par Tschul dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/03/2007, 14h18
  2. Réponses: 3
    Dernier message: 19/02/2007, 15h07
  3. Suppresion d'un caractère NULL en début de chaine
    Par GingGing dans le forum Delphi
    Réponses: 5
    Dernier message: 10/08/2006, 09h06
  4. Identification d'une chaine de caractère null
    Par jacques70 dans le forum Langage
    Réponses: 9
    Dernier message: 11/05/2006, 17h14
  5. Réponses: 3
    Dernier message: 14/03/2006, 14h43

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