Пример #1
0
    class LayeredTwistedIOLoop(TwistedIOLoop):
        """Layers a TwistedIOLoop on top of a TornadoReactor on a PollIOLoop.

        This is of course silly, but is useful for testing purposes to make
        sure we're implementing both sides of the various interfaces
        correctly.  In some tests another TornadoReactor is layered on top
        of the whole stack.
        """
        def initialize(self, **kwargs):
            self.real_io_loop = PollIOLoop(make_current=False)  # type: ignore
            reactor = self.real_io_loop.run_sync(gen.coroutine(TornadoReactor))
            super(LayeredTwistedIOLoop, self).initialize(reactor=reactor, **kwargs)
            self.add_callback(self.make_current)

        def close(self, all_fds=False):
            super(LayeredTwistedIOLoop, self).close(all_fds=all_fds)
            # HACK: This is the same thing that test_class.unbuildReactor does.
            for reader in self.reactor._internalReaders:
                self.reactor.removeReader(reader)
                reader.connectionLost(None)
            self.real_io_loop.close(all_fds=all_fds)

        def stop(self):
            # One of twisted's tests fails if I don't delay crash()
            # until the reactor has started, but if I move this to
            # TwistedIOLoop then the tests fail when I'm *not* running
            # tornado-on-twisted-on-tornado.  I'm clearly missing something
            # about the startup/crash semantics, but since stop and crash
            # are really only used in tests it doesn't really matter.
            def f():
                self.reactor.crash()
                # Become current again on restart. This is needed to
                # override real_io_loop's claim to being the current loop.
                self.add_callback(self.make_current)
            self.reactor.callWhenRunning(f)
Пример #2
0
    class LayeredTwistedIOLoop(TwistedIOLoop):
        """Layers a TwistedIOLoop on top of a TornadoReactor on a PollIOLoop.

        This is of course silly, but is useful for testing purposes to make
        sure we're implementing both sides of the various interfaces
        correctly.  In some tests another TornadoReactor is layered on top
        of the whole stack.
        """
        def initialize(self, **kwargs):
            self.real_io_loop = PollIOLoop(make_current=False)  # type: ignore
            reactor = self.real_io_loop.run_sync(gen.coroutine(TornadoReactor))
            super(LayeredTwistedIOLoop, self).initialize(reactor=reactor, **kwargs)
            self.add_callback(self.make_current)

        def close(self, all_fds=False):
            super(LayeredTwistedIOLoop, self).close(all_fds=all_fds)
            # HACK: This is the same thing that test_class.unbuildReactor does.
            for reader in self.reactor._internalReaders:
                self.reactor.removeReader(reader)
                reader.connectionLost(None)
            self.real_io_loop.close(all_fds=all_fds)

        def stop(self):
            # One of twisted's tests fails if I don't delay crash()
            # until the reactor has started, but if I move this to
            # TwistedIOLoop then the tests fail when I'm *not* running
            # tornado-on-twisted-on-tornado.  I'm clearly missing something
            # about the startup/crash semantics, but since stop and crash
            # are really only used in tests it doesn't really matter.
            def f():
                self.reactor.crash()
                # Become current again on restart. This is needed to
                # override real_io_loop's claim to being the current loop.
                self.add_callback(self.make_current)
            self.reactor.callWhenRunning(f)
Пример #3
0
def install():
    """DEPRECATED
    
    pyzmq 17 no longer needs any special integration for tornado.
    """
    _deprecated()
    PollIOLoop.configure(ZMQIOLoop)
Пример #4
0
 def current(*args, **kwargs):
     """Returns the current thread’s IOLoop.
     """
     # install ZMQIOLoop as the active IOLoop implementation
     # when using tornado 3
     if tornado_version >= (3,):
         PollIOLoop.configure(ZMQIOLoop)
     return PollIOLoop.current(*args, **kwargs)
Пример #5
0
 def current(*args, **kwargs):
     """Returns the current threads IOLoop.
     """
     #
     # install PuritanicalIOLoop as the active IOLoop implementation
     #
     PollIOLoop.configure(PuritanicalIOLoop)
     return PollIOLoop.current(*args, **kwargs)
