예제 #1
0
파일: service.py 프로젝트: txros/txros
    def _handle_tcpros_conn(self, headers, conn):
        try:
            # check headers

            conn.sendString(tcpros.serialize_dict(dict(
                callerid=self._node_handle._name,
                type=self._type._type,
                md5sum=self._type._md5sum,
                request_type=self._type._request_class._type,
                response_type=self._type._response_class._type,
            )))

            while True:
                string = yield conn.receiveString()
                req = self._type._request_class().deserialize(string)
                try:
                    resp = yield self._callback(req)
                except Exception as e:
                    traceback.print_exc()
                    conn.sendByte(chr(0))
                    conn.sendString(str(e))
                else:
                    conn.sendByte(chr(1))
                    x = StringIO.StringIO()
                    self._type._response_class.serialize(resp, x)
                    conn.sendString(x.getvalue())
        except (error.ConnectionDone, error.ConnectionLost):
            pass
        finally:
            conn.transport.loseConnection()
예제 #2
0
    def _handle_tcpros_conn(self, headers, conn):
        try:
            # XXX handle headers

            conn.sendString(tcpros.serialize_dict(dict(
                callerid=self._node_handle._name,
                type=self._type._type,
                md5sum=self._type._md5sum,
                latching='1' if self._latching else '0',
            )))

            if self._latching and self._last_message_data is not None:
                conn.sendString(self._last_message_data)

            self._connections[conn] = headers['callerid']
            try:
                while True:
                    x = yield conn.receiveString()
                    print repr(x)
            finally:
                del self._connections[conn]
        except (error.ConnectionDone, error.ConnectionLost):
            pass
        finally:
            conn.transport.loseConnection()
예제 #3
0
 def _handle_tcpros_conn(self, headers, conn):
     try:
         # XXX handle headers
         
         conn.sendString(tcpros.serialize_dict(dict(
             callerid=self._node_handle._name,
             type=self._type._type,
             md5sum=self._type._md5sum,
             latching='1' if self._latching else '0',
         )))
         
         if self._latching and self._last_message_data is not None:
             conn.sendString(self._last_message_data)
         
         self._connections[conn] = headers['callerid']
         try:
             while True:
                 x = yield conn.receiveString()
                 print repr(x)
         finally:
             del self._connections[conn]
     except (error.ConnectionDone, error.ConnectionLost):
         pass
     finally:
         conn.transport.loseConnection()
예제 #4
0
 def __call__(self, req):
     serviceUrl = yield self._node_handle._master_proxy.lookupService(self._name)
     
     protocol, rest = serviceUrl.split('://', 1)
     host, port_str = rest.rsplit(':', 1)
     port = int(port_str)
     
     assert protocol == 'rosrpc'
     
     conn = yield endpoints.TCP4ClientEndpoint(reactor, host, port).connect(util.AutoServerFactory(lambda addr: tcpros.Protocol()))
     try:
         conn.sendString(tcpros.serialize_dict(dict(
             callerid=self._node_handle._name,
             service=self._name,
             md5sum=self._type._md5sum,
             type=self._type._type,
         )))
         
         header = tcpros.deserialize_dict((yield conn.receiveString()))
         # XXX do something with header
         
         # request could be sent before header is received to reduce latency...
         x = StringIO.StringIO()
         self._type._request_class.serialize(req, x)
         data = x.getvalue()
         conn.sendString(data)
         
         result = ord((yield conn.receiveByte()))
         data = yield conn.receiveString()
         if result: # success
             defer.returnValue(self._type._response_class().deserialize(data))
         else:
             raise ServiceError(data)
     finally:
         conn.transport.loseConnection()
예제 #5
0
    def _handle_tcpros_conn(self, headers, conn):
        try:
            # check headers

            conn.sendString(
                tcpros.serialize_dict(
                    dict(
                        callerid=self._node_handle._name,
                        type=self._type._type,
                        md5sum=self._type._md5sum,
                        request_type=self._type._request_class._type,
                        response_type=self._type._response_class._type,
                    )))

            while True:
                string = yield conn.receiveString()
                req = self._type._request_class().deserialize(string)
                try:
                    resp = yield self._callback(req)
                except Exception as e:
                    traceback.print_exc()
                    conn.sendByte(chr(0))
                    conn.sendString(str(e))
                else:
                    conn.sendByte(chr(1))
                    x = StringIO.StringIO()
                    self._type._response_class.serialize(resp, x)
                    conn.sendString(x.getvalue())
        except (error.ConnectionDone, error.ConnectionLost):
            pass
        finally:
            conn.transport.loseConnection()
