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