seeedstudio ARCH GPRS Demo. post data to yeelink.

Dependencies:   mbed

Committer:
loovee
Date:
Fri Aug 23 02:31:06 2013 +0000
Revision:
0:6d297fe482af
seeedstudio Arch Gprs Demo. ; ; post data to yeelink.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loovee 0:6d297fe482af 1 /*
loovee 0:6d297fe482af 2 IOT_Mbed.cpp
loovee 0:6d297fe482af 3 2013 Copyright (c) Seeed Technology Inc. All right reserved.
loovee 0:6d297fe482af 4
loovee 0:6d297fe482af 5 Author:Loovee
loovee 0:6d297fe482af 6 2013-7-21
loovee 0:6d297fe482af 7
loovee 0:6d297fe482af 8 This library is free software; you can redistribute it and/or
loovee 0:6d297fe482af 9 modify it under the terms of the GNU Lesser General Public
loovee 0:6d297fe482af 10 License as published by the Free Software Foundation; either
loovee 0:6d297fe482af 11 version 2.1 of the License, or (at your option) any later version.
loovee 0:6d297fe482af 12
loovee 0:6d297fe482af 13 This library is distributed in the hope that it will be useful,
loovee 0:6d297fe482af 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
loovee 0:6d297fe482af 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
loovee 0:6d297fe482af 16 Lesser General Public License for more details.
loovee 0:6d297fe482af 17
loovee 0:6d297fe482af 18 You should have received a copy of the GNU Lesser General Public
loovee 0:6d297fe482af 19 License along with this library; if not, write to the Free Software
loovee 0:6d297fe482af 20 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
loovee 0:6d297fe482af 21 */
loovee 0:6d297fe482af 22 #include <stdio.h>
loovee 0:6d297fe482af 23
loovee 0:6d297fe482af 24 #include "mbed.h"
loovee 0:6d297fe482af 25 #include "tcp_yeelink.h"
loovee 0:6d297fe482af 26 #include "tcp_yeelink_dfs.h"
loovee 0:6d297fe482af 27 #include "i2c_uart.h"
loovee 0:6d297fe482af 28 #include "ARCH_GPRS_Sleep.h"
loovee 0:6d297fe482af 29
loovee 0:6d297fe482af 30
loovee 0:6d297fe482af 31 Serial serial1(P0_19, P0_18); // tx, rx
loovee 0:6d297fe482af 32 Timer tcnt;
loovee 0:6d297fe482af 33
loovee 0:6d297fe482af 34 void IOT_Mbed::init(char *postURL, char *APIKey)
loovee 0:6d297fe482af 35 {
loovee 0:6d297fe482af 36 serial1.baud(115200);
loovee 0:6d297fe482af 37 strcpy(yeelinkPostURL, postURL);
loovee 0:6d297fe482af 38 sprintf(yeelinkPostHeads, "U-ApiKey: %s\r\n", APIKey);
loovee 0:6d297fe482af 39 strcpy(yeelinkDns, "42.96.164.52"); // api.yeelink.net
loovee 0:6d297fe482af 40 sprintf(yeelinkPort, "%d", HTTP_DEFAULT_PORT);
loovee 0:6d297fe482af 41 }
loovee 0:6d297fe482af 42
loovee 0:6d297fe482af 43 void IOT_Mbed::callTest()
loovee 0:6d297fe482af 44 {
loovee 0:6d297fe482af 45 sendCmdAndWaitForRest("ATD:10086;\r\n", "OK", 10);
loovee 0:6d297fe482af 46 }
loovee 0:6d297fe482af 47
loovee 0:6d297fe482af 48 int IOT_Mbed::checkAT(int timeout)
loovee 0:6d297fe482af 49 {
loovee 0:6d297fe482af 50 return sendCmdAndWaitForRest("AT\r\n", "OK", timeout);
loovee 0:6d297fe482af 51 }
loovee 0:6d297fe482af 52
loovee 0:6d297fe482af 53 int IOT_Mbed::waitString(const char *str, int timeout) // time out : s
loovee 0:6d297fe482af 54 {
loovee 0:6d297fe482af 55 int len = strlen(str);
loovee 0:6d297fe482af 56 int sum=0;
loovee 0:6d297fe482af 57
loovee 0:6d297fe482af 58 tcnt.start(); // start timer
loovee 0:6d297fe482af 59
loovee 0:6d297fe482af 60 for(;;)
loovee 0:6d297fe482af 61 {
loovee 0:6d297fe482af 62 if(serial1.readable())
loovee 0:6d297fe482af 63 {
loovee 0:6d297fe482af 64 char c = serial1.getc();
loovee 0:6d297fe482af 65 DBG(c);
loovee 0:6d297fe482af 66 sum = (c==str[sum]) ? sum+1 : 0;
loovee 0:6d297fe482af 67 if(sum == len)break;
loovee 0:6d297fe482af 68 }
loovee 0:6d297fe482af 69
loovee 0:6d297fe482af 70 if(tcnt.read() > timeout) // time out
loovee 0:6d297fe482af 71 {
loovee 0:6d297fe482af 72 tcnt.stop();
loovee 0:6d297fe482af 73 tcnt.reset();
loovee 0:6d297fe482af 74
loovee 0:6d297fe482af 75 DBG("time out\r\n");
loovee 0:6d297fe482af 76 return ERRTOUT;
loovee 0:6d297fe482af 77 }
loovee 0:6d297fe482af 78
loovee 0:6d297fe482af 79 wdt_sleep.feed();
loovee 0:6d297fe482af 80 }
loovee 0:6d297fe482af 81
loovee 0:6d297fe482af 82 tcnt.stop(); // stop timer
loovee 0:6d297fe482af 83 tcnt.reset(); // clear timer
loovee 0:6d297fe482af 84
loovee 0:6d297fe482af 85 while(serial1.readable()) // display the other thing..
loovee 0:6d297fe482af 86 {
loovee 0:6d297fe482af 87 char c = serial1.getc();
loovee 0:6d297fe482af 88 DBG(c);
loovee 0:6d297fe482af 89 }
loovee 0:6d297fe482af 90
loovee 0:6d297fe482af 91 return 1;
loovee 0:6d297fe482af 92 }
loovee 0:6d297fe482af 93
loovee 0:6d297fe482af 94
loovee 0:6d297fe482af 95 int IOT_Mbed::sendCmdAndWaitForRest(char *dta, const char *resq, int timeout)
loovee 0:6d297fe482af 96 {
loovee 0:6d297fe482af 97 sendCmd(dta);
loovee 0:6d297fe482af 98 return waitString(resq, timeout);
loovee 0:6d297fe482af 99 }
loovee 0:6d297fe482af 100
loovee 0:6d297fe482af 101 void IOT_Mbed::sendCmd(char *dta)
loovee 0:6d297fe482af 102 {
loovee 0:6d297fe482af 103 serial1.printf("%s\r\n", dta);
loovee 0:6d297fe482af 104 }
loovee 0:6d297fe482af 105
loovee 0:6d297fe482af 106 int IOT_Mbed::connectTCP()
loovee 0:6d297fe482af 107 {
loovee 0:6d297fe482af 108
loovee 0:6d297fe482af 109 sendCmdAndWaitForRest("ATE0\r\n", "OK", 3);
loovee 0:6d297fe482af 110 int tout = 0;
loovee 0:6d297fe482af 111 while(1)
loovee 0:6d297fe482af 112 {
loovee 0:6d297fe482af 113 if(sendCmdAndWaitForRest(STROPENGPRS, "OK", 20) == ERRTOUT)
loovee 0:6d297fe482af 114 {
loovee 0:6d297fe482af 115 DBG("GPRS OPEN ERR, OPEN AGAIN\r\n");
loovee 0:6d297fe482af 116 wait(5);
loovee 0:6d297fe482af 117 }
loovee 0:6d297fe482af 118 else
loovee 0:6d297fe482af 119 {
loovee 0:6d297fe482af 120 DBG("GPRS OPEN OK!\r\n");
loovee 0:6d297fe482af 121 break;
loovee 0:6d297fe482af 122 }
loovee 0:6d297fe482af 123 tout++;
loovee 0:6d297fe482af 124 if(tout>5)return 0;
loovee 0:6d297fe482af 125 }
loovee 0:6d297fe482af 126
loovee 0:6d297fe482af 127
loovee 0:6d297fe482af 128 if(!sendCmdAndWaitForRest(STRSETGPRS, "OK", 20))return 0;
loovee 0:6d297fe482af 129 if(!sendCmdAndWaitForRest(STRSETAPN, "OK", 20))return 0;;
loovee 0:6d297fe482af 130
loovee 0:6d297fe482af 131 char cipstart[50];
loovee 0:6d297fe482af 132 sprintf(cipstart, "AT+CIPSTART=\"TCP\",\"%s\",\"%s\"", yeelinkDns, yeelinkPort);
loovee 0:6d297fe482af 133 if(!sendCmdAndWaitForRest(cipstart, "CONNECT OK", 20))return 0;; // connect tcp
loovee 0:6d297fe482af 134
loovee 0:6d297fe482af 135 return 1;
loovee 0:6d297fe482af 136 }
loovee 0:6d297fe482af 137
loovee 0:6d297fe482af 138 int IOT_Mbed::connectTCP(char *ip, char *port)
loovee 0:6d297fe482af 139 {
loovee 0:6d297fe482af 140
loovee 0:6d297fe482af 141 sendCmdAndWaitForRest("ATE0\r\n", "OK", 3);
loovee 0:6d297fe482af 142 int tout = 0;
loovee 0:6d297fe482af 143
loovee 0:6d297fe482af 144 while(1)
loovee 0:6d297fe482af 145 {
loovee 0:6d297fe482af 146 if(sendCmdAndWaitForRest(STROPENGPRS, "OK", 20) == ERRTOUT)
loovee 0:6d297fe482af 147 {
loovee 0:6d297fe482af 148 DBG("GPRS OPEN ERR, OPEN AGAIN\r\n");
loovee 0:6d297fe482af 149 wait(5);
loovee 0:6d297fe482af 150 }
loovee 0:6d297fe482af 151 else
loovee 0:6d297fe482af 152 {
loovee 0:6d297fe482af 153 DBG("GPRS OPEN OK!\r\n");
loovee 0:6d297fe482af 154 break;
loovee 0:6d297fe482af 155 }
loovee 0:6d297fe482af 156 tout++;
loovee 0:6d297fe482af 157 if(tout>5)return 0;
loovee 0:6d297fe482af 158 }
loovee 0:6d297fe482af 159
loovee 0:6d297fe482af 160
loovee 0:6d297fe482af 161 if(!sendCmdAndWaitForRest(STRSETGPRS, "OK", 20))return 0;
loovee 0:6d297fe482af 162 if(!sendCmdAndWaitForRest(STRSETAPN, "OK", 20))return 0;;
loovee 0:6d297fe482af 163
loovee 0:6d297fe482af 164 char cipstart[50];
loovee 0:6d297fe482af 165 sprintf(cipstart, "AT+CIPSTART=\"TCP\",\"%s\",\"%s\"", ip, port);
loovee 0:6d297fe482af 166 if(!sendCmdAndWaitForRest(cipstart, "CONNECT OK", 20))return 0;; // connect tcp
loovee 0:6d297fe482af 167 return 1;
loovee 0:6d297fe482af 168
loovee 0:6d297fe482af 169 }
loovee 0:6d297fe482af 170
loovee 0:6d297fe482af 171 //send data to tcp
loovee 0:6d297fe482af 172 int IOT_Mbed::sendDtaTcp(char *dta, int timeout)
loovee 0:6d297fe482af 173 {
loovee 0:6d297fe482af 174 serial1.printf("AT+CIPSEND=%d\r\n", strlen(dta));
loovee 0:6d297fe482af 175 waitString(">", 10);
loovee 0:6d297fe482af 176 serial1.printf("%s", dta);
loovee 0:6d297fe482af 177
loovee 0:6d297fe482af 178 wait_ms(50);
loovee 0:6d297fe482af 179 return waitString("SEND OK", timeout);
loovee 0:6d297fe482af 180 }
loovee 0:6d297fe482af 181
loovee 0:6d297fe482af 182 bool IOT_Mbed::sendToYeelink_t()
loovee 0:6d297fe482af 183 {
loovee 0:6d297fe482af 184 char dtaSend[300];
loovee 0:6d297fe482af 185 sprintf(dtaSend, "%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n\r\n%s\r\n", POST1, POST2, POST3, POST4, POST5, POST6, POST7);
loovee 0:6d297fe482af 186 return sendDtaTcp(dtaSend, 20);
loovee 0:6d297fe482af 187 }
loovee 0:6d297fe482af 188
loovee 0:6d297fe482af 189 void IOT_Mbed::postDtaToYeelink()
loovee 0:6d297fe482af 190 {
loovee 0:6d297fe482af 191
loovee 0:6d297fe482af 192 }
loovee 0:6d297fe482af 193
loovee 0:6d297fe482af 194 int IOT_Mbed::postDtaToYeelink(char *url, char *apikey, int sensorDta)
loovee 0:6d297fe482af 195 {
loovee 0:6d297fe482af 196 return postDtaToYeelink(url, apikey, sensorDta, 0);
loovee 0:6d297fe482af 197 }
loovee 0:6d297fe482af 198
loovee 0:6d297fe482af 199 int IOT_Mbed::postDtaToYeelink(char *url, char *apikey, float sensorDta, int dec)
loovee 0:6d297fe482af 200 {
loovee 0:6d297fe482af 201 char dtaPost[350];
loovee 0:6d297fe482af 202
loovee 0:6d297fe482af 203 char request[100];
loovee 0:6d297fe482af 204 char heads[200];
loovee 0:6d297fe482af 205 char body[100];
loovee 0:6d297fe482af 206
loovee 0:6d297fe482af 207 unsigned int port;
loovee 0:6d297fe482af 208
loovee 0:6d297fe482af 209 char host[HTTP_MAX_HOST_LEN];
loovee 0:6d297fe482af 210 char path[HTTP_MAX_PATH_LEN];
loovee 0:6d297fe482af 211
loovee 0:6d297fe482af 212 if (parseURL(url, host, sizeof(host), &port, path, sizeof(path)) != 0)
loovee 0:6d297fe482af 213 {
loovee 0:6d297fe482af 214 DBG("Failed to parse URL.\r\n");
loovee 0:6d297fe482af 215 return 0;
loovee 0:6d297fe482af 216 }
loovee 0:6d297fe482af 217
loovee 0:6d297fe482af 218 if(!connectTCP())
loovee 0:6d297fe482af 219 {
loovee 0:6d297fe482af 220 DBG("connect to tcp err!\r\n");
loovee 0:6d297fe482af 221 return 0;
loovee 0:6d297fe482af 222 }
loovee 0:6d297fe482af 223
loovee 0:6d297fe482af 224 if(dec == 0)
loovee 0:6d297fe482af 225 {
loovee 0:6d297fe482af 226 sprintf(body, "{\"value\": %.0f}\r\n", sensorDta);
loovee 0:6d297fe482af 227 }
loovee 0:6d297fe482af 228 else if(dec == 1)
loovee 0:6d297fe482af 229 {
loovee 0:6d297fe482af 230 sprintf(body, "{\"value\": %.1f}\r\n", sensorDta);
loovee 0:6d297fe482af 231 }
loovee 0:6d297fe482af 232 else if(dec == 2)
loovee 0:6d297fe482af 233 {
loovee 0:6d297fe482af 234 sprintf(body, "{\"value\": %.2f}\r\n", sensorDta);
loovee 0:6d297fe482af 235 }
loovee 0:6d297fe482af 236 else
loovee 0:6d297fe482af 237 {
loovee 0:6d297fe482af 238 sprintf(body, "{\"value\": %.3f}\r\n", sensorDta);
loovee 0:6d297fe482af 239
loovee 0:6d297fe482af 240 }
loovee 0:6d297fe482af 241 sprintf(request, "POST %s HTTP/1.1\r\n", path);
loovee 0:6d297fe482af 242 sprintf(heads, "Host: %s\r\nU-ApiKey: %s\r\nContent-Length: %d\r\nContent-Type: %s\r\n\r\n",host, apikey, strlen(body), CONTENT_TYPE);
loovee 0:6d297fe482af 243 sprintf(dtaPost, "%s%s%s", request, heads, body);
loovee 0:6d297fe482af 244
loovee 0:6d297fe482af 245 sendDtaTcp(dtaPost, 10);
loovee 0:6d297fe482af 246
loovee 0:6d297fe482af 247 while(serial1.readable())
loovee 0:6d297fe482af 248 {
loovee 0:6d297fe482af 249 char c = serial1.getc();
loovee 0:6d297fe482af 250 DBG(c);
loovee 0:6d297fe482af 251 }
loovee 0:6d297fe482af 252
loovee 0:6d297fe482af 253 return sendCmdAndWaitForRest(STRCLOSE, "OK", 20);
loovee 0:6d297fe482af 254 }
loovee 0:6d297fe482af 255
loovee 0:6d297fe482af 256 int IOT_Mbed::parseURL(const char *url, char *host, int max_host_len, unsigned int *port, char *path, int max_path_len)
loovee 0:6d297fe482af 257 {
loovee 0:6d297fe482af 258 char *scheme_ptr = (char *)url;
loovee 0:6d297fe482af 259 char *host_ptr = (char *)strstr(url, "://");
loovee 0:6d297fe482af 260 if (host_ptr != NULL)
loovee 0:6d297fe482af 261 {
loovee 0:6d297fe482af 262 if (strncmp(scheme_ptr, "http://", 7))
loovee 0:6d297fe482af 263 {
loovee 0:6d297fe482af 264 DBG("Bad scheme\r\n");
loovee 0:6d297fe482af 265 return -1;
loovee 0:6d297fe482af 266 }
loovee 0:6d297fe482af 267 host_ptr += 3;
loovee 0:6d297fe482af 268 }
loovee 0:6d297fe482af 269 else
loovee 0:6d297fe482af 270 {
loovee 0:6d297fe482af 271 host_ptr = (char *)url;
loovee 0:6d297fe482af 272 }
loovee 0:6d297fe482af 273
loovee 0:6d297fe482af 274 int host_len = 0;
loovee 0:6d297fe482af 275 char *port_ptr = strchr(host_ptr, ':');
loovee 0:6d297fe482af 276
loovee 0:6d297fe482af 277 if (port_ptr != NULL)
loovee 0:6d297fe482af 278 {
loovee 0:6d297fe482af 279 host_len = port_ptr - host_ptr;
loovee 0:6d297fe482af 280 port_ptr++;
loovee 0:6d297fe482af 281 if (sscanf(port_ptr, "%hu", port) != 1)
loovee 0:6d297fe482af 282 {
loovee 0:6d297fe482af 283 DBG("Could not find port.\r\n");
loovee 0:6d297fe482af 284 return -3;
loovee 0:6d297fe482af 285 }
loovee 0:6d297fe482af 286 }
loovee 0:6d297fe482af 287 else
loovee 0:6d297fe482af 288 {
loovee 0:6d297fe482af 289 *port = HTTP_DEFAULT_PORT;
loovee 0:6d297fe482af 290 }
loovee 0:6d297fe482af 291
loovee 0:6d297fe482af 292 char *path_ptr = strchr(host_ptr, '/');
loovee 0:6d297fe482af 293
loovee 0:6d297fe482af 294 if (host_len == 0)
loovee 0:6d297fe482af 295 {
loovee 0:6d297fe482af 296 host_len = path_ptr - host_ptr;
loovee 0:6d297fe482af 297 }
loovee 0:6d297fe482af 298
loovee 0:6d297fe482af 299 if (max_host_len < (host_len + 1))
loovee 0:6d297fe482af 300 {
loovee 0:6d297fe482af 301 DBG("Host buffer is too small.\r\n");
loovee 0:6d297fe482af 302 return -4;
loovee 0:6d297fe482af 303 }
loovee 0:6d297fe482af 304
loovee 0:6d297fe482af 305 memcpy(host, host_ptr, host_len);
loovee 0:6d297fe482af 306 host[host_len] = '\0';
loovee 0:6d297fe482af 307
loovee 0:6d297fe482af 308 int path_len;
loovee 0:6d297fe482af 309
loovee 0:6d297fe482af 310 char *fragment_ptr = strchr(host_ptr, '#');
loovee 0:6d297fe482af 311 if (fragment_ptr != NULL)
loovee 0:6d297fe482af 312 {
loovee 0:6d297fe482af 313 path_len = fragment_ptr - path_ptr;
loovee 0:6d297fe482af 314 }
loovee 0:6d297fe482af 315 else
loovee 0:6d297fe482af 316 {
loovee 0:6d297fe482af 317 path_len = strlen(path_ptr);
loovee 0:6d297fe482af 318 }
loovee 0:6d297fe482af 319
loovee 0:6d297fe482af 320 if (max_path_len < (path_len + 1))
loovee 0:6d297fe482af 321 {
loovee 0:6d297fe482af 322 DBG("Path buffer is too small.\r\n");
loovee 0:6d297fe482af 323 return -5;
loovee 0:6d297fe482af 324 }
loovee 0:6d297fe482af 325 memcpy(path, path_ptr, path_len);
loovee 0:6d297fe482af 326 path[path_len] = '\0';
loovee 0:6d297fe482af 327
loovee 0:6d297fe482af 328 return 0;
loovee 0:6d297fe482af 329 }
loovee 0:6d297fe482af 330
loovee 0:6d297fe482af 331
loovee 0:6d297fe482af 332
loovee 0:6d297fe482af 333 IOT_Mbed IOT;
loovee 0:6d297fe482af 334 /*********************************************************************************************************
loovee 0:6d297fe482af 335 END FILE
loovee 0:6d297fe482af 336 *********************************************************************************************************/