ich stehe aktuell vor einem Problem.
Ich möchte die Befehlssyntax eines Controllers mithilfe des "unittest" testen. Es umfasst ca 200 Befehle, welche der Reihe nach versendet und mit RegExp verglichen werden.
STX/ETX wird beim Empfangen verwendet. Gesendet wir klassisch mit "\n"
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import sys
import time
class ControllerSocket:
RECEIVE_CHUNK = 240
socket.setdefaulttimeout(20)
def __init__(self, sock=None):
if sock is None:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
else:
self.sock = sock
def connect(self, host, port):
try:
self.sock.connect((host, port))
except socket.error as msg:
self.sock.close()
self.sock = None
def disconnect(self):
self.sock.shutdown(socket.SHUT_RDWR)
if self.sock is None:
print("\nConnection problem\n")
return
else:
self.sock.shutdown(1)
self.sock.close()
self.sock = None
def send(self, message):
self.sock.sendall(message+"\n")
def receive(self):
data = ""
while not data.endswith("\x03"):
try:
data += self.sock.recv(self.RECEIVE_CHUNK)
time.sleep(0.5)
print (data)
print ("Received")
if(len(data) == 0):
print("Mist")
self.duplex(message)
self.disconnect()
return
time.sleep(0.05)
except socket.error as msg:
print msg
self.disconnect()
return data[1:-1]
def duplex(self, message):
self.send(message)
return self.receive()
Dann las ich das hier: LINK
Nun mit time.sleep kam ich leider auch nicht wirklich weiter, es machte es zwar etwas zuverlässiger, aber dennoch unterbricht die Verbindung oder ich empfange einfach nichts mehr.
Jetzt suchte ich nach einer Alternative. Ich kam auf "Twisted".
Senden bekam ich bisher hin, leider scheitere ich am empfangen der Rückmeldung.
Habe den folgenden Code als Test in Verwendung:
Code: Alles auswählen
import sys
from twisted.python import log
from twisted.internet import reactor, interfaces
from twisted.internet.protocol import ServerFactory, ClientFactory, Protocol, Factory
from twisted.application.service import Service, Application
class EchoServerProtocol(Protocol):
def dataReceived(self, data):
log.msg('Data received {}'.format(data))
self.transport.write(data)
def connectionMade(self):
log.msg('Client connection from {}'.format(self.transport.getPeer()))
def connectionLost(self, reason):
log.msg('Lost connection because {}'.format(reason))
class EchoClientProtocol(Protocol):
def dataReceived(self, data):
#while not (data.endswith("\03")):
log.msg('Data received {}'.format(data))
self.transport.loseConnection()
def connectionMade(self):
data = 'BEFEHL\n'
self.transport.write(data.encode())
log.msg('Data sent {}'.format(data))
def connectionLost(self, reason):
log.msg('Lost connection because {}'.format(reason))
class EchoServerFactory(ServerFactory):
def buildProtocol(self, addr):
return EchoServerProtocol()
class EchoClientFactory(ClientFactory):
def startedConnecting(self, connector):
log.msg('Started to connect.')
def buildProtocol(self, addr):
log.msg('Connected.')
return EchoClientProtocol()
def clientConnectionLost(self, connector, reason):
log.msg('Lost connection. Reason: {}'.format(reason))
def clientConnectionFailed(self, connector, reason):
log.msg('Lost failed. Reason: {}'.format(reason))
def main():
log.startLogging(sys.stdout)
log.msg('Start your engines...')
#reactor.listenTCP(5025, EchoServerFactory())
reactor.connectTCP('192.168.1.5', 5025, EchoClientFactory())
reactor.run()
if __name__ == '__main__':
main()
Code: Alles auswählen
2017-09-20 10:25:56+0200 [-] Log opened.
2017-09-20 10:25:56+0200 [-] Start your engines...
2017-09-20 10:25:56+0200 [-] Starting factory <__main__.EchoClientFactory instance at 0x9a08f4c>
2017-09-20 10:25:56+0200 [-] Started to connect.
2017-09-20 10:25:56+0200 [Uninitialized] Connected.
2017-09-20 10:25:56+0200 [Uninitialized] Data sent Befehl
2017-09-20 10:25:56+0200 [EchoClientProtocol,client] Data received <--- \02
2017-09-20 10:25:56+0200 [EchoClientProtocol,client] Lost connection because [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]
2017-09-20 10:25:56+0200 [EchoClientProtocol,client] Lost connection. Reason: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]
2017-09-20 10:25:56+0200 [-] Stopping factory <__main__.EchoClientFactory instance at 0x9a08f4c>
^C2017-09-20 10:25:58+0200 [-] Received SIGINT, shutting down.
2017-09-20 10:25:58+0200 [-] Main loop terminated.
Möchte den Code so einfach wie möglich halten, dass sehe ich bei Twisted bisher nicht.
Auch ein Problem mit der Verständis habe ich beim Befehl listenTCP, da wir nur der Port angegeben, welcher sich ja bei jeder Verbindung ändert.
Vielen Dank im Vorraus
LG