在扭曲的应用程序中,我想通过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()
现在我在连接开始时'连接',在停止连接时'连接'。 我想等待响应,直到建立或取消连接并返回连接状态(连接或断开连接+可选的错误描述)。
谢谢。
答案 0 :(得分:1)
延迟回复通常是从defer
方法返回render
的问题,然后您通过任何等待的方式调用该方法。在这种情况下,我认为您需要为modbus连接设置客户端协议,以便在调用reactor.connectTCP
之前以某种方式调用延迟传递给它。
您是否已放弃使用上一个问题中提到的websockets? How to asynchronously read data via modbus/TCP and send them to web
Websockets在我看来似乎是一种基本上代理浏览器和modbus服务器之间连接的有效方法。
答案 1 :(得分:1)
如果您使用端点API,那么一旦建立连接并且已创建并连接了协议实例,您将获得与连接的协议实例一起触发的延迟返回:
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)