#include <MQTTClient.h>
#include <ArduinoJson.h>
#include <SPI.h>
#include <WiFi101.h>
const char* _SSID = "_SSID"; //Wi-Fi SSID
const char* _PASSWORD = "_PASSWORD"; // Wi-Fi Password
// MQTT - Artik Cloud Server params
char Artik_Cloud_Server[] = "api.artik.cloud"; // Server
int Artik_Cloud_Port = 8883; // MQTT Port
char Client_Name[] = "train"; // Any Name
char Device_ID[] = "Device_ID"; // DEVICE ID
char Device_TOKEN[] = "Device_TOKEN"; // DEVICE TOKEN
char MQTT_Publish[] = "/v1.1/messages/Device_ID"; // (/v1.1/messages/"DEVICE ID")
char MQTT_Subscription[] = "/v1.1/actions/Device_ID"; // (/v1.1/actions/"DEVICE ID")
char buf[200]; // Json Data to Artik Cloud
char receivebuf[200]; // Json Data receive from Artik Cloud
WiFiSSLClient client; //must use SSL client when MQTT protocol
MQTTClient MQTT_Artik_Client; // MQTT Protocol
//led SET
const int BROADLEDPin = 6; //use on broad led to show seat state, LED on have seat/ off seat is full
//data ram
int haveseat; //1:have seat / 0: no seat
void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
Serial.print("incoming: ");
Serial.print(topic);
Serial.print(" - ");
Serial.print(payload);
Serial.println();
String t = topic;
if(t == MQTT_Subscription) // check DEVICE ID
{
parseBuffer(payload);
}
}
void setup() {
Serial.begin(57600);
// 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());
MQTT_Artik_Client.begin(Artik_Cloud_Server, Artik_Cloud_Port, client); // Connect to Artik Server
while (!MQTT_Artik_Client.connect(Client_Name, Device_ID, Device_TOKEN)) { // Connect to Artik IOT Device
Serial.print("*");
delay(1000);
}
MQTT_Artik_Client.subscribe(MQTT_Subscription);//set subscribe
//power on setting
pinMode(BROADLEDPin, OUTPUT);
digitalWrite(BROADLEDPin, HIGH);
haveseat=1; //default seat is empty
loadBuffer();
MQTT_Artik_Client.publish(MQTT_Publish, buf);// Publishing data to the Artik Cloud
Serial.println("Publishing..");
}
void loadBuffer(void) {//load function, make data to json form
StaticJsonBuffer<200> jsonBuffer;
/*
* smaple field
* {"have_seat":1}
*/
//creat field data make it short or ARTIK cloud not work
JsonObject& dataPair = jsonBuffer.createObject();
dataPair["have_seat"]=haveseat;
dataPair.printTo(buf, sizeof(buf));
Serial.println(buf);
}
void parseBuffer(String _payload) { //parse function
StaticJsonBuffer<200> jsonBuffer;
String json = _payload;
json.toCharArray(receivebuf,200); //chang string to char or json can't work
//*****************************
JsonObject& root = jsonBuffer.parseObject(receivebuf);
if (!root.success()) {
Serial.println("parseObject() failed");
}
//****************************
/*
*{"actions":[{"name":"seaton","parameters":{"s1":1}}]}
*/
int seatstate = root["actions"][0]["parameters"]["s1"]; //parse data from receive buffer, as sample show above seatstate will be 1 or 0 after string {"s1":
if(seatstate == 1) //seat full, LED off
{
digitalWrite(BROADLEDPin, LOW); //LED off
haveseat=0;//clear haveseat flag and load it to buffer then publishing data to the Artik Cloud
loadBuffer();
MQTT_Artik_Client.publish(MQTT_Publish, buf);
Serial.println("Publishing..");
}
if(seatstate ==0 ) // have seat, LED on
{
digitalWrite(BROADLEDPin, HIGH); //LED on
haveseat=1; //set haveseat flag and load it to buffer then publishing data to the Artik Cloud
loadBuffer();
MQTT_Artik_Client.publish(MQTT_Publish, buf);
Serial.println("Publishing..");
}
}
void loop() {
for (int i =0; i<10;i++){ // delay 1 Mnts
MQTT_Artik_Client.loop(); //client loop
Serial.println(buf); //print buffer to check , can be remove to add performance
delay(6000);
}
}