Blame | Last modification | View Log | RSS feed
/*Long message ESP8266 MQTT exampleThis sketch demonstrates sending arbitrarily large messages in combinationwith the ESP8266 board/library.It connects to an MQTT server then:- publishes "hello world" to the topic "outTopic"- subscribes to the topic "greenBottles/#", printing out any messagesit receives. NB - it assumes the received payloads are strings not binary- If the sub-topic is a number, it publishes a "greenBottles/lyrics" messagewith a payload consisting of the lyrics to "10 green bottles", replacing10 with the number given in the sub-topic.It will reconnect to the server if the connection is lost using a blockingreconnect function. See the 'mqtt_reconnect_nonblocking' example for how toachieve the same result without blocking the main loop.To install the ESP8266 board, (using Arduino 1.6.4+):- Add the following 3rd party board manager under "File -> Preferences -> Additional Boards Manager URLs":http://arduino.esp8266.com/stable/package_esp8266com_index.json- Open the "Tools -> Board -> Board Manager" and click install for the ESP8266"- Select your ESP8266 in "Tools -> Board"*/#include <ESP8266WiFi.h>#include <PubSubClient.h>// Update these with values suitable for your network.const char* ssid = "........";const char* password = "........";const char* mqtt_server = "broker.mqtt-dashboard.com";WiFiClient espClient;PubSubClient client(espClient);long lastMsg = 0;char msg[50];int value = 0;void setup_wifi() {delay(10);// We start by connecting to a WiFi networkSerial.println();Serial.print("Connecting to ");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}randomSeed(micros());Serial.println("");Serial.println("WiFi connected");Serial.println("IP address: ");Serial.println(WiFi.localIP());}void callback(char* topic, byte* payload, unsigned int length) {Serial.print("Message arrived [");Serial.print(topic);Serial.print("] ");for (int i = 0; i < length; i++) {Serial.print((char)payload[i]);}Serial.println();// Find out how many bottles we should generate lyrics forString topicStr(topic);int bottleCount = 0; // assume no bottles unless we correctly parse a value from the topicif (topicStr.indexOf('/') >= 0) {// The topic includes a '/', we'll try to read the number of bottles from just after thattopicStr.remove(0, topicStr.indexOf('/')+1);// Now see if there's a number of bottles after the '/'bottleCount = topicStr.toInt();}if (bottleCount > 0) {// Work out how big our resulting message will beint msgLen = 0;for (int i = bottleCount; i > 0; i--) {String numBottles(i);msgLen += 2*numBottles.length();if (i == 1) {msgLen += 2*String(" green bottle, standing on the wall\n").length();} else {msgLen += 2*String(" green bottles, standing on the wall\n").length();}msgLen += String("And if one green bottle should accidentally fall\nThere'll be ").length();switch (i) {case 1:msgLen += String("no green bottles, standing on the wall\n\n").length();break;case 2:msgLen += String("1 green bottle, standing on the wall\n\n").length();break;default:numBottles = i-1;msgLen += numBottles.length();msgLen += String(" green bottles, standing on the wall\n\n").length();break;};}// Now we can start to publish the messageclient.beginPublish("greenBottles/lyrics", msgLen, false);for (int i = bottleCount; i > 0; i--) {for (int j = 0; j < 2; j++) {client.print(i);if (i == 1) {client.print(" green bottle, standing on the wall\n");} else {client.print(" green bottles, standing on the wall\n");}}client.print("And if one green bottle should accidentally fall\nThere'll be ");switch (i) {case 1:client.print("no green bottles, standing on the wall\n\n");break;case 2:client.print("1 green bottle, standing on the wall\n\n");break;default:client.print(i-1);client.print(" green bottles, standing on the wall\n\n");break;};}// Now we're done!client.endPublish();}}void reconnect() {// Loop until we're reconnectedwhile (!client.connected()) {Serial.print("Attempting MQTT connection...");// Create a random client IDString clientId = "ESP8266Client-";clientId += String(random(0xffff), HEX);// Attempt to connectif (client.connect(clientId.c_str())) {Serial.println("connected");// Once connected, publish an announcement...client.publish("outTopic", "hello world");// ... and resubscribeclient.subscribe("greenBottles/#");} else {Serial.print("failed, rc=");Serial.print(client.state());Serial.println(" try again in 5 seconds");// Wait 5 seconds before retryingdelay(5000);}}}void setup() {pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an outputSerial.begin(115200);setup_wifi();client.setServer(mqtt_server, 1883);client.setCallback(callback);}void loop() {if (!client.connected()) {reconnect();}client.loop();}