Пример #6
0
 def run(self):
     while True:
         try:
             context, packet = self.queue.get()
             buff = str(packet)
             PollIOLoop.instance().add_callback(self.ioloop_callback, context, buff)
         finally:
             self.queue.task_done()
Пример #7
0
 def reset_timeout(self):
     if not self._keep_alive: # dont set timeout if keep_alive is zero that be set by client
         return
     if self._timeout_handle != None:
         PollIOLoop.instance().remove_timeout(self._timeout_handle)
         self._timeout_handler = None
     self._timeout_handle = PollIOLoop.instance().call_later(1.5*self._keep_alive, self.keep_alive_timeout)
     logging.info(" reset_timeout --> device_id: %s" % (self._client_id))
     return
Пример #8
0
 def current(cls, *args, **kwargs):
     """Returns the current thread’s IOLoop.
     """
     # install ZMQIOLoop as the active IOLoop implementation
     # when using tornado 3
     PollIOLoop.configure(cls)
     _deprecated()
     loop = PollIOLoop.current(*args, **kwargs)
     return loop
Пример #9
0
 def close_callback(self):
     PollIOLoop.instance().remove_timeout(self._timeout_handle)
     if self._connect_state == mq_cs_connected:
         logging.info(" close_callback --> device_id: %s " %
                      (self._client_id))
         self._ppmtdb.work_queue.put(
             (self._ppmtdb.set_inactive_cnn,
              (self, )))  # put a set inactive task into queue
     return
Пример #10
0
 def reset_timeout(self):
     if not self._keep_alive:  # dont set timeout if keep_alive is zero that be set by client
         return
     if self._timeout_handle != None:
         PollIOLoop.instance().remove_timeout(self._timeout_handle)
         self._timeout_handler = None
     self._timeout_handle = PollIOLoop.instance().call_later(
         1.5 * self._keep_alive, self.keep_alive_timeout)
     logging.info(" reset_timeout --> device_id: %s" % (self._client_id))
     return
Пример #11
0
    def mqtt3_send_publish(self, context, topic, qos, message):

        logging.info("sended pub --> topic: %s   device_id: %s " % (topic, context._client_id))

        packet = bytearray()
        packet.extend(struct.pack("!B", MQTT3_PUBLISH | (qos << 1)))

        topic_len = len(topic)
        msg_len = 0 if message == None else len(message)
        remain_len = 2 + topic_len + msg_len

        if qos:
            remain_len += 2  # for mid

        self._pack_remain_len(packet, remain_len)

        fmt = "!H" + str(topic_len) + "s"

        # topic_len + topic
        packet.extend(struct.pack(fmt, topic_len, topic))

        if qos:  # for mid
            context._out_mid += 1
            if 65536 == context._out_mid:
                context._out_mid = 1

            packet.extend(struct.pack("!H", context._out_mid))

        if msg_len:  # for payload
            fmt = "!" + str(msg_len) + "s"
            packet.extend(struct.pack(fmt, message))

        mid = context._out_mid

        wait_state = yvmq_msg_state.invalid

        if qos == 1:
            wait_state = yvmq_msg_state.wait_puback
        elif qos == 2:
            wait_state = yvmq_msg_state.wait_pubrec

        if wait_state:
            #           self.inc_in_flight_o()
            #           context._wait_pub_queue.put( (mid, wait_state, packet) )

            context._wait_pub_queue.put(
                (mid, wait_state, packet, topic, qos)
            )  # modify on June 14, 2014 for PPMESSAGE just send onece. Ben Ning

            #           PollIOLoop.instance().add_callback(context.wait_pub_queue_handler_callback, MQTT3_PUBLISH)
            PollIOLoop.instance().add_callback(context.wait_pub_queue_handler_callback)
        else:
            self.send_queue.put((context, packet))  # put a send packet task into send_queue

        self.sys_info._sent_publish_messages += 1
Пример #12
0
    def instance(*args, **kwargs):
        """Returns a global `IOLoop` instance.

        Most applications have a single, global `IOLoop` running on the
        main thread.  Use this method to get this instance from
        another thread.  To get the current thread's `IOLoop`, use `current()`.
        """
        #
        # install PuritanicalIOLoop as the active IOLoop implementation
        #
        PollIOLoop.configure(PuritanicalIOLoop)
        return PollIOLoop.instance(*args, **kwargs)
