# Learn MQTT with Go Learning MQTT with Golang by doing. This repo is a simple example of using a Golang application as a client (pub & sub) of an MQTT broker. 1883, Eclipse Mosquitto unsecured (opening the port on the internet is not recommended). ## Architecture ![mqtt-arch](./img/mqtt-architecture.svg) Ideally I would like this application to resemble the above design. Conceptually, there ## Development For local development we use [Mosquitto](https://mosquitto.org/) as our MQTT broker, with TLS enabled. ``` sudo apt install mosquitto-clients ``` First generate local development certs using: ``` make gen-local-tls-certs ``` This will create CA, server, and client certificates suitable for local development. Server and CA certs are created in `./.mosquitto/certs`. The client cert is create in the project root. Start the local development environment with: ``` make start-dev ``` Stop the local development environment with: ``` make stop-dev ``` ### Testing Unit tests can be run with: ``` make test ``` Integration tests are run via: ``` make test-integration ``` ## Usage To run the application end to end first start the development server: ``` make start-dev ``` Next we can start our subscriber. The following command connects to the TLS listener port. ``` go run cmd/subscriber/main.go --host 0.0.0.0 --port 8883 ``` ## Design Considerations See [DESIGN_CONCIDERATIONS.md](./DESIGN_CONCIDERATIONS.md) ## Resources: - [Mosquitto Docs](https://mosquitto.org/man/mosquitto-8.html) - [Mosquitto TLS Tutorial](https://cedalo.com/blog/mqtt-tls-configuration-guide/) - [Golang MQTT Tutorial](https://www.emqx.com/en/blog/how-to-use-mqtt-in-golang) - [MQTT as a Service](https://cedalo.com/mqtt-broker-pro-mosquitto/) - [Using Wireshark for MQTT Analysis](https://cedalo.com/blog/wireshark-mqtt-guide/) - [Caddy as reverse proxy](https://github.com/caddyserver/caddy) - [Using Python paho MQTT client with TLS](https://cedalo.com/blog/configuring-paho-mqtt-python-client-with-examples/) - [ESP32 Micropython MQTT with TLS](https://dev.to/bassparanoya/esp32-micropython-mqtt-tls-28fd): Note cert file format for uPy MQTT client needs to be in .der format which is a binary format. - [TLS refresher](http://www.steves-internet-guide.com/ssl-certificates-explained/) - [HA Mosquitto in K8s](https://sko.ai/blog/how-to-run-ha-mosquitto/) - [Lamport Timestamps Tutorial](https://towardsdatascience.com/understanding-lamport-timestamps-with-pythons-multiprocessing-library-12a6427881c6) - [Vector Clocks Lecture](https://www.youtube.com/watch?v=x-D8iFU1d-o)