[..] Recevoir des packets d'un serveur TCP

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
eyoyo
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 13 févr. 2013 14:15
Status : Hors ligne

[..] Recevoir des packets d'un serveur TCP

#1

Message par eyoyo »

Bonjour

Je veux afficher dans une messagebox les packets (valeurs numériques d'un capteur de température) émis par un serveur TCP (Un adpatateur Série/LAN configuré en serveur TCP) .
J'arrive à faire ça en UDP ùais pas en TCP. Vous savez si c'est possible?

Voila la script UDP qui marche et que je voudrais faire en TCP:

Code : Tout sélectionner

;Script2

; Start The UDP Services
;==============================================
UDPStartup()

; Bind to a SOCKET
;==============================================
HotKeySet("{ESC}","xit")
$ThisPCIP = "192.168.203.10";running script2
$socket = UDPBind($ThisPCIP, 3030)
If @error <> 0 Then Exit

While 1
    $data = UDPRecv($socket, 50)
    If $data <> "" Then
    MsgBox(0, "UDP DATA", $data, 1)
        ;UDPSend($socket2,"Got number " & $data)
    EndIf
    sleep(100)
WEnd

Func OnAutoItExit()
    UDPCloseSocket($socket)
    UDPShutdown()
EndFunc

func xit()
    Exit
EndFunc

Merci.
Modifié en dernier par eyoyo le jeu. 14 févr. 2013 14:44, modifié 1 fois.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Reçevoir des packets d'un serveur TCP

#2

Message par ani »

N'étant pas expert dans le domaine, je changerais le terme UDP en TCP et UDPBind en TCPListen.
eyoyo
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 13 févr. 2013 14:15
Status : Hors ligne

Re: [..] Reçevoir des packets d'un serveur TCP

#3

Message par eyoyo »

J"ai essayé le code suivant sans résultat:

Code : Tout sélectionner

;Script2

; Start The TCP Services
;==============================================
TCPStartup()

; Bind to a SOCKET
;==============================================
HotKeySet("{ESC}","xit")
$ThisPCIP = "192.168.203.10";running script2
$socket = TCPlisten($ThisPCIP, 3030)
If @error <> 0 Then Exit

While 1
    $data = TCPRecv($socket, 50)
    If $data <> "" Then
    MsgBox(0, "TCP DATA", $data, 1)
        ;TCPSend($socket2,"Got number " & $data)
    EndIf
    sleep(100)
WEnd

Func OnAutoItExit()
    TCPCloseSocket($socket)
    TCPShutdown()
EndFunc

func xit()
    Exit
EndFunc
Si ce n'est afficher les paquets dans une box j'aimerais les écrire dans une fichier texte.
Modifié en dernier par eyoyo le jeu. 14 févr. 2013 14:46, modifié 2 fois.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Reçevoir des packets d'un serveur TCP

#4

Message par ani »

Pour écrire un fcihier texte FileWrite("c:\fichier.txt",$Data) ou FileWriteLine("c:\fichier.txt",$Data).
je visionne l'aide d'autoit sur le TCP, manque peut-être le TCPAccept.

edit:
Pour la fonction TCPListen, si il y a une erreur il retourne 0 ou -1, donc le @error <> 0 est faux.

Code : Tout sélectionner

TCPStartup()

OnAutoItExitRegister("Cleanup")

Local $MainSocket = TCPListen("192.168.203.10", 3030)
If $MainSocket = -1 Then Exit

While 1
    Local $socket = TCPAccept($MainSocket)
    Local $data = TCPRecv($socket, 50)
    If $data <> "" Then
        FilewriteLine("c:\data.txt",$data)
    EndIf
    Sleep(100)
WEnd

Func Cleanup()
    TCPCloseSocket($socket)
    TCPShutdown()
EndFunc
Suis mauvais avec ce sujet :§
peut pas tester.
eyoyo
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 13 févr. 2013 14:15
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#5

Message par eyoyo »

Le write en UDP fonctionne (Merci!) mais pas en TCP :(

Code : Tout sélectionner

UDPStartup()
Local $file = FileOpen("autoit.txt", 10)
If $file = -1 Then
   MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

; Bind to a SOCKET
;==============================================
HotKeySet("{ESC}","xit")
$ThisPCIP = "192.168.203.10";running script2
$socket = UDPBind($ThisPCIP, 3030)
If @error <> 0 Then Exit

While 1
    $data = UDPRecv($socket, 50)
    If $data <> "" Then
    ;MsgBox(0, "UDP DATA", $data, 1)
    FileWrite("autoit.txt",$Data)
    FileClose($file)
    
        ;UDPSend($socket2,"Got number " & $data)
    EndIf
    sleep(100)
WEnd

Func OnAutoItExit()
    UDPCloseSocket($socket)
    UDPShutdown()
EndFunc

func xit()
    Exit
 EndFunc
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#6

Message par matwachich »

Etes-vous bien sure que le bidule en réseau (capteur de température) envoi bien des données en TCP??? Il envoi en UDP, c'est sure. Mais TCP?
Et puis, si c'est bien un serveur, il faudrait se connecter à lui, et pas simplement attendre qu'il envoi les données.
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
eyoyo
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 13 févr. 2013 14:15
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#7

Message par eyoyo »

Bonjour le capteur de température envoie ses données sur la liaison RS232 d'un convertisseur série/LAN ATOP SE5002. Ce convertisseur est configuré en serveur TCP et envoie les données su capteur T à une adresse IP distante sur le port 4660. J'arrive à "recevoir" les paquets TCP avec l'application Hercule SETUP (et même à envoyer des commandes au capteur via un hyperterminal en activant le mode virtual com de mon convertisseur). J'aimerais donc pouvoir faire l'acquisition des paquets TCP reçu sur le PC distant.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#8

Message par matwachich »

Ce convertisseur est configuré en serveur TCP et envoie les données su capteur T à une adresse IP distante sur le port 4660
Si je fais abstraction de la partie barrée (car un serveur TCP pour envoyer des données à une IP distante, bah faut que cette IP se connecte d'abord au serveur!) je peut vous proposer ce code:
► Afficher le texte
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#9

Message par ani »

SI ce n'etait pas TCPListen evidement çà aurait était TCPConnect et le port 3030 en UDP deviend 4660 en TCP.
Le FileClose($fichier) met le en dehors de la boucle while. (sauf si j'ai encore tord)
eyoyo
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 13 févr. 2013 14:15
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#10

Message par eyoyo »

Ton script marche et m'affiche les données du capteur dans la console et j'arrive à les stocker dans un fichier.
Est-t'il possible de faire une message box ou seul le champ change sans ouvrir à chaque fois une nouvelle box ?

Merci.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#11

Message par matwachich »

Non (pour la MsgBox), mais il suffit de créer une GUI! (Je pourrais la faire, mais je vous laisse fouiner d'abord un peu!)
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
eyoyo
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 13 févr. 2013 14:15
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#12

Message par eyoyo »

Oui je fouine je fouine et je reviendrai vers vous si je coince.
J'ai pris l'exemple GUI du dé.
eyoyo
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 13 févr. 2013 14:15
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#13

Message par eyoyo »

Je cherchais à afficher et stocker dans des fichiers données émises en TCP par des capteurs.
Je suis parvenu à mes fins à l'aide de deux scripts du type suivant qui écrivent les données dans le même fichier:

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

_Main()

Func _Main()
    Local $output, $die, $msg, $results
    ;Global $Port = 80, $IP = @IPAddress1, $Socket
    
    GUICreate("SEABIRD SBE45", 370, 70, -1, -1)
    GUICtrlCreateLabel("   Température,         Conductivité,           Salinité,            Vélocité", 10, 10)
    $output = GUICtrlCreateLabel("", 10, 30, 340, 30, BitOR($BS_PUSHLIKE, $SS_CENTER))
    GUICtrlSetFont($output, 12, 800, "", "Comic Sans MS")

    GUISetState(); Afficher le GUI
    ; Run the GUI until the dialog is closed
    
   ;Identification("admin", "ab12cd34")
   ;Func Identification($Pseudo, $Motdepasse)
   TCPStartup()
   OnAutoItExitRegister("_Cleanup")

   $sIP = "192.168.203.34"
   $iPort = 4660

   Local $file = FileOpen("acquitcp.txt", 10)
   If $file = -1 Then
      MsgBox(0, "Error", "Unable to open file.")
      Exit
   EndIf
   
   ;If @error Then
   ;     MsgBox(0, "", "Impossible de se conneter au serveur, il se peut que le serveur soit deconnecter")
   ;     TCPShutdown()
   ;     Exit
   ; EndIf

   Global $hSocketClient = TCPConnect($sIP, $iPort)
   ;Func Sendlogin()
   ;$send = String($login & "\" & $pass)
  ; TCPSend($hSocketClient, "#IDENTIFY#" & _GetIP() & "|" & $Pseudo & "|" & $Motdepasse)
   If $hSocketClient = -1 Then
      MsgBox(0, "Erreur", "Unable to connect with SBE45 in TCP")
      Exit
   EndIf

   HotKeySet("{ESC}", "_Exit")

   ;EndFunc   ;==>Identification

   While 1
      $recv = TCPRecv($hSocketClient, 4096)
      $msg = GUIGetMsg()
      If $msg = $GUI_EVENT_CLOSE Then ExitLoop
      If $recv Then
        ConsoleWrite($recv & @CRLF)
        FileWrite("acquitcp.txt",$recv)
        GUICtrlSetData($output, $recv)
        FileClose($file)
      EndIf
   WEnd
EndFunc   ;==>_Main

   

;Func _Cleanup()
;    TCPShutdown()
;EndFunc

;Func _Exit()
 ;   Exit
 ;EndFunc
 
Voici à quoi ressemblent ces données:

22.2325, 0.00008, 0.0108, 1489.021
$GPGGA,134557.428,4821.6136,N,00433.6451,W,0,00,50.0,0.0,M,52.2,M,0.0,0000*51
$GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05
$GPGSV,3,1,09,15,77,292,33,09,61,057,00,26,55,111,00,24,41,258,00*7A
$GPGSV,3,2,09,28,40,055,00,18,26,309,36,05,14,178,00,17,12,108,00*7F
$GPGSV,3,3,09,08,07,064,00*4D
$GPRMC,134557.428,V,4821.6136,N,00433.6451,W,,,190413,,*08

J'aimerais enrichir mon script et présenter ces données sous une autre forme:
Température: 22.2325 Conductivité: 0.00008 Salinité: 0.0108 Vélocité: 1489.021

Pour cela il faudrait que je puisse discriminer les 4 valeurs, température conductivité salinité et vélocité dans mes paquets TCP.
Je voudrais garder que la ligne $GPRMC,134557.428,V,4821.6136,N,00433.6451,W,,,190413,,*08 et enlever toutes les autres lignes $GP qui arrivent (et si possible n'en garder qu'une sur 10)/
Quels sont les outils qui pourraient me permettre de mettre en forme ces données enregistrés à partir des ports TCP?
Avatar du membre
GhostLine
Niveau 7
Niveau 7
Messages : 342
Enregistré le : jeu. 12 mars 2009 15:28
Localisation : Paris
Status : Hors ligne

Re: [..] Recevoir des packets d'un serveur TCP

#14

Message par GhostLine »

Stringsplit devrait être ton ami :)
Répondre