예제 #6
0
    def _publisher_thread(self, url):
        while True:
            try:
                proxy = rosxmlrpc.Proxy(xmlrpc.Proxy(url),
                                        self._node_handle._name)
                value = yield proxy.requestTopic(self._name, [['TCPROS']])

                protocol, host, port = value
                conn = yield endpoints.TCP4ClientEndpoint(
                    reactor, host, port).connect(
                        util.AutoServerFactory(lambda addr: tcpros.Protocol()))
                try:
                    conn.sendString(
                        tcpros.serialize_dict(
                            dict(
                                message_definition=self._type._full_text,
                                callerid=self._node_handle._name,
                                topic=self._name,
                                md5sum=self._type._md5sum,
                                type=self._type._type,
                            )))
                    header = tcpros.deserialize_dict((yield
                                                      conn.receiveString()))
                    self._connections[conn] = header.get('callerid', None)
                    try:
                        while True:
                            data = yield conn.receiveString()
                            msg = self._type().deserialize(data)
                            try:
                                self._callback(msg)
                            except:
                                traceback.print_exc()

                            self._last_message = msg
                            self._last_message_time = self._node_handle.get_time(
                            )

                            old, self._message_dfs = self._message_dfs, []
                            for df in old:
                                df.callback(msg)
                    finally:
                        del self._connections[conn]
                finally:
                    conn.transport.loseConnection()
            except (error.ConnectionDone, error.ConnectionLost,
                    error.ConnectionRefusedError):
                pass
            except Exception:
                traceback.print_exc()

            yield util.wall_sleep(
                1
            )  # pause so that we don't repeatedly reconnect immediately on failure
예제 #7
0
 def _handle_tcpros_conn(conn):
     try:
         header = tcpros.deserialize_dict((yield conn.receiveString()))
         def default(header, conn):
             conn.sendString(tcpros.serialize_dict(dict(error='unhandled connection')))
             conn.transport.loseConnection()
         if 'service' in header:
             self._tcpros_handlers.get(('service', header['service']), default)(header, conn)
         elif 'topic' in header:
             self._tcpros_handlers.get(('topic', header['topic']), default)(header, conn)
         else:
             conn.sendString(tcpros.serialize_dict(dict(error='no topic or service name detected')))
             conn.transport.loseConnection()
     except:
         conn.transport.loseConnection()
         raise
예제 #8
0
 def _handle_tcpros_conn(conn):
     try:
         header = tcpros.deserialize_dict((yield conn.receiveString()))
         def default(header, conn):
             conn.sendString(tcpros.serialize_dict(dict(error='unhandled connection')))
             conn.transport.loseConnection()
         if 'service' in header:
             self._tcpros_handlers.get(('service', header['service']), default)(header, conn)
         elif 'topic' in header:
             self._tcpros_handlers.get(('topic', header['topic']), default)(header, conn)
         else:
             conn.sendString(tcpros.serialize_dict(dict(error='no topic or service name detected')))
             conn.transport.loseConnection()
     except:
         conn.transport.loseConnection()
         raise
예제 #9
0
파일: subscriber.py 프로젝트: txros/txros
    def _publisher_thread(self, url):
        while True:
            try:
                proxy = rosxmlrpc.Proxy(xmlrpc.Proxy(url), self._node_handle._name)
                value = yield proxy.requestTopic(self._name, [['TCPROS']])

                protocol, host, port = value
                conn = yield endpoints.TCP4ClientEndpoint(reactor, host, port).connect(
                    util.AutoServerFactory(lambda addr: tcpros.Protocol()))
                try:
                    conn.sendString(tcpros.serialize_dict(dict(
                        message_definition=self._type._full_text,
                        callerid=self._node_handle._name,
                        topic=self._name,
                        md5sum=self._type._md5sum,
                        type=self._type._type,
                    )))
                    header = tcpros.deserialize_dict((yield conn.receiveString()))
                    self._connections[conn] = header.get('callerid', None)
                    try:
                        while True:
                            data = yield conn.receiveString()
                            msg = self._type().deserialize(data)
                            try:
                                self._callback(msg)
                            except:
                                traceback.print_exc()

                            self._last_message = msg
                            self._last_message_time = self._node_handle.get_time()

                            old, self._message_dfs = self._message_dfs, []
                            for df in old:
                                df.callback(msg)
                    finally:
                        del self._connections[conn]
                finally:
                    conn.transport.loseConnection()
            except (error.ConnectionDone, error.ConnectionLost, error.ConnectionRefusedError):
                pass
            except Exception:
                traceback.print_exc()

            yield util.wall_sleep(1)  # pause so that we don't repeatedly reconnect immediately on failure
예제 #10
0
파일: nodehandle.py 프로젝트: txros/txros
 def default(header, conn):
     conn.sendString(tcpros.serialize_dict(dict(error='unhandled connection')))
     conn.transport.loseConnection()
예제 #11
0
파일: nodehandle.py 프로젝트: sentree/txros
 def default(header, conn):
     conn.sendString(
         tcpros.serialize_dict(
             dict(error='unhandled connection')))
     conn.transport.loseConnection()