温度センサLM75BとWi-FiモジュールESP-WROOM-02をmbed LPC1114FN28に繋げて、温度をIFTTTのMaker Channelに出力するプログラム

Dependencies:   LM75B mbed

Committer:
jksoft
Date:
Sun May 15 11:47:02 2016 +0000
Revision:
0:53a512d5a7ba
??

Who changed what in which revision?

UserRevisionLine numberNew 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 }