Python Twisted从TCP接收命令write to Serial device return respons

2024-05-17 05:05:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我已成功连接到usb调制解调器,客户端可以通过tcp连接到我的反应器。listenTCP,从调制解调器接收的数据将发送回客户端。我想把从客户端接收到的数据发送到调制解调器..我正在努力使它工作。任何帮助都将不胜感激!代码:

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()

Tags: tofromimportselfclient客户端调制解调器data
2条回答

你的问题不在于twisted,而在于python。阅读此常见问题条目:

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

问题是,如果您想在串行连接协议中向TCP连接的客户端发送数据,只需向协议传递一个对工厂的引用,这样您就可以使用该引用来建立桥接。

下面是一些大致实现此目的的示例代码:

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)

初始化时,传递引用:

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

谢谢,开始工作了。无法让def notifyAll将数据发送到我的调制解调器..是这样的吗:客户端列表中的for cli:cli.transport.write(data)
新代码:

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()

相关问题 更多 >