PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

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 // ATTENTION ICI : IL N'Y A AUCUNE SORTIE DANS CETTE BOUCLE (il vaut mieux utiliser un booléen)
SI SocketAttendConnexion("GPS") ALORS
sID est une chaîne = SocketAccepte("GPS")
Trace("Nouvelle connexion : " + sID)
SocketChangeModeTransmission(sID,<---------------- à définir ici sur 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

// Mode de transmission : chaque message se termine par ]
//SocketChangeModeTransmission("GPS", SocketMarqueurFin, "]")

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
// Extraction de l'IMEI
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.