BaseMessage is a base class for all BCI Framework messages.
Every message should inherit this class. Every message has a :attribute:`sender` field.
To add more fields to your message you have to define them using a
class BrokerHelloMsg(BaseMessage): __TYPE__ = 'BROKER_HELLO' peer_url = Field(List[str], str) broker_url = Field(str)
Field class accepts a number of arguments: accepted types of this field. If you add None
to the types it will mean that this field is optional. During instantialization of the message fields are checked
for validity. All types should be serializable to JSON (the default serializer). If you need to have a message with
custom data you should provide
__TYPE__ is an optional attribute which you can provide if you need specific network header in the message (ex. external Peers in other langueges, etc). If you don’t provide it __TYPE__ will be autogenerated by converting message class name from CamelCase to snake_case.
eg: BrokerHelloMsg would be: broker_hello_msg
On the networking level every message is sent in 2 parts as ZMQ message/packet. First part is the header (ASCII): type_string^sender_id_string^, second part is the serialized data (JSON or your custom serialized data).
BCI Framework peers can send any message in one of two modes:
- broadcast mode - message is sent using
Peer.send_messageand delivered only to Peers that subscribed to such messages.
Peer.query- direct mode - message is send directly (using REQ-REP sockets) to some other peer or Broker.
Peers can subscribe to message type and register a handler for it by calling
or by decorating handler method with
Technically message is send using PUB socket connected to Broker’s XSUB socket and can received by SUB sockets inside peers that connect to Broker’s XPUB.