https://github.com/juggernaut/muqtti
Zero-dependency MQTTv5 broker in Java
https://github.com/juggernaut/muqtti
iot java java11 mqtt mqtt-broker
Last synced: about 1 month ago
JSON representation
Zero-dependency MQTTv5 broker in Java
- Host: GitHub
- URL: https://github.com/juggernaut/muqtti
- Owner: juggernaut
- License: mit
- Created: 2020-01-08T07:41:59.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2020-10-13T18:42:23.000Z (over 5 years ago)
- Last Synced: 2025-03-26T14:28:34.519Z (about 1 year ago)
- Topics: iot, java, java11, mqtt, mqtt-broker
- Language: Java
- Size: 162 KB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Muqtti
===
A zero-dependency [MQTT v5.0](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html) broker implementation in Java 11.
Features
---
* In-memory storage of QoS 1 messages
* Certificate-based Mutual TLS
* Most MQTT v5.0 features like:
* Shared subscriptions
* Message properties
* Flow control
* NACK packets
Not Supported
---
* QoS 2
* Retained messages
* AUTH packet
* Websockets
Use cases
---
* As a lightweight broker for local development
* Embedded broker for unit tests (JUnit rule coming soon)
* Extensible broker for custom authentication schemes
Getting Started
---
You'll need at least [Java 11](https://openjdk.java.net/projects/jdk/11/) to run Muqtti. The easiest way to get started is to download the [latest release](https://github.com/juggernaut/muqtti/releases/tag/v1.0.0) jar and run it:
```
java -jar muqtti-1.0.0.jar
```
Muqtti is a standard maven project, so you can also build from source using:
```
mvn -B package
```
Usage
---
Once you have Muqtti running, you can use pub/sub commands bundled with [mosquitto](https://mosquitto.org) as clients to Muqtti.
To subscribe:
```
mosquitto_pub -V 5 -t vehicles/teslas/1
```
To publish:
```
mosquitto_pub -V 5 -t vehicles/teslas/1 -m 'wake up'
```
*NOTE*: You'll need to specify `-V 5` because `mosquitto` tries to connect using MQTT 3.1.1 by default, and Muqtti only supports MQTT v5.0
### Shared subscriptions
An interesting addition to MQTT v5.0 is the concept of shared subscriptions. With shared subscriptions, you can have multiple clients subscribed
to the same topic filter and have messages load-balanced among the clients. You can test this feature out by running two separate
`mosquitto_sub` clients with the command line:
```
mosquitto_sub -V 5 -t '$share/group1/#'
```
Then publish messages to any topic - you should see the messages alternate between the clients. You can read more about shared subscriptions in
the [spec](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901250)
Configuration
---
Muqtti is configured using Java system properties.
### TLS
To enable TLS, pass it the following properties:
```
-Dmuqtti.port=8883 -Dmuqtti.certfile=/path/to/servercert.pem -Dmuqtti.keyfile=/path/to/server.pkcs8.private.key -Dmuqtti.cafile=/path/to/rootcacert.pem
```
These properties are equivalent to the `certfile`, `keyfile` and `cafile` configuration options in [mosquitto](https://mosquitto.org/man/mosquitto-conf-5.html)
Note that only PKCS#8 RSA private keys are supported - if you have keys generated by `openssl` you can converted them to PKCS#8 using:
```
openssl pkcs8 -topk8 -nocrypt -in -out
```
### Logging
Muqtti uses `java.util.logging` (aka j.u.l) that comes with the JDK. You can specify a custom logging.properties file using:
```
-Djava.util.logging.config.file=/path/to/custom-logging.properties
```
A logging configuration file that enables verbose logging is included in the repo as an example (`muqtti-logging-example.properties`)
Motivation
---
I've written my fair share of networked services professionally. However, all my projects were built on top of open source networking libraries
like the excellent [Netty Project](https://netty.io/). My goal was to create a project using only the standard JDK so I could delve into lower
level aspects like protocol encoding/decoding using `ByteBuffer`s and asynchronous I/O using `Selector`s.
It also demonstrates the power of the Java platform and shows its relevance even when it is losing popularity among the trendier tech demographics. This is not to say that the platform doesn't have its rough edges (hello, `SSLEngine`), but overall, it provides a solid base for programmers to build software of moderate-to-high complexity without having to tear their hair out.
Scale-out MQTT v5.0 broker
---
If you're looking for a horizontally scalable, easily deployable (in the cloud or on-prem) MQTT v5.0 broker that plays well with Kubernetes, contact me
at lokare.ameya@gmail.com