1

ねじれたアプリケーションでは、ajax POST 経由で (modbus への) TCP 接続を開始/停止したいと考えています。接続ステータスに応じて、[接続] または [切断] というタイトルのボタンが 1 つあります。

今私のコードは次のようになります:

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

応答を遅らせることは、通常、待っているものによって呼び出されdeferたメソッドからa を返すことです。renderこの場合、 modbus 接続のクライアント プロトコルをセットアップして、 を呼び出す前に何らかの方法で渡した defer を呼び出す必要があると思いますreactor.connectTCP

前の質問で言及した Websocket の使用をあきらめましたか?
modbus/TCP 経由でデータを非同期に読み取り、Web に送信する方法

Websocket は、基本的にブラウザーと modbus サーバー間の接続をプロキシするための効果的なアプローチのように思えます。

于 2012-08-24T10:29:18.507 に答える