Python Twisted receive command from TCP write to Serial device return response

后端 未结 2 582
梦谈多话
梦谈多话 2021-02-10 17:34

I\'ve managed to connect to usb modem and a client can connect via tcp to my reactor.listenTCP,the data received from modem will be send back to client. I\'m want to take dataRe

相关标签:
2条回答
  • 2021-02-10 18:21

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

    How do I make input on one connection result in output on another?

    Thing is, if you want to send stuff to a TCP-connected client in your serial-connected protocol, just pass to the protocol a reference to the factory, so you can use that reference to make the bridge.

    Here's some example 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 reference:

    tcpfactory = CommandRxFactory()
    reactor.listenTCP(8000, tcpfactory)
    SerialPort(USBClient(tcpfactory), 'COM8', reactor, baudrate='19200')
    reactor.run()
    
    0 讨论(0)
  • 2021-02-10 18:35

    Thanks, got it to work.Could not get def notifyAll to send data to my modem..did it 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 讨论(0)
提交回复
热议问题