예제 #1
0
 async def publish_retained_messages_for_subscription(
         self, subscription, session):
     #       if self.logger.isEnabledFor(logging.DEBUG):
     #           self.logger.debug("Begin broadcasting messages retained due to subscription on '%s' from %s",
     #                             subscription[0], format_client_message(session=session))
     sub = subscription[0].split("/")
     handler = self._get_handler(session)
     async with anyio.create_task_group() as tg:
         for d_topic in self._retained_messages:
             topic = d_topic.split("/")
             self.logger.debug("matching : %s %s", d_topic, subscription[0])
             if match_topic(topic, sub):
                 self.logger.debug("%s and %s match", d_topic,
                                   subscription[0])
                 retained = self._retained_messages[d_topic]
                 await tg.spawn(
                     handler.mqtt_publish,
                     retained.topic,
                     retained.data,
                     subscription[1],
                     True,
                 )
     if self.logger.isEnabledFor(logging.DEBUG):
         self.logger.debug(
             "End broadcasting messages retained due to subscription on '%s' from %s",
             subscription[0],
             format_client_message(session=session),
         )
예제 #2
0
    async def _broadcast_loop(self):
        async with anyio.create_task_group() as tg:
            while True:
                broadcast = await self._broadcast_queue_r.receive()
                # self.logger.debug("broadcasting %r", broadcast)
                topic = broadcast["topic"]
                if isinstance(topic, str):
                    topic = topic.split("/")

                targets = {}
                for k_filter, subscriptions in self._subscriptions.items():
                    if match_topic(topic, k_filter):
                        for (target_session, qos) in subscriptions:
                            qos = max(
                                qos,
                                broadcast.get("qos", QOS_0),
                                targets.get(target_session, QOS_0),
                            )
                            targets[target_session] = qos

                for target_session, qos in targets.items():
                    if target_session.transitions.state == "connected":
                        if False and self.logger.isEnabledFor(logging.DEBUG):
                            self.logger.debug(
                                "broadcasting application message from %s on topic '%s' to %s",
                                format_client_message(
                                    session=broadcast["session"]),
                                broadcast["topic"],
                                format_client_message(session=target_session),
                            )
                        handler = self._get_handler(target_session)
                        await tg.spawn(
                            partial(
                                handler.mqtt_publish,
                                broadcast["topic"],
                                broadcast["data"],
                                qos,
                                retain=False,
                            ))
                    else:
                        if self.logger.isEnabledFor(logging.DEBUG):
                            self.logger.debug(
                                "retaining application message from %s on topic '%s' to client '%s'",
                                format_client_message(
                                    session=broadcast["session"]),
                                broadcast["topic"],
                                format_client_message(session=target_session),
                            )
                        retained_message = RetainedApplicationMessage(
                            broadcast["session"],
                            broadcast["topic"],
                            broadcast["data"],
                            qos,
                        )
                        await target_session.retained_messages.put(
                            retained_message)
예제 #3
0
 async def _dispatch(self, msg):
     t = msg.topic.split("/")
     for clients in list(self._subscriptions.values()):
         if not match_topic(t, clients.topic):
             continue
         for c in list(clients):
             if c._q is None:
                 continue
             if c._q.qsize() < QSIZE - 1:
                 await c._q.put(msg)
             else:
                 await c._q.put(None)
                 c._q = None
예제 #4
0
 async def _dispatch(self, msg):
     t = msg.topic.split('/')
     for topic, clients in list(self._subscriptions.items()):
         if not match_topic(t, clients.__topic):
             continue
         for c in list(clients):
             if c._q is None:
                 continue
             try:
                 async with anyio.fail_after(0.01):
                     await c._q.put(msg)
             except TimeoutError:
                 c._q = None
예제 #5
0
    async def _broadcast_loop(self):
        async with anyio.create_task_group() as tg:
            while True:
                broadcast = await self._broadcast_queue.get()
                self.logger.debug("broadcasting %r", broadcast)
                topic = broadcast['topic'].split('/')

                targets = {}
                for k_filter, subscriptions in self._subscriptions.items():
                    if match_topic(topic, k_filter):
                        for (target_session, qos) in subscriptions:
                            qos = max(qos, broadcast.get('qos', QOS_0),
                                      targets.get(target_session, QOS_0))
                            targets[target_session] = qos

                for target_session, qos in targets.items():
                    if target_session.transitions.state == 'connected':
                        if self.logger.isEnabledFor(logging.DEBUG):
                            self.logger.debug(
                                "broadcasting application message from %s on topic '%s' to %s",
                                format_client_message(
                                    session=broadcast['session']),
                                broadcast['topic'],
                                format_client_message(session=target_session))
                        handler = self._get_handler(target_session)
                        await tg.spawn(
                            partial(handler.mqtt_publish,
                                    broadcast['topic'],
                                    broadcast['data'],
                                    qos,
                                    retain=False))
                    else:
                        if self.logger.isEnabledFor(logging.DEBUG):
                            self.logger.debug(
                                "retaining application message from %s on topic '%s' to client '%s'",
                                format_client_message(
                                    session=broadcast['session']),
                                broadcast['topic'],
                                format_client_message(session=target_session))
                        retained_message = RetainedApplicationMessage(
                            broadcast['session'], broadcast['topic'],
                            broadcast['data'], qos)
                        await target_session.retained_messages.put(
                            retained_message)