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함수를 통해 받을수 있는 데이터의 길이도 작으므로 푸시서버에서
긴 데이터를 전송한다면 문제가 될것이다. (즉, 큰 데이터는 수신 못할 가능성이 많음)