-
Notifications
You must be signed in to change notification settings - Fork 1
/
inter_device_mqtt.ino
144 lines (111 loc) · 3.3 KB
/
inter_device_mqtt.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <WiFi.h>
#include <PubSubClient.h>
// Replace the next variables with your SSID/Password combination
const char* ssid = "Demo";
const char* password = "123123123";
char * sub_topic = "TEAM_0"; //This is YOU (Your team)
char * pub_topic = "202f76_SUB"; //This is THEM (Another team)
// Add your MQTT Broker IP address, example:
//const char* mqtt_server = "192.168.1.144";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
// LED Pin
const int ledPin = 2;
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(ledPin, OUTPUT);
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived from: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)topic[i]);
// messageTemp += (char)topic[i];
}
Serial.println();
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// Feel free to add more if statements to control more GPIOs with MQTT
// If a message is received on the topic esp32/output, you check if the message is either "on" or "off".
// Changes the output state according to the message
if (messageTemp == "on") {
Serial.println("on");
digitalWrite(ledPin, HIGH);
client.publish(pub_topic, "LED is ON");
}
else if (messageTemp == "off") {
Serial.println("off");
digitalWrite(ledPin, LOW);
// client.publish(pub_topic, "LED is OFF");
}
else {
Serial.println(messageTemp);
// client.publish(pub_topic, "off");
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
String mac = WiFi.macAddress();
char bufMAC[mac.length() + 2];
mac.toCharArray(bufMAC, mac.length());
if (client.connect(bufMAC)) {
Serial.println("connected");
// Subscribe
client.subscribe(sub_topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (Serial.available()) {
String recvString = Serial.readString();
if (recvString.indexOf("ON") >= 0) {
client.publish(pub_topic, "ON");
}
else if (recvString.indexOf("OFF") >= 0) {
client.publish(pub_topic, "OFF");
}
else {
char buf[recvString.length() + 2];
recvString.toCharArray(buf, recvString.length()+2);
client.publish(pub_topic, buf);
}
}
}