1. 아두이노에서 푸시를 사용하기 위해서 MQTT 프로토콜을 구현한 클라이언트를 다운받는다.
– https://github.com/knolleary/pubsubclient
2. pubsubclient 라이브러리를 Import받고 아래와 같이 구현하면 된다.
#include "TemptClient.h"
#include
#include
void messageArrived(char* topic, byte* payload, unsigned int uIntLength);
PubSubClient gClsMqttClient(gpChrServer, 1883, messageArrived, gClsWfClient);
void messageArrived(char* topic, byte* payload, unsigned int uIntLength)
{
int intIndex = 0;
char pChrBuffer[uIntLength + 1];
for (intIndex = 0; intIndex < uIntLength; intIndex++)
{
pChrBuffer[intIndex] = payload[intIndex];
}
pChrBuffer[intIndex] = '\0';
String strPayload = String(pChrBuffer);
Serial.print("uIntLength:");
Serial.println(uIntLength);
Serial.print("strPayload:");
Serial.println(strPayload);
}
void getMacAddress(char * pChrMacAddress)
{
byte bytMacAddr[6];
WiFi.macAddress(bytMacAddr);
snprintf(pChrMacAddress, MAC_ADDRESS_LENGTH+1, "%02X%02X%02X%02X%02X%02X", bytMacAddr[0], bytMacAddr[1], bytMacAddr[2], bytMacAddr[3], bytMacAddr[4], bytMacAddr[5]);
}
void setup()
{
char pChrClientId[MAC_ADDRESS_LENGTH + 1];
char pChrTopic[TOPIC_LENGTH + 1];
Serial.begin(9600);
if (WiFi.status() == WL_NO_SHIELD)
{
Serial.println("WiFi shield not present");
while (true);
}
String strFwVersion = WiFi.firmwareVersion();
Serial.print("FirmWare:");
Serial.println(strFwVersion);
if (strFwVersion != "1.1.0" ) Serial.println("Please upgrade the firmware");
// 와이파이 네트워크 연결 시도
while (gIntWiFiStatus != WL_CONNECTED)
{
Serial.print("Attempting to connect to SSID: ");
Serial.println(gpChrSsid);
gIntWiFiStatus = WiFi.begin(gpChrSsid, gpChrPasswd);
delay(1000);
}
getMacAddress(pChrClientId);
if (gClsMqttClient.connect(pChrClientId))
{
sprintf(pChrTopic, "arduino/%s", pChrClientId);
// 메시지를 수신받을수 있도록 토픽을 구독한다.
gClsMqttClient.subscribe(pChrTopic);
// 메시지 퍼블리시(송신)
gClsMqttClient.publish("arduino/99B8020EC478", "{'test1':200,'test2':'{babo:xxxxxx,yahoo:bbbbb}'}");
}
}
3. 개발시 유의사항
퍼블리쉬할수 있는 데이터의 크기가 작기 때문에 실제 사용할때는 JSON또는 XML형태로 전송하는것은 이롭지 않은것 같다.
또한 위 소스상에 있는 messageArrived와 같은 CallBack함수를 통해 받을수 있는 데이터의 길이도 작으므로 푸시서버에서
긴 데이터를 전송한다면 문제가 될것이다. (즉, 큰 데이터는 수신 못할 가능성이 많음)