View Source PintBroker 🍺

CircleCI Hex version

A simple, pint-sized MQTT broker that can be used for testing and development

Warning

This is not indended for production use and makes no attempts for large connection scaling and handling. It is also not considered feature complete, but handles most simple use cases.

Supported:

  • Simple, unencrypted TCP connections
  • MQTT v3.1.1
    • QoS 0
    • Connect, publish, subscribe, and unsubscribe
    • Ping requests
    • Rule forwarding (see below)

Unsupported:

Rule forwarding

Many production setups will have a few topics with rules that forward messages to a handler such as an SQS queue or central service. This allows for scaling of many devices to communicate with a few nodes. For testing, you can specify rules when starting the broker which will forward Tortoise311.Package.Publish structs to a handler function or process in order to mimic this rule forwarding behavior. See PintBroker.add_rule/3 for more information.

Example:

iex> s = self()

iex> handler1 = fn pub -> send(s, pub) end

iex> PintBroker.start_link(rules: [{"my/+/test/topic", handler1}])
{:ok, #PID<0.226.0>}

# You can publish from the broker or another client
iex> PintBroker.publish("my/first/test/topic", "hello world")

iex> flush()
%Tortoise311.Package.Publish{
  __META__: %Tortoise311.Package.Meta{opcode: 3, flags: 0},
  identifier: nil,
  topic: "my/first/test/topic",
  payload: "hello world",
  qos: 0,
  dup: false,
  retain: false
}

Why another broker?

There are many full-featured MQTT brokers out there, but they require a lot of setup and configuration, maybe some dependencies, and tend to be overkill for testing of MQTT interactions between client and servers. I wanted the simplest possible broker which did not require a full ops team to implement a test environment that clients could connect to and publish/subscribe to topics for improved MQTT unit testing and local development of the whole system.