|
| Accueil → WINDEV 2025 → Problème de communication TCP avec une balise GPS (réponse non reconnue) |
| Problème de communication TCP avec une balise GPS (réponse non reconnue) |
| Débuté par Gikali, 02 juin 2025 18:08 - 6 réponses |
| |
| | | |
|
| |
Membre enregistré 11 messages |
|
| Posté le 02 juin 2025 - 18:08 |
Bonjour,
Je travaille sur un projet WinDev où je dois gérer une communication TCP avec une balise GPS. Le fonctionnement est censé être simple : la balise envoie une trame comme ceci [3G*9705243326*0009*LK,0,0,0,93]
Et je dois lui répondre exactement ça :
[SG*9705243326*0002*LK]
Quand je fais ce traitement avec un script Python simple, tout fonctionne parfaitement : la balise reçoit la réponse et continue la communication.
Par contre, dans mon code Windev, même en envoyant exactement la même chaîne via SocketEcrit, la balise ne répond pas. Elle semble ignorer la réponse ou ferme la connexion.
Voici à quoi ressemble mon code côté serveur TCP :
Procedure GererClient(sID est une chaîne)
sMessage est une chaîne = SocketLit(sID)
SI sMessage = "" ALORS Trace("Client " + sID + " n'a rien envoyé.") RETOUR FIN
Trace(">> Contenu reçu : " + sMessage)
SI Milieu(sMessage, 1, 2) = "[[" ALORS sMessage = Milieu(sMessage, 2, Taille(sMessage) - 2) FIN
SI Contient(sMessage, "*LK") > 0 ALORS sIMEI est une chaîne = ExtraitChaîne(sMessage, 2, "*") sReponse est une chaîne = "[SG*" + sIMEI + "*0002*LK]"
SI SocketExiste(sID) ALORS SocketEcrit(sID, sReponse) Trace("Réponse LK envoyée : " + sReponse) SINON Trace("Socket déjà fermée avant réponse LK") FIN
AssocierConnexion(sIMEI, sID) RETOUR FIN
et sur le script python:
import socket
HOST = '0.0.0.0' # Accepte toutes les IP entrantes PORT = 8888 # Port du serveur
# Crée un socket TCP server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((HOST, PORT)) server.listen(1)
print(f"[+] Serveur TCP V51 en écoute sur le port {PORT}...")
WHILE True: conn, addr = server.accept() print(f"[+] Connexion de {addr}")
with conn: WHILE True: Data = conn.recv(1024) IF not Data: BREAK
Message = Data.decode(errors='ignore') print("[Reçu]", Message)
IF "*LK" IN Message: tracker_id = message.split("*")[1] response = f"[SG*{tracker_id}*0002*LK]" conn.sendall(response.encode()) print("[Envoyé]", response)
Je ne comprends pas ce qui bloque :
Le message est bien reçu côté serveur.
La réponse avec LK est correcte (identique à celle envoyée depuis Python).
SocketEcrit ne renvoie pas d’erreur. Mais la balise ne réagit pas.
Est-ce une question d’encodage ou de timing ?
Merci d’avance si quelqu’un a déjà eu le cas ou a une idée. Bonne journée !Message modifié, 02 juin 2025 - 18:09 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 290 messages |
|
| Posté le 02 juin 2025 - 18:35 |
Bonsoir,
Dans ton code Python, on voit bien comment est créé le socket serveur : socket.socket(socket.AF_INET, socket.SOCK_STREAM) Par contre, je ne vois pas le code coté Windev.
As tu changé le mode de transmission ? Il faut probablement faire un SocketChangeModeTransmission(SocketSansMarqueurFin)
Cdlt |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 11 messages |
|
| Posté le 03 juin 2025 - 07:16 |
Oui, c'est ce que j'ai fait dans mon code à la création du socket.
Procedure LanceServeurTCP() SI PAS SocketCrée("GPS", 8888) ALORS Trace("Erreur : impossible de créer le socket TCP sur le port 8888") RETOUR FIN
SocketChangeModeTransmission("GPS", SocketMarqueurFin,CRLF)
Trace("Serveur TCP en écoute sur le port 8888")
TANTQUE Vrai SI SocketAttendConnexion("GPS") ALORS sID est une chaîne = SocketAccepte("GPS") Trace("Nouvelle connexion : " + sID) ThreadExecute(sID, threadNormal, GererClient, sID) FIN Multitâche(100) FIN
J'ai testé avec et sans CRLF, même résultat.Message modifié, 03 juin 2025 - 07:17 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 290 messages |
|
| Posté le 03 juin 2025 - 09:05 |
Bonjour,
Je ne connais pas le protocole de cette balise GPS mais es-tu certain qu'il faut envoyer un CRLF ? Ce n'est pas explicite dans ton code Python d'ailleurs Quoiqu'il en soit, dans mon précédent post je précisais d'indiquer "SocketSansMarqueurFin" et pas "SocketMarqueurFin"
Ensuite, je constate un problème majeur : La fonction SocketChangeModeTransmission doit être renseignée sur le canal de communication qui a été accepté. C'est à dire sur sID
TANTQUE Vrai SI SocketAttendConnexion("GPS") ALORS sID est une chaîne = SocketAccepte("GPS") Trace("Nouvelle connexion : " + sID) SocketChangeModeTransmission(sID,< ThreadExecute(sID, threadNormal, GererClient, sID) FIN Multitâche(100) FIN Message modifié, 03 juin 2025 - 09:08 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 11 messages |
|
| Posté le 03 juin 2025 - 10:10 |
Je n'en suis pas certain non, mais la doc sur le protocole de la balise est plutôt limité et j'ai déjà essayé avec et sans, même résultat.
J'ai rajouter "SocketSansMarqueurfin" et déplacer SocketChangeModeTransmission dans le canal de communication mais c'est toujours la même histoire.
Procedure LanceServeurTCP() SI PAS SocketCrée("GPS", 8888) ALORS Trace("Erreur : impossible de créer le socket TCP sur le port 8888") RETOUR FIN
Trace("Serveur TCP en écoute sur le port 8888")
TANTQUE Vrai SI SocketAttendConnexion("GPS") ALORS sID est une chaîne = SocketAccepte("GPS") Trace("Nouvelle connexion : " + sID) SocketChangeModeTransmission(sID, SocketSansMarqueurFin) sMessage est une chaîne = SocketLit(sID) Trace(">> Contenu brut reçu : " + sMessage) Multitâche(300) SI sMessage.Position("*LK") > 0 ALORS tabTrame est un tableau de chaînes = sMessage.Découpe("*") SI Dimension(tabTrame) > 1 ALORS sIMEI est une chaîne = tabTrame[2] sReponse est une chaîne = "[SG*" + sIMEI + "*0002*LK]" SI SocketEcrit(sID, sReponse) Trace("Réponse LK immédiate envoyée : " + sReponse) FIN FIN FIN
SocketFerme(sID) FIN
Multitâche(100)
FIN
* J'ai déplacer la réponse dans la procédure de création de socket, mais c'est toujours le même code. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 290 messages |
|
| Posté le 03 juin 2025 - 10:37 |
Je vois que ton code Python encode la réponse en UTF-8 : conn.sendall(response.encode()) Essayes de faire la même chose avec la fonction ChaîneVersUTF8() |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 11 messages |
|
| Posté le 03 juin 2025 - 12:40 |
Je viens de le faire et après avoir regarder du côté de wireshark je recois bien les coordonées GPS de la balise.
Merci. |
| |
| |
| | | |
|
| | | | |
| | |
|