Public MQTT Brokers

From Open Source Controls Wiki
Revision as of 19:49, 2 June 2022 by Rhg (talk | contribs)
Jump to navigation Jump to search

Cloud Based Implementation of IoT Using MQTT Brokers

This is a useful article that sums up the various MQTT options.

https://www.opensourceforu.com/2020/10/cloud-based-implementation-of-iot-using-mqtt-brokers/

When using public brokers, it is advised to consider encrypting traffic as standard. Both topics and payloads can be encrypted, with Node-RED providing nodes for such operations. Only devices that have the encryption key can find (subscribe) and make sense of the data.

The interesting question to ask is if public brokers are as good as a dedicated private broker.

Using public brokers has the following advantages:

  • A central list can be maintained (the table below can be loaded into software from this site)
  • With three or more brokers reliably available, one can establish primary and secondary routes, adding resilience and making for increased reliability
  • No maintenance, and no costs. A completely free approach to communications.
  • Data can be encrypted.
  • It is possible to share data by providing someone with encryption keys that lets them subscribe to data.

Public MQTT Brokers

Name Broker Address TCP Port TLS Port WebSocket Port Message Retention Persistent Session Sign Up Requred Link
Eclipse mqtt.eclipse.org 1883 N/A 80, 443 YES YES NO http://iot.eclipse.org/sandbox.html
Mosquitto test.mosquitto.org 1883 8883, 8884 80 YES YES NO https://test.mosquitto.org/
HiveMQ broker.hivemq.com 1883 N/A 8000 YES YES NO https://www.hivemq.com/try-out/
Flespi mqtt.flespi.io 1883 8883 80, 443 YES YES YES https://flespi.com/mqtt-broker
Dioty mqtt.dioty.co 1883 8883 8080, 8880 YES YES YES http://www.dioty.co/
Fluux mqtt.fluux.io 1883 8883 N/A N/A N/A NO https://fluux.io/
EMQX broker.emqx.io 1883 8883 8083 YES YES NO https://emqx.io/

EMQX Public MQTT 5 Broker


Node-RED Automation

Node-RED version 2 now allows one to manage MQTT subscriptions at run time through software, allowing the processes of encryption and subscribing to be automated.

Mqttcon1.png