Пример #13
0
 def instance(*args, **kwargs):
     """Returns a global `IOLoop` instance.
     
     Most applications have a single, global `IOLoop` running on the
     main thread.  Use this method to get this instance from
     another thread.  To get the current thread's `IOLoop`, use `current()`.
     """
     # install ZMQIOLoop as the active IOLoop implementation
     # when using tornado 3
     if tornado_version >= (3,):
         PollIOLoop.configure(ZMQIOLoop)
     return PollIOLoop.instance(*args, **kwargs)
Пример #14
0
 def current(cls, *args, **kwargs):
     """Returns the current thread’s IOLoop.
     """
     # install ZMQIOLoop as the active IOLoop implementation
     # when using tornado 3
     if tornado_version >= (3,):
         PollIOLoop.configure(cls)
     loop = PollIOLoop.current(*args, **kwargs)
     if not isinstance(loop, cls):
         warnings.warn("IOLoop.current expected instance of %r, got %r" % (cls, loop),
             RuntimeWarning, stacklevel=2,
         )
     return loop
Пример #15
0
 def instance(cls, *args, **kwargs):
     """Returns a global `IOLoop` instance.
     
     Most applications have a single, global `IOLoop` running on the
     main thread.  Use this method to get this instance from
     another thread.  To get the current thread's `IOLoop`, use `current()`.
     """
     # install ZMQIOLoop as the active IOLoop implementation
     # when using tornado 3
     if tornado_version >= (3,):
         PollIOLoop.configure(cls)
     loop = PollIOLoop.instance(*args, **kwargs)
     if not isinstance(loop, cls):
         warnings.warn("IOLoop.current expected instance of %r, got %r" % (cls, loop),
             RuntimeWarning, stacklevel=2,
         )
     return loop
Пример #16
0
    def update_sysinfo_callback(self):
        #       self.recount_cnns()
        self.sys_info.recalculate()

        self.work_queue.put((self.update_sys_info_topic, ()))
        self.update_sysinfo_timeout = PollIOLoop.instance().add_timeout(
            self.sys_info._timestamp + 15, self.update_sysinfo_callback
        )
Пример #17
0
    def add_cnn(self, context, clean=True):

        if not context:
            return

        if clean:
            if context._client_id in self.cnns:
                old_context = self.cnns[context._client_id].context
                if context is not old_context:
                    PollIOLoop.instance().add_callback(old_context.close_for_reconnect, context, clean)

                if not self.cnns[context._client_id].active:
                    self.sys_info._active_clients += 1
                    self.sys_info._inactive_clients -= 1
                    self.cnns[context._client_id].active = True

                self.cnns[context._client_id].clear()
                self.cnns[context._client_id].context = context
                self.cnns[context._client_id].cnn_flag = context._cnn_flag
            else:
                self.sys_info._total_clients += 1
                self.sys_info._active_clients += 1
                self.cnns[context._client_id] = mqtt3cnn(context)

            context._wait_pub_queue = self.cnns[context._client_id].wait_pub_queue
        else:
            if context._client_id in self.cnns:
                old_context = self.cnns[context._client_id].context
                if context is not old_context:
                    PollIOLoop.instance().add_callback(old_context.close_for_reconnect, context, clean)

                self.cnns[context._client_id].context = context
                self.cnns[context._client_id].cnn_flag = context._cnn_flag
                if not self.cnns[context._client_id].active:
                    self.cnns[context._client_id].active = True
                    self.sys_info._active_clients += 1
                    self.sys_info._inactive_clients -= 1
                context._wait_pub_queue = self.cnns[context._client_id].wait_pub_queue
            else:
                self.cnns[context._client_id] = mqtt3cnn(context)
                self.sys_info._active_clients += 1
                self.sys_info._total_clients += 1
                context._wait_pub_queue = self.cnns[context._client_id].wait_pub_queue
