Arduino

Nodemcu MQTT 전송 및 수신.

샬룻 2017. 10. 22. 20:50




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