[{"id":"564812e6529f65a5","type":"tab","label":"Flow 2","disabled":false,"info":"","env":[]},{"id":"a33ecb08689a7eb7","type":"mqtt in","z":"564812e6529f65a5","name":"mqtt1","topic":"","qos":"2","datatype":"auto","broker":"209b6731446a7c26","nl":false,"rap":true,"rh":0,"inputs":1,"x":810,"y":220,"wires":[["6c88cfc3c6f35ded"]]},{"id":"bc150d0459b9610b","type":"mqtt out","z":"564812e6529f65a5","name":"","topic":"","qos":"0","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"209b6731446a7c26","x":810,"y":520,"wires":[]},{"id":"97920119052172d3","type":"inject","z":"564812e6529f65a5","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"[{\"broker\":\"broker.emqx.io\",\"port\":8883,\"portTSL\":8883}]","payloadType":"json","x":190,"y":260,"wires":[["55272ae6e147c672"]]},{"id":"c8790f20c7b81ee6","type":"function","z":"564812e6529f65a5","name":"connect","func":"var brokers = flow.get(\"brokers\") || [];\n\nvar msg1 = {};\n\nmsg1.action = \"connect\";\nmsg1.broker = brokers[0];\nmsg1.broker.force=true;\n\nvar msg2 = {};\n\nmsg2.action = \"connect\";\nmsg2.broker = brokers[1];\nmsg2.broker.force=true;\n\n\nreturn [msg1,msg2];","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":260,"wires":[["a33ecb08689a7eb7"],["84911e40ee113652"]]},{"id":"55272ae6e147c672","type":"change","z":"564812e6529f65a5","name":"","rules":[{"t":"set","p":"brokers","pt":"flow","to":"[{\"broker\":\"broker.emqx.io\",\"port\":8883,\"portTSL\":8883},{\"broker\":\"mqtt.fluux.io\",\"port\":8883,\"portTSL\":8883}]","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":260,"wires":[["c8790f20c7b81ee6","735e31d28738772f"]]},{"id":"7a4bc93a4ad7fca6","type":"link in","z":"564812e6529f65a5","name":"connect","links":[],"x":225,"y":180,"wires":[["55272ae6e147c672"]]},{"id":"84911e40ee113652","type":"mqtt in","z":"564812e6529f65a5","name":"mqtt2","topic":"","qos":"2","datatype":"auto","broker":"dcd4fcb0c3ba9634","nl":false,"rap":true,"rh":0,"inputs":1,"x":810,"y":300,"wires":[["6c88cfc3c6f35ded"]]},{"id":"37622328e8ce31d5","type":"mqtt out","z":"564812e6529f65a5","name":"","topic":"","qos":"0","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"dcd4fcb0c3ba9634","x":930,"y":580,"wires":[]},{"id":"ae188866b99e9304","type":"function","z":"564812e6529f65a5","name":"","func":"\n\nflow.set(msg.status.source.name + \"status\",\"\"+msg.status.text);\n\nmsg.topic = msg.status.source.name + \"status\";\nmsg.payload = msg.status.text;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":980,"y":400,"wires":[["c95f8190f6df0cc0"]]},{"id":"b46bf8618475f23d","type":"status","z":"564812e6529f65a5","name":"","scope":["a33ecb08689a7eb7","84911e40ee113652"],"x":820,"y":400,"wires":[["ae188866b99e9304"]]},{"id":"c95f8190f6df0cc0","type":"debug","z":"564812e6529f65a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1130,"y":400,"wires":[]},{"id":"4bf70e392eca5550","type":"switch","z":"564812e6529f65a5","name":"","property":"mqtt1status","propertyType":"flow","rules":[{"t":"cont","v":".connected","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":630,"y":540,"wires":[["bc150d0459b9610b","02eaf674b24f20df"],["db9c6cba958073d0"]]},{"id":"db9c6cba958073d0","type":"switch","z":"564812e6529f65a5","name":"","property":"mqtt2status","propertyType":"flow","rules":[{"t":"cont","v":".connected","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":750,"y":620,"wires":[["37622328e8ce31d5"],["2876d1fe18c7557a"]]},{"id":"83eec79b9b452b33","type":"link in","z":"564812e6529f65a5","name":"publish","links":["f7be6a97d63cad07"],"x":185,"y":540,"wires":[["1b04abaf18045792"]]},{"id":"2876d1fe18c7557a","type":"function","z":"564812e6529f65a5","name":"not sent","func":"\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":940,"y":680,"wires":[[]]},{"id":"6c88cfc3c6f35ded","type":"link out","z":"564812e6529f65a5","name":"incoming","mode":"link","links":["63c5ee9dd5dd59aa"],"x":985,"y":260,"wires":[]},{"id":"63c5ee9dd5dd59aa","type":"link in","z":"564812e6529f65a5","name":"","links":["6c88cfc3c6f35ded"],"x":215,"y":720,"wires":[["37274bfdb40f80c8","c87ed47ca0b33e61"]]},{"id":"37274bfdb40f80c8","type":"debug","z":"564812e6529f65a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":390,"y":660,"wires":[]},{"id":"beb8f0fda6a53533","type":"credentials","z":"564812e6529f65a5","name":"","props":[{"value":"publicTopic","type":"msg"}],"x":330,"y":80,"wires":[["69f367686b656cb7"]]},{"id":"bf21787fde563136","type":"inject","z":"564812e6529f65a5","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":80,"wires":[["beb8f0fda6a53533"]]},{"id":"69f367686b656cb7","type":"change","z":"564812e6529f65a5","name":"","rules":[{"t":"set","p":"publicTopic","pt":"flow","to":"publicTopic","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":530,"y":80,"wires":[[]]},{"id":"1b04abaf18045792","type":"function","z":"564812e6529f65a5","name":"prefix","func":"\nmsg.payload = JSON.stringify({ \"topic\": msg.topic, \"payload\": msg.payload });\n\nmsg.topic = flow.get(\"publicTopic\") + \"/\" + msg.topic.split(\"/\")[3];\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":540,"wires":[["e388a8917e1a8a1f"]]},{"id":"e388a8917e1a8a1f","type":"encrypt","z":"564812e6529f65a5","name":"","algorithm":"AES","key":"aaabbbccc","x":460,"y":540,"wires":[["4bf70e392eca5550"]]},{"id":"735e31d28738772f","type":"delay","z":"564812e6529f65a5","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":420,"y":320,"wires":[["da72769bf2270a2e","7a497090087e6f05"]]},{"id":"da72769bf2270a2e","type":"function","z":"564812e6529f65a5","d":true,"name":"subscribe","func":"\nvar publicTopic  = flow.get(\"publicTopic\") || \"unknown\";\n\n\n\nvar msg1 = {};\n\nmsg1.action = \"subscribe\";\nmsg1.topic = [{\"topic\":publicTopic + \"/cmd\", \"qos\":0},{\"topic\":publicTopic + \"/set\", \"qos\":0}];\n\nvar msg2 = {};\n\nmsg2.action = \"subscribe\";\nmsg2.topic = [{\"topic\":publicTopic + \"/cmd\", \"qos\":0},{\"topic\":publicTopic + \"/set\", \"qos\":0}];\n\nif (flow.get(\"mqtt1status\").indexOf(\".connected\")<0) { msg1 = null; }\nif (flow.get(\"mqtt2status\").indexOf(\".connected\")<0) { msg2 = null; }\n\nreturn [msg1,msg2];","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":320,"wires":[["a33ecb08689a7eb7"],["84911e40ee113652"]]},{"id":"02eaf674b24f20df","type":"debug","z":"564812e6529f65a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":830,"y":480,"wires":[]},{"id":"c8383d21cfd1c1bb","type":"debug","z":"564812e6529f65a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":690,"y":720,"wires":[]},{"id":"7a497090087e6f05","type":"function","z":"564812e6529f65a5","d":true,"name":"subscribe","func":"\nvar publicTopic  = flow.get(\"publicTopic\") || \"unknown\";\n\n\n\nvar msg1 = {};\n\nmsg1.action = \"subscribe\";\nmsg1.topic = [{\"topic\":publicTopic + \"/#\", \"qos\":0}];\n\nvar msg2 = {};\n\nmsg2.action = \"subscribe\";\nmsg2.topic = [{\"topic\":publicTopic + \"/#\", \"qos\":0}];\n\nif (flow.get(\"mqtt1status\").indexOf(\".connected\")<0) { msg1 = null; }\nif (flow.get(\"mqtt2status\").indexOf(\".connected\")<0) { msg2 = null; }\n\nreturn [msg1,msg2];","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":380,"wires":[["a33ecb08689a7eb7"],["84911e40ee113652"]]},{"id":"c87ed47ca0b33e61","type":"decrypt","z":"564812e6529f65a5","name":"","algorithm":"AES","key":"aaabbbccc","x":360,"y":720,"wires":[["cbf3d192113bc4ac"]]},{"id":"cbf3d192113bc4ac","type":"function","z":"564812e6529f65a5","name":"prefix","func":"\nvar data = JSON.parse( msg.payload );\n\nmsg.payload = data.payload;\nmsg.topic = data.topic;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":510,"y":720,"wires":[["c8383d21cfd1c1bb"]]},{"id":"209b6731446a7c26","type":"mqtt-broker","name":"mqtt1","broker":"none","port":"1883","tls":"","clientid":"","autoConnect":false,"usetls":true,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""},{"id":"dcd4fcb0c3ba9634","type":"mqtt-broker","name":"mqtt2","broker":"none","port":"1883","tls":"","clientid":"","autoConnect":false,"usetls":true,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]