Пример #18
0
 def wait_pub_completed_timeout(self):
     if self._curr_pub_msg != None:
         return
     
     logging.info ("wait_pub_completed_timeout: resend_times ( %d) " % self._curr_pub_msg.resend_times)
     if self._curr_pub_msg.resend_times == 5:
         self.close()
     else:
         self._curr_pub_msg.resend()
         self._curr_pub_msg.timeout = PollIOLoop.instance().call_later(7, self.wait_pub_completed_timeout)
     return
Пример #19
0
 def ppmt_main(self):
     #print "Mqtt3 Broker start ......"
     
     logging.info("Mqtt3 Broker start ......")
     work_thread = worker(gMQbase.work_queue)
     send_thread = sender(gMQbase.send_queue)
     
     work_thread.start()
     send_thread.start()
     
     server = mqtt3server()    
     server.listen(1883)
     
     PollIOLoop.instance().start()   
     
     send_thread.join()
     work_thread.join()
     
     gMQbase.work_queue.join()
     gMQbase.send_queue.join()
     return
Пример #20
0
    def __init__(self):

        self.pub_root = mqtt3pub("/")
        self.sub_root = mqtt3sub("/")
        self.cnns = {}  # { client_id: mqtt3cnn }
        self.level = 0
        self.work_queue = Queue()
        self.send_queue = Queue()
        self.sys_info = sys_stat()
        self.update_sysinfo_timeout = PollIOLoop.instance().add_timeout(
            self.sys_info._timestamp + 15, self.update_sysinfo_callback
        )
Пример #21
0
 def initialize(self, **kwargs):
     PollIOLoop.initialize(self, impl=DebugPoller(), **kwargs)
Пример #22
0
 def instance():
     PollIOLoop.configure(DebugLoop)
     return PollIOLoop.instance()
Пример #23
0
    def __init__(self, stream, ppmtdb=gMQbase, auth=gAuth):
        self._ppmtdb = ppmtdb
        self._stream = stream
        self._auth = auth
        self._sock = None
        self._message_retry = 20
        self._last_retry_check = 0
        self._client_id = None
        self._will_topic = None
        self._will_message = None
        self._user_name = None
        self._password = None
        self._connect_state = mq_cs_new

        #       self._total_received_bytes = 0
        #       self._total_sent_bytes = 0

        self._pub_acl = None
        self._sub_acl = None

        #       self._semaphore = threading.BoundedSemaphore(1)
        #       self.res_queue = Queue() # result queue for worker thread
        self._wait_pub_queue = Queue(
        )  # wait to pubish with qos 1 or qos 2 message
        self._curr_pub_msg = None  # current publish message what waiting to be completed
        ''' for incoming packet from client '''
        self._msgtype = 0
        self._dup = False
        self._out_mid = 0
        self._last_mid = 0
        self._qos = 0
        self._retain = False
        self._username = ""
        self._password = ""
        self._buff = B""
        self._fixed_header_byte1 = 0
        self._len_bytes_count = 0
        self._error_code = 0

        self._keep_alive = 60
        self._timeout_handle = PollIOLoop.instance().call_later(
            1.5 * self._keep_alive, self.keep_alive_timeout)
        self._stream.set_close_callback(self.close_callback)

        # for remaining len
        self._multiplier = 1
        self._remaining_len = 0
        self._cnn_flag = 0

        self.handler = {
            MQTT3_CNNECT: lambda: self.mqtt3_connect_handler(),
            #                    MQTT3_CONNACK:   lambda: self.mqtt3_connack_handler(),
            MQTT3_PUBLISH: lambda: self.mqtt3_publish_handler(),
            MQTT3_PUBACK: lambda: self.mqtt3_puback_handler(),
            MQTT3_PUBREC: lambda: self.mqtt3_pubrec_handler(),
            MQTT3_PUBREL: lambda: self.mqtt3_pubrel_handler(),
            MQTT3_PUBCOMP: lambda: self.mqtt3_pubcomp_handler(),
            MQTT3_SUBSCRIBE: lambda: self.mqtt3_subscribe_handler(),
            #                    MQTT3_SUBACK:    lambda: self.suback_handler(),
            MQTT3_UNSUBSCRIBE: lambda: self.mqtt3_unsubscribe_handler(),
            #                    MQTT3_UNSUBACK:  lambda: self.unsuback_handler(),
            MQTT3_PINGREQ: lambda: self.mqtt3_pingreq_handler(),
            #                    MQTT3_PINGRESP:  lambda: self.pingresp_handler(),
            MQTT3_DISCONNCT: lambda: self.mqtt3_disconnect_handler()
        }

        self.mqtt3_recv_packet()
