February 12, 2017

Find the MQTT broker without an IP adress

If you, like me, like to built IoT devices based on ESP8266, you may use MQTT to send and receive messsages. One problem is to equip each device with the IP number of the MQTT broker. One solution is to add a simple management web server to the device and make it open a Wifi access point serving an admin page, when it is started the first time.

A better option is to use a service discovery protocol. The most popular protocol is known under the name mDNS, Avahi, Bonjour or Zeroconf. This protocol let you advertise the MQTT service on the local network and have your IoT devices find it without using an IP name or number.

Say that you run the MQTT broker Mosquitto at port 1883 on a Raspberry Pi.

Use nano to create a service description file:

sudo nano /etc/avahi/services/mosquitto.service

and paste the following text:

<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
 <name replace-wildcards="yes">Mosquitto MQTT server on %h</name>
  <service>
   <type>_mqtt._tcp</type>
   <port>1883</port>
   <txt-record>info=Publish, Publish! Read all about it! mqtt.org</txt-record>
  </service>

</service-group>

Save and exit with Ctrl-O <ENTER> Ctrl-X.

Now the Avahi daemon immediately advertises the mqtt service on your local network.
To see that it works, just open any service browser - I used Bonjour Browser from http://www.tildesoft.com/ on my Mac.

On the ESP8266 side, the following code example shows how to find the MQTT server ip and port.


#include <ESP8266mDNS.h>

...

if (!MDNS.begin("ESP")) { 
  Serial.println("Error setting up mDNS");
} else {
  Serial.println("mDNS setup finished");

  Serial.println("Sending mDNS Query");
  int n = MDNS.queryService("mqtt", "tcp");

  if (n == 0) {
    Serial.println("No service found");
  } else {
    // at least one MQTT service is found
    // ip no and port of the first one is MDNS.IP(0) and MDNS.port(0)
}

9 comments:

  1. Very helpful.. thanks much. Wonder if it is possible for my IOS code to also find the mqtt server automatically :)

    ReplyDelete
  2. Very informative blog... MQTT service was created with the goal of collecting data from many devices and then transporting that data to the IT infrastructure. Thanks

    ReplyDelete
  3. Great post! Is there a way to have this locator service run on a Windows host? All my remote PI hosts subscribe to the MQTT service running on windows. If I could publish the IP, I could move the MQTT service to another windows machine in case of failure.

    ReplyDelete
    Replies
    1. Sure you can run the service on windows - not as easy as on linux, though. See http://www.steves-internet-guide.com/install-mosquitto-broker/.

      Delete
  4. Cool stuff. Alternatively, you could just resolve your MQTT server's IP address by referring to its local address, e.g. mymqtt.local.
    I installed ZigBee2MQTT and Mosquitto on a Raspberry Pi that's connected to our office hotel's Wifi. It's paired with an IKEA ZigBee button in the lobby. We have an ESP8266 in our office (out of ZigBee range) that rings a doorbell whenever the button is pressed. Out of principle, I didn't want to bother the IT department with a request for a fixed IP address, which they would've either turned down or sent a hefty bill about. A nice bonus is that I can have my phone, thanks to MQTTAlert, also ring when the button is pressed. That's handy when I'm in a meeting room and can't hear the doorbell.

    ReplyDelete
  5. Cool! I like smart ways to circumvent IT bosses! You are right you could use the .local ip name if you have a fixed mqtt port number. ZigBee2MQTT is interesting! To use the reliable IKEA devices outside the original ecosystem.

    ReplyDelete
    Replies
    1. I can also recommend the devices from https://shop.shelly.cloud/. They are based on esp8266 and support many net protocols - even mqtt. The have cloud support, but you dont have to use it

      Delete
    2. Thanks for the tip. I have to say I've been steering clear of cloud-enabled Wifi smart devices after having a few lamps (with ESP8266s inside) turn on and off at will. Also, Matter is just around the corner. I suppose Zigbee devices are future-proof, since as long as the gateway supports Matter, they'll keep working.

      Delete