import logging import zmq from zmq.eventloop import ioloop from zmq.eventloop.zmqstream import ZMQStream from config import PUBLISHER_PORT, RECEIVER_PORT from util import parse_anchor_from_message, ZMQConnectorBase ioloop.install() class EventHandlerDownlinkConnector(ZMQConnectorBase): def __init__(self, zmq_context=None): super().__init__(zmq_context) self._zmq_pull_socket = self._zmq_context.socket(zmq.PULL) self._zmq_pull_stream = ZMQStream(self._zmq_pull_socket) address = 'tcp://*:{}'.format(RECEIVER_PORT) self._zmq_pull_socket.bind(address) logging.debug('Pull socket bound to {}'.format(address)) class EventHandlerUplinkConnector(ZMQConnectorBase): def __init__(self, zmq_context=None): super().__init__(zmq_context) self._zmq_pub_socket = self._zmq_context.socket(zmq.PUB) address = 'tcp://*:{}'.format(PUBLISHER_PORT) self._zmq_pub_socket.bind(address) logging.debug('Pub socket bound to {}'.format(address)) class EventHandlerConnector(EventHandlerDownlinkConnector, EventHandlerUplinkConnector): def __init__(self, zmq_context=None): self.downlink = EventHandlerDownlinkConnector(zmq_context) self.uplink = EventHandlerUplinkConnector(zmq_context) #EventHandlerDownlinkConnector.__init__(self, zmq_context) # TODO: solve this with multiple inheritance #EventHandlerUplinkConnector.__init__(self, zmq_context) def register_callback(self, callback): self.downlink._zmq_pull_stream.on_recv(callback) def send_message(self, message: str, anchor: str = None): if not anchor: anchor = parse_anchor_from_message(message) encoded_message = [part.encode('utf-8') for part in (anchor, message)] self.uplink._zmq_pub_socket.send_multipart(encoded_message) ehc = EventHandlerConnector()