///
Search
🖲️

12주차 (보충)아두이노(ESP8266)에 MQTT 실행시키기

아두이노 실행하고 스케치 클릭 후 라이브러리 포함하기 다음 라이브러리 관리 클릭
실행화면
검색 창에 pubsubclient라고 검색해서 다운로드
MQTT 설치 할 때 예제로 배웠던 작업 mqtt_sub을 열고 아두이노 스케치에 파일 탭에서 예제 →PubSubClient→mqtt_esp8266 클릭
위의 예제를 통해서 나오는 소스 코드는 다음과 같다.
/* Basic ESP8266 MQTT example This sketch demonstrates the capabilities of the pubsub library in combination with the ESP8266 board/library. It connects to an MQTT server then: - publishes "hello world" to the topic "outTopic" every two seconds - subscribes to the topic "inTopic", printing out any messages it receives. NB - it assumes the received payloads are strings not binary - If the first character of the topic "inTopic" is an 1, switch ON the ESP Led, else switch it off 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. 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 = "wifiname"; const char* password = "wifipassword1234"; const char* mqtt_server = "192.168.0.41"; WiFiClient espClient; PubSubClient client(espClient); unsigned long lastMsg = 0; #define MSG_BUFFER_SIZE (50) char msg[MSG_BUFFER_SIZE]; int value = 0; void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); 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(); // Switch on the LED if an 1 was received as first character if ((char)payload[0] == '1') { digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level // but actually the LED is on; this is because // it is active low on the ESP-01) } else { digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("connected"); // Once connected, publish an announcement... client.publish("outTopic", "hello world"); // ... and resubscribe client.subscribe("inTopic"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); unsigned long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf (msg, MSG_BUFFER_SIZE, "hello world #%ld", value); Serial.print("Publish message: "); Serial.println(msg); client.publish("outTopic", msg); } }
Arduino
복사
위의 소스코드에서 우리가 바꿔줘야 하는 부분은 다음과 같다.
const char* ssid = "wifiname"; const char* password = "wifipassword1234"; const char* mqtt_server = "192.168.0.41";
Arduino
복사
wifiname 부분을 본인이 연결할 와이파이 이름으로 하고
wifipasword1234부분을 본인이 연결할 와이파이의 비밀번호를 입력한다.
그리고 마지막으로 mqtt server는 본인이 연결할 pc (window면 window, rasp 등등)의 ip를 입력한다.
본인의 pc의 ip를 모르겠다면 cmd 창에 ipconfig를 검색해 나오는 숫자를 작성한다.
필자는 iptime 공유기를 사용해서 192.168.0.41로 나온다.
그리고 이전에 실습한 mqtt client 단에서 한 작업에서 다음과 같은 명령어를 입력하여 실습을 해본다. (mqtt 수신자(구독자) 서버를 실행하는 작업)
mosquitto_sub –d –t outTopic
Arduino
복사
실행화면
그리고 소스코드를 돌려본다.
실행화면
정상적인면 mqtt 연결이 되야하는데 자꾸 이 문자만 출력이 되면 아직 MQTT 연결이 안되었다는 뜻이다.
Attempting MQTT connection...failed, rc=-2 try again in 5 seconds Attempting MQTT connection...failed, rc=-2 try again in 5 seconds Attempting MQTT connection...failed, rc=-2 try again in 5 seconds Attempting MQTT connection...failed, rc=-2 try again in 5 seconds Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
Arduino
복사
즉 윈도우와 아두이노는 mqtt 통신이 불가한 상태 방화벽을 추가로 없에는 작업과 포트를 여는 방법이 있으나, 이는 비추천 하고 라즈베리파이를 중간에 넣어서 통신하는 방식으로 수행한다.
그러기 위해 다음 글 2개를 남긴다.