Python Twisted command receives a command from a TCP record in response to a serial device return

I managed to connect to the usb modem, and the client can connect via tcp to my .listenTCP reactor, the data received from the modem will be sent back to the client. I want to take dataReceived from the client and send it to the modem. I'm struggling to get this to work. Any help would be greatly appreciated! code:

from twisted.internet import win32eventreactor win32eventreactor.install() from twisted.internet import reactor from twisted.internet.serialport import SerialPort from twisted.internet.protocol import Protocol, Factory from twisted.python import log import sys log.startLogging(sys.stdout) client_list = []#TCP clients connecting to me class USBClient(Protocol): def connectionFailed(self): print "Connection Failed:", self reactor.stop() def connectionMade(self): print 'Connected to USB modem' USBClient.sendLine(self, 'AT\r\n') def dataReceived(self, data): print "Data received", repr(data) print "Data received! with %d bytes!" % len(data) #check & perhaps modify response and return to client for cli in client_list: cli.notifyClient(data) pass def lineReceived(self, line): print "Line received", repr(line) def sendLine(self, cmd): print cmd self.transport.write(cmd + "\r\n") def outReceived(self, data): print "outReceived! with %d bytes!" % len(data) self.data = self.data + data class CommandRx(Protocol): def connectionMade(self): print 'Connection received from tcp..' client_list.append(self) def dataReceived(self, data): print 'Command receive', repr(data) #Build command, if ok, send to serial port #???? def connectionLost(self, reason): print 'Connection lost', reason if self in client_list: print "Removing " + str(self) client_list.remove(self) def notifyClient(self, data): self.transport.write(data) class CommandRxFactory(Factory): protocol = CommandRx def __init__(self): client_list = [] if __name__ == '__main__': reactor.listenTCP(8000, CommandRxFactory()) SerialPort(USBClient(), 'COM8', reactor, baudrate='19200') reactor.run() 
+4
source share
2 answers

Your problem is not twisted, but in python. Read this entry in the FAQ:

How to make a conclusion on one result of connecting output to another?

The thing is, if you want to send material to a client connected to TCP in your serial protocol, just pass the factory link to the protocol so that you can use this link to create the bridge.

Here is an example of code that roughly does this:

 class USBClient(Protocol): def __init__(self, network): self.network = network def dataReceived(self, data): print "Data received", repr(data) #check & perhaps modify response and return to client self.network.notifyAll(data) #... class CommandRx(Protocol): def connectionMade(self): self.factory.client_list.append(self) def connectionLost(self, reason): if self in self.factory.client_list: self.factory.client_list.remove(self) class CommandRxFactory(Factory): protocol = CommandRx def __init__(self): self.client_list = [] def notifyAll(self, data): for cli in self.client_list: cli.transport.write(data) 

When initializing, pass the link:

 tcpfactory = CommandRxFactory() reactor.listenTCP(8000, tcpfactory) SerialPort(USBClient(tcpfactory), 'COM8', reactor, baudrate='19200') reactor.run() 
+4
source

Thanks, put it to work. Failed to get def notifyAll to send data to my modem .. like this: for cli in client_list: cli.transport.write (data)
new code:

 import sys from twisted.internet import reactor from twisted.internet.protocol import Factory from twisted.internet.protocol import Protocol from twisted.internet.serialport import SerialPort from twisted.python import log log.startLogging(sys.stdout) client_list = []#TCP clients connecting to me usb_list = [] class USBClient(Protocol): def __init__(self, network): self.network = network self.usb_list = [] def connectionFailed(self): print "Connection Failed:", self reactor.stop() def connectionMade(self): usb_list.append(self) print 'Connected to USB modem' USBClient.sendLine(self, 'AT\r\n') def dataReceived(self, data): print "Data received", repr(data) print "Data received! with %d bytes!" % len(data) for cli in client_list: cli.transport.write(data) #self.network.notifyAll(data)# !!AArgh..!Could not get this to work pass def lineReceived(self, line): print "Line received", repr(line) def sendLine(self, cmd): print cmd self.transport.write(cmd + "\r\n") def outReceived(self, data): print "outReceived! with %d bytes!" % len(data) self.data = self.data + data class CommandRx(Protocol): def connectionMade(self): print 'Connection received from tcp..' client_list.append(self) def dataReceived(self, data): print 'Command receive', repr(data) for usb in usb_list: usb.transport.write(data) def connectionLost(self, reason): print 'Connection lost', reason if self in client_list: print "Removing " + str(self) client_list.remove(self) class CommandRxFactory(Factory): protocol = CommandRx def __init__(self): self.client_list = [] def notifyAll(self, data): for cli in self.client_list: cli.transport.write('yipee') if __name__ == '__main__': tcpfactory = CommandRxFactory() reactor.listenTCP(8000, tcpfactory) SerialPort(USBClient(tcpfactory), '/dev/ttyUSB4', reactor, baudrate='19200') reactor.run() 
0
source

Source: https://habr.com/ru/post/1335862/


All Articles