Пример #24
0
 def initialize(self, **kwargs):
     self.real_io_loop = PollIOLoop(make_current=False)  # type: ignore
     reactor = self.real_io_loop.run_sync(gen.coroutine(TornadoReactor))
     super(LayeredTwistedIOLoop, self).initialize(reactor=reactor, **kwargs)
     self.add_callback(self.make_current)
Пример #25
0
 def close_callback(self):
     PollIOLoop.instance().remove_timeout(self._timeout_handle)
     if self._connect_state == mq_cs_connected:
         logging.info(" close_callback --> device_id: %s " % (  self._client_id))
         self._ppmtdb.work_queue.put( (self._ppmtdb.set_inactive_cnn, (self,)) ) # put a set inactive task into queue
     return
Пример #26
0
    def __init__(self, stream, ppmtdb=gMQbase, auth=gAuth):
        self._ppmtdb = ppmtdb 
        self._stream = stream  
        self._auth = auth
        self._sock = None
        self._message_retry = 20
        self._last_retry_check = 0
        self._client_id = None
        self._will_topic = None
        self._will_message = None
        self._user_name = None
        self._password = None
        self._connect_state = mq_cs_new

#       self._total_received_bytes = 0
#       self._total_sent_bytes = 0

        self._pub_acl = None
        self._sub_acl = None

#       self._semaphore = threading.BoundedSemaphore(1)
#       self.res_queue = Queue() # result queue for worker thread
        self._wait_pub_queue = Queue() # wait to pubish with qos 1 or qos 2 message
        self._curr_pub_msg = None # current publish message what waiting to be completed

        ''' for incoming packet from client '''
        self._msgtype = 0
        self._dup = False
        self._out_mid = 0
        self._last_mid = 0
        self._qos = 0
        self._retain = False
        self._username = ""
        self._password = ""
        self._buff = B""
        self._fixed_header_byte1 = 0
        self._len_bytes_count = 0
        self._error_code = 0

        self._keep_alive = 60
        self._timeout_handle = PollIOLoop.instance().call_later(1.5 * self._keep_alive, self.keep_alive_timeout)
        self._stream.set_close_callback(self.close_callback)

        # for remaining len
        self._multiplier = 1
        self._remaining_len = 0
        self._cnn_flag = 0

        
        self.handler = { 
            MQTT3_CNNECT: lambda:self.mqtt3_connect_handler(),
            #                    MQTT3_CONNACK:   lambda: self.mqtt3_connack_handler(),
            MQTT3_PUBLISH:   lambda: self.mqtt3_publish_handler(),
            MQTT3_PUBACK:    lambda: self.mqtt3_puback_handler(),
            MQTT3_PUBREC:    lambda: self.mqtt3_pubrec_handler(),
            MQTT3_PUBREL:    lambda: self.mqtt3_pubrel_handler(),
            MQTT3_PUBCOMP:   lambda: self.mqtt3_pubcomp_handler(),
            MQTT3_SUBSCRIBE: lambda: self.mqtt3_subscribe_handler(),
            #                    MQTT3_SUBACK:    lambda: self.suback_handler(),
            MQTT3_UNSUBSCRIBE: lambda: self.mqtt3_unsubscribe_handler(),
            #                    MQTT3_UNSUBACK:  lambda: self.unsuback_handler(),
            MQTT3_PINGREQ:   lambda: self.mqtt3_pingreq_handler(),
            #                    MQTT3_PINGRESP:  lambda: self.pingresp_handler(),
            MQTT3_DISCONNCT: lambda: self.mqtt3_disconnect_handler()
            }

        self.mqtt3_recv_packet()  
Пример #27
0
 def resend_message(self):
     PollIOLoop.instance().add_callback(self.context.wait_pub_queue_handler_callback)
     return