1

在扭曲的应用程序中,我想通过 ajax POST 启动/停止 tcp 连接(到 modbus)。我有一个标题为连接或断开连接的按钮,具体取决于连接状态。

现在我的代码看起来像:

class ConnectHandler(Resource):

    modbus_connection = None

    def try_disconnect(self):
        log.msg('Disconnecting...')
        try:
            self.modbus_connection.disconnect()
        except:
            log.err()
        return self.modbus_connection.state

    def try_connect(self):
        try:
            framer = ModbusFramer(ClientDecoder())
            reader = DataReader()
            factory = ModbusFactory(framer, reader) # inherits from ClientFactory
            self.modbus_connection = reactor.connectTCP(ip, 502, factory)
        except:
            log.err()
        return str(self.modbus_connection.state)

    def render_POST(self, request):
         if self.modbus_connection and \
            self.modbus_connection.state == 'connected':
            return self.try_disconnect()
        else:
            return self.try_connect()

现在我在连接开始时得到“连接”,在停止连接时得到“连接”。我想等待响应,直到连接建立或取消并返回连接状态(连接或断开+可选的错误描述)。

谢谢你。

4

2 回答 2

1

如果您改用端点 API,您将获得一个 Deferred 返回,一旦建立连接并且该协议实例已创建并连接,就会与连接的协议实例一起触发:

from twisted.internet.endpoints import TCP4ClientEndpoint

e = TCP4ClientEndpoint(reactor, ip, 502)
d = e.connect(factory)
def connected(protocol):
    print 'Connection established, yay.'
    # Use `protocol` here some more if you want,
    # finish the response to the request, etc
d.addCallback(connected)
于 2012-08-24T19:34:04.350 回答
1

延迟响应通常是deferrender您所等待的任何方法调用的方法中返回 a 的问题。在这种情况下,我认为您需要为 modbus 连接设置客户端协议,以在调用之前以某种方式调用延迟传递给它reactor.connectTCP

您是否已放弃使用您在上一个问题中提到的 websockets?
如何通过 modbus/TCP 异步读取数据并将其发送到 Web

在我看来,Websockets 似乎是一种从本质上代理浏览器和 modbus 服务器之间连接的有效方法。

于 2012-08-24T10:29:18.507 回答