MQTT example for Industruino D21G
MQTT is a machine-to-machine (M2M)/"Internet of Things" connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport.
Here we will show a simple example using the Industruino as MQTT client over Ethernet, using this Arduino MQTT library: pubsubclient which is also available from the Arduino IDE library manager. The example sketch below shows the basic functions:
- connect to the MQTT broker over Ethernet as 'industruinoClient'
- send a hello message upon connection ('publish' in topic 'industruinoOutTopic')
- send a regular message with the Industruino 'on_time' (based on millis())
- receive a message and switch on/off the Industruino's LCD backlight ('subscribe' to topic 'industruinoInTopic')
For the purpose of this blog post, i installed a Mosquitto broker on my Linux laptop (packages mosquitto and mosquitto-clients; i had to also allow traffic on port 1883 via iptables); you don't need this if you're planning to use a public MQTT broker. You can also use this public test server as broker.
Below picture shows the broker log in the upper left window (sudo mosquitto), the publish commands in the upper right, a subscribe client to topic 'industruinoOutTopic' middle bottom (mosquitto_sub -t industruinoOutTopic), and the Arduino IDE Serial Monitor bottom right.
/* Basic MQTT example for Industruino D21G with Ethernet module based on the mqtt_basic example of the pubsubclient library This sketch demonstrates the basic capabilities of the library. It connects to an MQTT server as 'industruinoClient' - publishes "hello" to the topic "industruinoOutTopic" - publishes on_time to the topic "industruinoOutTopic" every 5 seconds - subscribes to the topic "industruinoInTopic", and switches on/off LCD backlight on 1/0 It will reconnect to the server if the connection is lost using a blocking reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to achieve the same result without blocking the main loop. */ #include <SPI.h> #include <Ethernet2.h> // Industruino version of Ethernet2 #include <PubSubClient.h> #include <UC1701.h> static UC1701 lcd; // Update these with values suitable for your network. byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; // or use Industruino unique MAC IPAddress ip(192, 168, 1, 199); IPAddress server(192, 168, 1, 121); EthernetClient ethClient; PubSubClient client(ethClient); unsigned long timestamp; // for regular publishing void setup() { SerialUSB.begin(115200); pinMode(26, OUTPUT); // LCD backlight digitalWrite(26, HIGH); lcd.begin(); lcd.print("Industruino MQTT demo"); SerialUSB.println("Industruino MQTT demo"); client.setServer(server, 1883); // client.setServer("test.mosquitto.org", 1883); // public test broker client.setCallback(callback); Ethernet.begin(mac, ip); SerialUSB.print("Ethernet started on IP: "); SerialUSB.println(Ethernet.localIP()); lcd.setCursor(0, 1); lcd.print("thisIP:"); lcd.print(Ethernet.localIP()); lcd.setCursor(0, 2); lcd.print("server:"); lcd.setCursor(0, 3); lcd.print(server); lcd.print(":1883"); } void loop() { if (millis() - timestamp > 5000) { // every 5 seconds do this if (!client.connected()) { reconnect(); } else { String message; message = "on_time(ms):"; message += String(millis()); SerialUSB.println("SENDING [industruinoOutTopic]: " + message); lcd.setCursor(0, 5); lcd.print("SENT " + message + " "); int len = message.length() + 1; char buf [len]; message.toCharArray(buf, len); client.publish("industruinoOutTopic", buf); // this function does not take String as parameter } timestamp = millis(); } client.loop(); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { SerialUSB.print("Attempting MQTT connection to server: "); SerialUSB.print(server); SerialUSB.print(" >>> "); lcd.setCursor(0, 5); lcd.print("connecting... "); // Attempt to connect if (client.connect("industruinoClient")) { SerialUSB.println("connected"); // Once connected, publish an announcement... client.publish("industruinoOutTopic", "hello from industruino"); lcd.setCursor(0, 5); lcd.print("SENT hello "); // ... and resubscribe client.subscribe("industruinoInTopic"); } else { SerialUSB.print("failed, rc="); SerialUSB.print(client.state()); SerialUSB.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void callback(char* topic, byte* payload, unsigned int length) { SerialUSB.print("RECEIVING ["); SerialUSB.print(topic); SerialUSB.print("]: "); lcd.setCursor(0, 5); lcd.print("RECEIVED "); for (int i = 0; i < length; i++) { SerialUSB.print((char)payload[i]); lcd.print((char)payload[i]); } lcd.print(" "); SerialUSB.println(); if ((char)payload[0] == '0') { digitalWrite(26, LOW); } if ((char)payload[0] == '1') { digitalWrite(26, HIGH); } }