Nodemcu MQTT 전송 및 수신.
MQTT 프로토콜을 테스트를 하고 싶었고, Artik Cloud를 간단하게 사용하고 싶었다.
Artik Cloud 공식 사이트에서는 Artik 보드를 사용하라고 하지만.. 아직 보급할 가격은 아닌 것 같다.(Artik053이 4~5만원?)
본인은 7천원 하는 Nodemcu로 테스트 할것이고...
Nodemcu 에서 Artik cloud(MQTT 브로커)로 데이터를 전송할 것이다.
준비물
1. Artik Cloud 가입 및 보드 설정.
2. Nodemcu
3. MQTT 브로커로 전송할 간단한 센서(습온도 센서 ?)
1, 3은 최근 포스팅에 있다.
Source Code로 설명하자면
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
// DHT11 Sensor Setting
#define DHTPIN D5 // Connects DHT11 Sensor Output to NodeMcu PIN D5
#define DHTTYPE DHT11 // etc.. DHT22/ DH11
char s_jsonBuf[200]; // Json Data to Artik Cloud
DHT s_dht(DHTPIN, DHTTYPE);
//WIFI Setting
const char* _SSID = "WIFI_NAME"; //Wi-Fi SSID
const char* _PASSWORD = "WIFI_PW"; // Wi-Fi Password
WiFiClientSecure SSL_ESP_Client; // ESP SSL Connection to Artik cloud
// MQTT - Artik Cloud Server params
char s_ArtikURL[] = "api.artik.cloud"; // Server
int s_ArtikPublishPort = 8883; // MQTT Port
char s_clientName[] = "DH11 DEVICE"; // Any Name
char s_Device_ID[] = "DEVICE_ID"; // DEVICE ID
char s_Device_TOKEN[] = "DEVICE_TOKEN"; // DEVICE TOKEN
char s_mqttPublish[] = "/v1.1/messages/DEVICE_ID"; // (/v1.1/messages/"DEVICE ID")
char s_mqttActions[] = "/v1.1/actions/DEVICE_ID"; // (/v1.1/messages/"DEVICE ID")
MQTTClient s_MQTTArtikClient; // MQTT Protocol
unsigned long s_time;
void setup() {
s_dht.begin();
delay(1000);
Serial.begin(115200);
// Wifi Setting
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());
s_MQTTArtikClient.begin(s_ArtikURL, s_ArtikPublishPort, SSL_ESP_Client); // Connect to Artik Server
while (!s_MQTTArtikClient.connect(s_clientName, s_Device_ID, s_Device_TOKEN)) { // Connect to Artik IOT Device
Serial.print("*");
delay(1000);
}
s_MQTTArtikClient.subscribe(s_mqttActions);
s_MQTTArtikClient.onMessage(messageReceived);
s_time = 0;
}
void loadBuffer() {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& dataPair = jsonBuffer.createObject();
dataPair["temperature"] = s_dht.readTemperature();
dataPair["humidity"] = s_dht.readHumidity();
dataPair.printTo(s_jsonBuf, sizeof(s_jsonBuf));
Serial.println(s_jsonBuf);
}
void loop() {
if ((millis() - s_time) > 30000)
{
s_time = millis();
loadBuffer();
s_MQTTArtikClient.publish(s_mqttPublish, s_jsonBuf);
Serial.println("Publishing..");
}
s_MQTTArtikClient.loop();
}
void messageReceived(String &topic, String &payload) {
Serial.println("Received: " + topic + " - " + payload);
}
Line 6 : // DHT11 Sensor Setting
온습도센서에 대한 Pin 설정과 JSON Buffer 변수가 있다.
Line 12 : //WIFI Setting
자신이 쓸 수 있는 WIFI에 대한 이름과 패스워드 설정 부분이다.
Line 15 : WiFiClientSecure SSL_ESP_Client; // ESP SSL Connection to Artik cloud
Artik Cloud는 SSL 암호화 방식을 무조건 사용해야 한다.
만일, WiFiClientSecure에서 WiFiClient으로 바꿔서 사용하면 Artik Cloud와 연결이 안된다.
Line 17 : // MQTT - Artik Cloud Server params
Artik Cloud에 대한 정보 부분 이다.
DEVICE_ID, DEVICE_TOKEN정보는 Artik Cloud 사이트에서 확인 하면 된다.
Line 44 : s_MQTTArtikClient.begin(s_ArtikURL, s_ArtikPublishPort, SSL_ESP_Client); // Connect to Artik Server
Artik Cloud와 연결하는 부분이다.
Line 49 : s_MQTTArtikClient.subscribe(s_mqttActions);
Line 50 : s_MQTTArtikClient.onMessage(messageReceived);
subscribe을 등록하고 messageReceived 콜백함수를 등록 한다.
Line 65 : if ((millis() - s_time) > 30000)
30초마다
Line 55 : void loadBuffer() {
함수를 호출하여 Artik Cloud 서버로 전송한다.
위 작업을 하게 되면 Nodemcu는 30초마다 Artik Cloud로 Publish 한다.
아래의 Arduino Serial Log를 볼 수 있다.
Artik Cloud 사이트를 접속하면 현재 나의 Device는 Online으로 표시확인 가능.
Data Logs로 가면 데이터의 상세 로그 확인 가능.
Charts에서 CHARTS에 온도와 습도를 체크하면 그래프로도 볼 수 있다.
추후에.. subscribe 사용법 추가 예정.
레퍼런스
Arduino MQTT
https://github.com/256dpi/arduino-mqtt
Arduino Time
https://www.arduino.cc/en/Reference/Millis
Artik Cloud developers.
link : https://developer.artik.cloud/documentation/data-management/mqtt.html