Команда приема Python Twisted из TCP для записи в ответ на последовательное устройство - PullRequest
4 голосов
/ 17 января 2011

Мне удалось подключиться к 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()

Ответы [ 2 ]

5 голосов
/ 17 января 2011

Ваша проблема не в кручении, а в питоне.Прочтите этот раздел часто задаваемых вопросов:

Как сделать так, чтобы вход на одном соединении приводил к выходу на другом?

Вещиесли вы хотите отправлять данные клиенту, подключенному по протоколу 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()
0 голосов
/ 18 января 2011

Спасибо, получил его на работу. Не удалось получить def notifyAll, чтобы отправить данные на мой модем.

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