PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Python, Windev, Socket et domotique
Python, Windev, Socket et domotique
Débuté par JIKA, 24 sep. 2018 12:28 - Aucune réponse
Membre enregistré
40 messages
Popularité : +1 (1 vote)
Posté le 24 septembre 2018 - 12:28
bonjour

J'ai un programme qui interroge des prises connectées TP-Link, et qui récupère la consommation électrique journalière sur un appareil.
Le programme est écrit en python sur une configuration W10+VirtualBox+Debian 9.5+Python
J'interroge, sur le port 9999, ces prises qui sont dans mon réseau en Wifi.
Ci-dessous une partie du programme qui fonctionne bien sur cette configuration

def validIP(ip):
try:
socket.inet_pton(socket.AF_INET, ip)
except socket.error:
parser.error("Invalid IP Address.")
return ip 
...
def encrypt(string):
key = 171
result = "\0\0\0\0"
for i in string: 
a = key ^ ord(i)
key = a
result += chr(a)
return result

def decrypt(string):
key = 171 
result = ""
for i in string: 
a = key ^ ord(i)
key = ord(i) 
result += chr(a)
return result
...
ip = args.target
port = 9999
if args.command is None:
cmd = args.json
else:
cmd = commands[args.command]

try:
sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_tcp.connect((ip, port))
sock_tcp.send(encrypt(cmd))
data = sock_tcp.recv(2048)
sock_tcp.close()

...

J'essaie de faire la même chose en windev
SI PAS SocketExiste("PourPosteB") ALORS
SI PAS SocketConnecte("PourPosteB", 9999, "192.168.1.72") ALORS
Erreur("Erreur lors de la connexion à l'adresse "+SAI_AdressePosteB, ErreurInfo(errMessage))
RETOUR
FIN
SINON
RETOUR
FIN

SocketChangeModeTransmission("PourPosteB",SocketSansMarqueurFin)
sChaine est une chaîne = "{""emeter"":{""get_realtime"":{}}}"
sResult est une chaîne = ""
nKey est un entier = 171
nA est un entier

(sResult[[1]], sResult[[2]], sResult[[3]], sResult[[4]]) = Null
POUR i = 1 _A_ Taille(sChaine)
nA = OUExclusifBinaire(nKey,Asc(sChaine[[i]]))
nKey = nA
sResult += Caract(nA)
Trace(i, Taille(sResult), sChaine[[i]], nKey, Asc(sChaine[[i]]), nA,Caract(nA))
FIN

sResultat est un chaîne
SI SocketEcrit("PourPosteB",sResult) = Vrai ALORS
sResultat = SocketLit("PourPosteB", Faux,2000,2048)
Trace("****",sChaine,"***",sResultat,"***",Taille(sResultat),"***")
FIN


Le SocketConnecte et le SocketEcrit ne retournent pas d'erreurs.
Avec un controle avec Wireshark je constate le le programme Python et le programme Windev
envoie la même chaine (même longeur, même contenu).

Mais le SocketLit retourne l'erreur suivante :
Erreur détectée : Erreur de réception :
un problème a été détecté pendant la lecture sur la socket.
La socket a renvoyé l'erreur système suivante :
<Connexion réinitialisée par l'autre partie (WSAECONNRESET)>

Ais-je bien utilisé les socket dans Windev ?
Avez-vous une idée pour corriger ?

NB : La commande que j'envoie à la prise connectée est une chaine de caractères JSON, cette chaine est cryptée par un OuExclusifBinaire sur une clé (171 dans ce cas)

Merci
Message modifié, 24 septembre 2018 - 12:33