View Source PintBroker 🍺
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:
- SSL connections
- QoS 1 and 2
- MQTT v5
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.