Changed to use domain name instead of IP address
Fork of IFTTT by
Diff: ifttt.cpp
- Revision:
- 0:4f7b5d6048b3
- Child:
- 1:4d2664ecc1e2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ifttt.cpp Fri Jul 10 21:43:50 2015 +0000 @@ -0,0 +1,174 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mbed.h" +#include "ifttt.h" +#include <string> + +#if 1 +#define DBG(x, ...) printf("[IFTTT : DBG]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__); +#define WARN(x, ...) printf("[IFTTT : WARN]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__); +#define ERR(x, ...) printf("[IFTTT : ERR]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__); +#else +#define DBG(x, ...) //wait_us(10); +#define WARN(x, ...) //wait_us(10); +#define ERR(x, ...) +#endif + +#if 1 +#define INFO(x, ...) printf("[IFTTT : INFO]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__); +#else +#define INFO(x, ...) +#endif + +// +// Initialize object with Event, Key, and valid socket. +// TODO: accept hostname parameter / implement DNS lookup +// +IFTTT::IFTTT(const char * event, const char * key, TCPSocketConnection * s) +{ + // Error Check + if(sizeof(event) > IFTTT_MAX_SIZE_EVENTNAME) { + ERR("Given event > IFTTT_MAX_SIZE_EVENTNAME, increase the max event string size in ifttt.h"); + } + if(sizeof(key) > IFTTT_MAX_SIZE_SECRETKEY) { + ERR("Given key > IFTTT_MAX_SIZE_SECRETKEY, increase the max secret key string size in ifttt.h"); + } + // Copy event name and secret key into object instance + strcpy(this->eventName,event); + strcpy(this->secretKey,key); + + // Set up Socket + if(NULL == s) { + WARN("Given Socket Pointer is NULL, will try opening a socket."); + } + this->socket = s; + + // Set up Host / Port + this->port = IFTTT_PORT; + this->host = IFTTT_IP; +} + +// +// Send data to maker.ifttt.org +// currently only uses GET requests, unsecured +// +bool +IFTTT::sendMaker( char * value1, char * value2, char * value3) +{ + // update internal pointers. If variable not given then pass an empty string + v1 = (NULL == value1)?"":value1; + v2 = (NULL == value2)?"":value2; + v3 = (NULL == value3)?"":value3; + int ret = post(); + DBG("Sending Data returned code : %d",ret); + return ret; +} + +// +// This function sends data to maker.ifttt.org via GET query commands +// return true on sucess, false on fail +// +bool IFTTT::get() +{ + // Connect to maker.ifttt.org + int retry = 0; + for(retry=0; retry<IFTTT_MAX_RETRY; retry++) { + int ret = this->socket->connect(this->host, this->port); + if(ret == 0) { + DBG("Successfully Connected socket to host"); + break ; + } + } + if(retry == IFTTT_MAX_RETRY) { + this->socket->close(); + ERR("Could not connect socket to host\r\n"); + return false; + } + + // Prep data to send + char str[IFTTT_MAX_SIZE_STRING] = {0}; + sprintf(str, "GET /trigger/%s/with/key/%s/?value1=%s&value2=%s&value3=%s HTTP/1.1\r\nHost: maker.ifttt.com\r\n\r\n",eventName,secretKey,v1,v2,v3); + DBG("String to send is:\n\r%s",str); + + // Send Data + DBG("Sending GET data..."); + int check = 0; + check = this->socket->send_all(str,sizeof(str)); + if(check) { + DBG("Sent Sucessfully %d bytes",check); + } else { + ERR("Sending failed"); + return false; + } + DBG("Waiting on reply ... \r\n"); + int ret = this->socket->receive(str,50); + str[ret]=0; + DBG("Received String : %s",str); + this->socket->close(); + + return true; +} + +//TODO: Implement +bool IFTTT::post() +{ + // Connect to maker.ifttt.org + int retry = 0; + for(retry=0; retry<IFTTT_MAX_RETRY; retry++) { + int ret = this->socket->connect(this->host, this->port); + if(ret == 0) { + DBG("Successfully Connected socket to host"); + break ; + } + } + if(retry == IFTTT_MAX_RETRY) { + this->socket->close(); + ERR("Could not connect socket to host\r\n"); + return false; + } + + // Prep data to send + char header[100] = {0}; + sprintf(header, "POST /trigger/%s/with/key/%s HTTP/1.1\r\n"); + const char * host = "Host: maker.ifttt.com\r\n"; + char contentLen[50] = {0}; + //sprintf(contentLen,"Content-Length: %s\r\n"); + const char * contentType = "Content-Type: application/json\r\n\r\n"; + char str[IFTTT_MAX_SIZE_STRING] = {0}; + //sprintf(str, "POST /trigger/%s/with/key/%s HTTP/1.1\r\nHost: maker.ifttt.com\r\nContent-Length: 50\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n{\"value1\":\"%s\",\"value2\":\"%s\",\"value3\":\"%s\"}\r\n\r\n",eventName,secretKey,v1,v2,v3); + int thingsize = 50; + sprintf(str, "POST /trigger/%s/with/key/%s HTTP/1.1\r\nHost: maker.ifttt.com\r\nContent-Length: %d\r\nContent-Type: application/json\r\n\r\n{\"value1\":\"%s\",\"value2\":\"%s\",\"value3\":\"data\"}\r\n",eventName,secretKey,thingsize,v1,v2,v3); + DBG("String to send is:\n\r%s",str); + + // Send Data + DBG("Sending POST data..."); + int check = 0; + check = this->socket->send_all(str,sizeof(str)); + if(check) { + DBG("Sent Sucessfully %d bytes",check); + } else { + ERR("Sending failed"); + return false; + } + DBG("Waiting on reply ... \r\n"); + int ret = this->socket->receive(str,50); + str[ret]=0; + DBG("Received String : %s",str); + this->socket->close(); + + return true; +}