|
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)
MerciMessage modifié, 24 septembre 2018 - 12:33 |
| |
| |
| | | |
|
| | | | |
| | |
|