Simple IoT Board用のIFTTTのMaker Channelに繋げるためのサンプルです。

Dependencies:   SimpleIoTBoardLib mbed

Committer:
jksoft
Date:
Sun Nov 15 13:44:04 2015 +0000
Revision:
0:8459cf3d30f7
??

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:8459cf3d30f7 1 /* mbed Microcontroller Library
jksoft 0:8459cf3d30f7 2 * Copyright (c) 2006-2013 ARM Limited
jksoft 0:8459cf3d30f7 3 *
jksoft 0:8459cf3d30f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
jksoft 0:8459cf3d30f7 5 * you may not use this file except in compliance with the License.
jksoft 0:8459cf3d30f7 6 * You may obtain a copy of the License at
jksoft 0:8459cf3d30f7 7 *
jksoft 0:8459cf3d30f7 8 * http://www.apache.org/licenses/LICENSE-2.0
jksoft 0:8459cf3d30f7 9 *
jksoft 0:8459cf3d30f7 10 * Unless required by applicable law or agreed to in writing, software
jksoft 0:8459cf3d30f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
jksoft 0:8459cf3d30f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
jksoft 0:8459cf3d30f7 13 * See the License for the specific language governing permissions and
jksoft 0:8459cf3d30f7 14 * limitations under the License.
jksoft 0:8459cf3d30f7 15 */
jksoft 0:8459cf3d30f7 16
jksoft 0:8459cf3d30f7 17 #include "mbed.h"
jksoft 0:8459cf3d30f7 18 #include "ifttt.h"
jksoft 0:8459cf3d30f7 19 //#include <string>
jksoft 0:8459cf3d30f7 20 #include "SoftSerialSendOnry.h"
jksoft 0:8459cf3d30f7 21
jksoft 0:8459cf3d30f7 22 extern SoftSerialSendOnry pc;
jksoft 0:8459cf3d30f7 23
jksoft 0:8459cf3d30f7 24 #if 0
jksoft 0:8459cf3d30f7 25 #define DBG(x, ...) pc.printf("[IFTTT : DBG]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
jksoft 0:8459cf3d30f7 26 #define WARN(x, ...) pc.printf("[IFTTT : WARN]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
jksoft 0:8459cf3d30f7 27 #define ERR(x, ...) pc.printf("[IFTTT : ERR]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
jksoft 0:8459cf3d30f7 28 #else
jksoft 0:8459cf3d30f7 29 #define DBG(x, ...) //wait_us(10);
jksoft 0:8459cf3d30f7 30 #define WARN(x, ...) //wait_us(10);
jksoft 0:8459cf3d30f7 31 #define ERR(x, ...)
jksoft 0:8459cf3d30f7 32 #endif
jksoft 0:8459cf3d30f7 33
jksoft 0:8459cf3d30f7 34 #if 0
jksoft 0:8459cf3d30f7 35 #define INFO(x, ...) pc.printf("[IFTTT : INFO]"x" \r\n",##__VA_ARGS__);
jksoft 0:8459cf3d30f7 36 #else
jksoft 0:8459cf3d30f7 37 #define INFO(x, ...)
jksoft 0:8459cf3d30f7 38 #endif
jksoft 0:8459cf3d30f7 39
jksoft 0:8459cf3d30f7 40 //
jksoft 0:8459cf3d30f7 41 // Initialize object with Event, Key, and valid socket.
jksoft 0:8459cf3d30f7 42 // TODO: accept hostname parameter / implement DNS lookup
jksoft 0:8459cf3d30f7 43 //
jksoft 0:8459cf3d30f7 44 IFTTT::IFTTT(const char * event, const char * key, TCPSocketConnection * s)
jksoft 0:8459cf3d30f7 45 {
jksoft 0:8459cf3d30f7 46 // Error Check
jksoft 0:8459cf3d30f7 47 if(sizeof(event) > IFTTT_MAX_SIZE_EVENTNAME) {
jksoft 0:8459cf3d30f7 48 ERR("Given event > IFTTT_MAX_SIZE_EVENTNAME, increase the max event string size in ifttt.h");
jksoft 0:8459cf3d30f7 49 }
jksoft 0:8459cf3d30f7 50 if(sizeof(key) > IFTTT_MAX_SIZE_SECRETKEY) {
jksoft 0:8459cf3d30f7 51 ERR("Given key > IFTTT_MAX_SIZE_SECRETKEY, increase the max secret key string size in ifttt.h");
jksoft 0:8459cf3d30f7 52 }
jksoft 0:8459cf3d30f7 53 // Copy event name and secret key into object instance
jksoft 0:8459cf3d30f7 54 strcpy(this->eventName,event);
jksoft 0:8459cf3d30f7 55 strcpy(this->secretKey,key);
jksoft 0:8459cf3d30f7 56
jksoft 0:8459cf3d30f7 57 // Set up Socket
jksoft 0:8459cf3d30f7 58 if(NULL == s) {
jksoft 0:8459cf3d30f7 59 WARN("Given Socket Pointer is NULL, will try opening a socket.");
jksoft 0:8459cf3d30f7 60 }
jksoft 0:8459cf3d30f7 61 this->socket = s;
jksoft 0:8459cf3d30f7 62
jksoft 0:8459cf3d30f7 63 // Set up Host / Port
jksoft 0:8459cf3d30f7 64 this->port = IFTTT_PORT;
jksoft 0:8459cf3d30f7 65 this->host = IFTTT_IP;
jksoft 0:8459cf3d30f7 66
jksoft 0:8459cf3d30f7 67 // Initialize ingredient values to empty strings.
jksoft 0:8459cf3d30f7 68 v1 = "";
jksoft 0:8459cf3d30f7 69 v2 = "";
jksoft 0:8459cf3d30f7 70 v3 = "";
jksoft 0:8459cf3d30f7 71 }
jksoft 0:8459cf3d30f7 72
jksoft 0:8459cf3d30f7 73 //
jksoft 0:8459cf3d30f7 74 // Add ingredients to be sent.
jksoft 0:8459cf3d30f7 75 //
jksoft 0:8459cf3d30f7 76 bool
jksoft 0:8459cf3d30f7 77 IFTTT::addIngredients( char * value1, char * value2, char * value3)
jksoft 0:8459cf3d30f7 78 {
jksoft 0:8459cf3d30f7 79 // update internal pointers. If variable not given then pass an empty string
jksoft 0:8459cf3d30f7 80 v1 = (NULL == value1)?"":value1;
jksoft 0:8459cf3d30f7 81 v2 = (NULL == value2)?"":value2;
jksoft 0:8459cf3d30f7 82 v3 = (NULL == value3)?"":value3;
jksoft 0:8459cf3d30f7 83 return true;
jksoft 0:8459cf3d30f7 84 }
jksoft 0:8459cf3d30f7 85
jksoft 0:8459cf3d30f7 86 //
jksoft 0:8459cf3d30f7 87 // This function sends data to maker.ifttt.org via GET query commands
jksoft 0:8459cf3d30f7 88 // return true on sucess, false on fail
jksoft 0:8459cf3d30f7 89 //
jksoft 0:8459cf3d30f7 90 bool IFTTT::get()
jksoft 0:8459cf3d30f7 91 {
jksoft 0:8459cf3d30f7 92 // Connect to maker.ifttt.org
jksoft 0:8459cf3d30f7 93 int retry = 0;
jksoft 0:8459cf3d30f7 94 for(retry=0; retry<IFTTT_MAX_RETRY; retry++) {
jksoft 0:8459cf3d30f7 95 int ret = this->socket->connect(this->host, this->port);
jksoft 0:8459cf3d30f7 96 if(ret == 0) {
jksoft 0:8459cf3d30f7 97 DBG("Successfully Connected socket to host");
jksoft 0:8459cf3d30f7 98 break ;
jksoft 0:8459cf3d30f7 99 }
jksoft 0:8459cf3d30f7 100 }
jksoft 0:8459cf3d30f7 101 if(retry == IFTTT_MAX_RETRY) {
jksoft 0:8459cf3d30f7 102 this->socket->close();
jksoft 0:8459cf3d30f7 103 ERR("Could not connect socket to host\r\n");
jksoft 0:8459cf3d30f7 104 return false;
jksoft 0:8459cf3d30f7 105 }
jksoft 0:8459cf3d30f7 106
jksoft 0:8459cf3d30f7 107 // Prep data to send
jksoft 0:8459cf3d30f7 108 // TODO: verify / modify data to be query string compliant (convert spaces to '+', convert non-alpha-numberic characters to the proper encoding... etc)
jksoft 0:8459cf3d30f7 109 char str[IFTTT_MAX_SIZE_STRING] = {0};
jksoft 0:8459cf3d30f7 110 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);
jksoft 0:8459cf3d30f7 111 DBG("String to send is:\n\r%s",str);
jksoft 0:8459cf3d30f7 112
jksoft 0:8459cf3d30f7 113 // Send Data
jksoft 0:8459cf3d30f7 114 DBG("Sending GET data...");
jksoft 0:8459cf3d30f7 115 int check = 0;
jksoft 0:8459cf3d30f7 116 check = this->socket->send_all(str,sizeof(str));
jksoft 0:8459cf3d30f7 117 if(check) {
jksoft 0:8459cf3d30f7 118 DBG("Sent Sucessfully %d bytes",check);
jksoft 0:8459cf3d30f7 119 } else {
jksoft 0:8459cf3d30f7 120 ERR("Sending failed");
jksoft 0:8459cf3d30f7 121 return false;
jksoft 0:8459cf3d30f7 122 }
jksoft 0:8459cf3d30f7 123 DBG("Waiting on reply ... \r\n");
jksoft 0:8459cf3d30f7 124 int ret = this->socket->receive(str,50);
jksoft 0:8459cf3d30f7 125 str[ret]=0;
jksoft 0:8459cf3d30f7 126 DBG("Received String : %s",str);
jksoft 0:8459cf3d30f7 127 this->socket->close();
jksoft 0:8459cf3d30f7 128
jksoft 0:8459cf3d30f7 129 return true;
jksoft 0:8459cf3d30f7 130 }
jksoft 0:8459cf3d30f7 131
jksoft 0:8459cf3d30f7 132 //
jksoft 0:8459cf3d30f7 133 // This function sends JSON encoded data encoded in a POST packet,
jksoft 0:8459cf3d30f7 134 //
jksoft 0:8459cf3d30f7 135 bool IFTTT::post()
jksoft 0:8459cf3d30f7 136 {
jksoft 0:8459cf3d30f7 137 // Connect to maker.ifttt.org
jksoft 0:8459cf3d30f7 138 int retry = 0;
jksoft 0:8459cf3d30f7 139 for(retry=0; retry<IFTTT_MAX_RETRY; retry++) {
jksoft 0:8459cf3d30f7 140 int ret = this->socket->connect(this->host, this->port);
jksoft 0:8459cf3d30f7 141 if(ret == 0) {
jksoft 0:8459cf3d30f7 142 DBG("Successfully Connected socket to host");
jksoft 0:8459cf3d30f7 143 break ;
jksoft 0:8459cf3d30f7 144 }
jksoft 0:8459cf3d30f7 145 }
jksoft 0:8459cf3d30f7 146 if(retry == IFTTT_MAX_RETRY) {
jksoft 0:8459cf3d30f7 147 this->socket->close();
jksoft 0:8459cf3d30f7 148 ERR("Could not connect socket to host\r\n");
jksoft 0:8459cf3d30f7 149 return false;
jksoft 0:8459cf3d30f7 150 }
jksoft 0:8459cf3d30f7 151
jksoft 0:8459cf3d30f7 152 // Prep data to send, the Assembled POST packet should look like this
jksoft 0:8459cf3d30f7 153 //
jksoft 0:8459cf3d30f7 154 //
jksoft 0:8459cf3d30f7 155 //POST /trigger/<eventName>/with/key/<secretKey> HTTP/1.1
jksoft 0:8459cf3d30f7 156 //Host: maker.ifttt.com
jksoft 0:8459cf3d30f7 157 //Content-Length: <length of POST data>
jksoft 0:8459cf3d30f7 158 //Content-Type: application/json
jksoft 0:8459cf3d30f7 159 //
jksoft 0:8459cf3d30f7 160 //{"value1":"<v1>","value2":"<v2>","value3":"<v3>"}
jksoft 0:8459cf3d30f7 161 //
jksoft 0:8459cf3d30f7 162 //
jksoft 0:8459cf3d30f7 163 char str[IFTTT_MAX_SIZE_STRING] = {0};
jksoft 0:8459cf3d30f7 164 char header[100] = {0};
jksoft 0:8459cf3d30f7 165 sprintf(header, "POST /trigger/%s/with/key/%s HTTP/1.1\r\n",eventName,secretKey);
jksoft 0:8459cf3d30f7 166 const char * host = "Host: maker.ifttt.com\r\n";
jksoft 0:8459cf3d30f7 167 char contentLen[50] = {0};
jksoft 0:8459cf3d30f7 168 const char * contentType = "Content-Type: application/json\r\n\r\n";
jksoft 0:8459cf3d30f7 169 char valueData [150] = {0};
jksoft 0:8459cf3d30f7 170 sprintf(valueData,"{\"value1\":\"%s\",\"value2\":\"%s\",\"value3\":\"%s\"}\r\n",v1,v2,v3);
jksoft 0:8459cf3d30f7 171 sprintf(contentLen,"Content-Length: %d\r\n",strlen(valueData));
jksoft 0:8459cf3d30f7 172 sprintf(str,"%s%s%s%s%s",header,host,contentLen,contentType,valueData);
jksoft 0:8459cf3d30f7 173
jksoft 0:8459cf3d30f7 174 DBG("String to send is:\n\r%s",str);
jksoft 0:8459cf3d30f7 175
jksoft 0:8459cf3d30f7 176 // Send Data
jksoft 0:8459cf3d30f7 177 DBG("Sending POST data...");
jksoft 0:8459cf3d30f7 178 int check = 0;
jksoft 0:8459cf3d30f7 179 check = this->socket->send_all(str,strlen(str));
jksoft 0:8459cf3d30f7 180 if(check) {
jksoft 0:8459cf3d30f7 181 DBG("Sent Sucessfully %d bytes",check);
jksoft 0:8459cf3d30f7 182 } else {
jksoft 0:8459cf3d30f7 183 ERR("Sending failed");
jksoft 0:8459cf3d30f7 184 return false;
jksoft 0:8459cf3d30f7 185 }
jksoft 0:8459cf3d30f7 186 DBG("Waiting on reply ... \r\n");
jksoft 0:8459cf3d30f7 187 int ret = this->socket->receive(str,IFTTT_MAX_SIZE_STRING);
jksoft 0:8459cf3d30f7 188 str[ret]=0;
jksoft 0:8459cf3d30f7 189 DBG("Received String : %s",str);
jksoft 0:8459cf3d30f7 190 this->socket->close();
jksoft 0:8459cf3d30f7 191
jksoft 0:8459cf3d30f7 192 return true;
jksoft 0:8459cf3d30f7 193 }
jksoft 0:8459cf3d30f7 194
jksoft 0:8459cf3d30f7 195 //
jksoft 0:8459cf3d30f7 196 // Send trigger and any values associated to maker.ifttt.com
jksoft 0:8459cf3d30f7 197 // currently unsecured (sends over HTTP, not https)
jksoft 0:8459cf3d30f7 198 //
jksoft 0:8459cf3d30f7 199 bool
jksoft 0:8459cf3d30f7 200 IFTTT::trigger(int triggerType)
jksoft 0:8459cf3d30f7 201 {
jksoft 0:8459cf3d30f7 202 int ret = 0;
jksoft 0:8459cf3d30f7 203 switch(triggerType) {
jksoft 0:8459cf3d30f7 204 case IFTTT_GET:
jksoft 0:8459cf3d30f7 205 DBG("Sending Data as GET request");
jksoft 0:8459cf3d30f7 206 ret = get();
jksoft 0:8459cf3d30f7 207 break;
jksoft 0:8459cf3d30f7 208 case IFTTT_POST:
jksoft 0:8459cf3d30f7 209 DBG("Sending Data as POST request");
jksoft 0:8459cf3d30f7 210 ret = post();
jksoft 0:8459cf3d30f7 211 break;
jksoft 0:8459cf3d30f7 212
jksoft 0:8459cf3d30f7 213 default:
jksoft 0:8459cf3d30f7 214 WARN("Invalid type, defaulting to sending data as POST request");
jksoft 0:8459cf3d30f7 215 ret = post();
jksoft 0:8459cf3d30f7 216 break;
jksoft 0:8459cf3d30f7 217 }
jksoft 0:8459cf3d30f7 218 DBG("Sending Data return code : %d",ret);
jksoft 0:8459cf3d30f7 219 if(ret){
jksoft 0:8459cf3d30f7 220 INFO("Successfully triggered event: '%s' with v1='%s', v2='%s', v3='%s' !",eventName,v1,v2,v3);
jksoft 0:8459cf3d30f7 221 }
jksoft 0:8459cf3d30f7 222 return ret;
jksoft 0:8459cf3d30f7 223 }