Ambient library. It provides "set" function to set data to a packet and "send" function to send the packet to the Ambient server. It also provides "bulk_send" function to send multiple data. (Japanese: IoT用のクラウドサービス「Ambient」のデーター送信ライブラリーです。Ambientはマイコンから送られたセンサーデーターを受信し、蓄積し、可視化(グラフ化)します。http://ambidata.io)
Dependents: AmbientExampleSITB AmbientHeartRateMonitor AmbientHeartBeat AmbientExampleSITB_ws ... more
Diff: Ambient.cpp
- Revision:
- 3:a724fe60de46
- Parent:
- 2:a319af936fd5
- Child:
- 4:fcbd652bbb7a
--- a/Ambient.cpp Tue Jun 07 07:47:53 2016 +0000 +++ b/Ambient.cpp Mon Jun 13 12:03:41 2016 +0000 @@ -20,8 +20,8 @@ const char* AMBIENT_HOST = "54.65.206.59"; const int AMBIENT_PORT = 80; -const char* AMBIENT_HOST_DEV = "54.65.206.59"; -const int AMBIENT_PORT_DEV = 80; +const char* AMBIENT_HOST_DEV = "192.168.0.6"; +const int AMBIENT_PORT_DEV = 4567; const char * ambient_keys[] = {"\"d1\":\"", "\"d2\":\"", "\"d3\":\"", "\"d4\":\"", "\"d5\":\"", "\"d6\":\"", "\"d7\":\"", "\"d8\":\"", "\"lat\":\"", "\"lng\":\"", "\"created\":\""}; @@ -99,13 +99,10 @@ return false; } - char str[360] = {0}; - char header[54] = {0}; - char host[32] = {0}; - char contentLen[28] = {0}; - const char *contentType = "Content-Type: application/json\r\n\r\n"; - char body[192] = {0}; + char str[180]; + char body[192]; + memset(body, 0, sizeof(body)); strcat(body, "{\"writeKey\":\""); strcat(body, this->writeKey); strcat(body, "\","); @@ -118,17 +115,17 @@ } } body[strlen(body) - 1] = '\0'; - strcat(body, "}\r\n"); - sprintf(header, "POST /api/v2/channels/%d/data HTTP/1.1\r\n", this->channelId); + memset(str, 0, sizeof(str)); + sprintf(str, "POST /api/v2/channels/%d/data HTTP/1.1\r\n", this->channelId); if (this->port == 80) { - sprintf(host, "Host: %s\r\n", this->host); + sprintf(&str[strlen(str)], "Host: %s\r\n", this->host); } else { - sprintf(host, "Host: %s:%d\r\n", this->host, this->port); + sprintf(&str[strlen(str)], "Host: %s:%d\r\n", this->host, this->port); } - sprintf(contentLen, "Content-Length: %d\r\n", strlen(body)); - sprintf(str, "%s%s%s%s%s", header, host, contentLen, contentType, body); + sprintf(&str[strlen(str)], "Content-Length: %d\r\n", strlen(body)); + sprintf(&str[strlen(str)], "Content-Type: application/json\r\n\r\n"); DBG("sending: %d bytes\r\n%s", strlen(str), str); @@ -140,6 +137,126 @@ ERR("send failed\r\n"); return false; } + ret = this->s->send_all(body, strlen(body)); + wait_ms(30); + DBG("%d bytes sent\r\n", ret); + if (ret < 0) { + ERR("send failed\r\n"); + return false; + } + + ret = this->s->receive(str,sizeof(str)); + wait_ms(30); + str[ret]=0; + DBG("Received String : (%d)\r\n%s\r\n",ret, str); + + this->s->close(); + + for (int i = 0; i < AMBIENT_NUM_PARAMS; i++) { + this->data[i].set = false; + } + + return true; +} + +int +Ambient::bulk_send(char *buf) { + + int retry; + for (retry = 0; retry < AMBIENT_MAX_RETRY; retry++) { + int ret; + ret = this->s->connect(this->host, this->port); + if (ret == 0) { + break ; + } + } + if(retry == AMBIENT_MAX_RETRY) { + ERR("Could not connect socket to host\r\n"); + return -1; + } + + char str[180]; + + memset(str, 0, sizeof(str)); + sprintf(str, "POST /api/v2/channels/%d/dataarray HTTP/1.1\r\n", this->channelId); + if (this->port == 80) { + sprintf(&str[strlen(str)], "Host: %s\r\n", this->host); + } else { + sprintf(&str[strlen(str)], "Host: %s:%d\r\n", this->host, this->port); + } + sprintf(&str[strlen(str)], "Host: %s:%d\r\n", this->host, this->port); + sprintf(&str[strlen(str)], "Content-Length: %d\r\n", strlen(buf)); + sprintf(&str[strlen(str)], "Content-Type: application/json\r\n\r\n"); + + DBG("sending: %d bytes\r\n%s", strlen(str), str); + + int ret; + ret = this->s->send_all(str, strlen(str)); // send header + wait_ms(30); + DBG("%d bytes sent\r\n", ret); + if (ret < 0) { + ERR("send failed\r\n"); + return -1; + } + int sent; + sent = this->s->send_all(buf, strlen(buf)); + wait_ms(30); + DBG("%d bytes sent\r\n", sent); + if (sent < 0) { + ERR("send failed\r\n"); + return -1; + } + + ret = this->s->receive(str,sizeof(str)); + wait_ms(30); + str[ret]=0; + DBG("Received String : (%d)\r\n%s\r\n",ret, str); + + this->s->close(); + + for (int i = 0; i < AMBIENT_NUM_PARAMS; i++) { + this->data[i].set = false; + } + + return sent; +} + +bool +Ambient::delete_data(const char * userKey) { + int retry; + for (retry = 0; retry < AMBIENT_MAX_RETRY; retry++) { + int ret; + ret = this->s->connect(this->host, this->port); + if (ret == 0) { + break ; + } + } + if(retry == AMBIENT_MAX_RETRY) { + ERR("Could not connect socket to host\r\n"); + return false; + } + + char str[180]; + + memset(str, 0, sizeof(str)); + sprintf(str, "DELETE /api/v2/channels/%d/data?userKey=%s HTTP/1.1\r\n", this->channelId, userKey); + if (this->port == 80) { + sprintf(&str[strlen(str)], "Host: %s\r\n", this->host); + } else { + sprintf(&str[strlen(str)], "Host: %s:%d\r\n", this->host, this->port); + } + sprintf(&str[strlen(str)], "Content-Length: 0\r\n"); + sprintf(&str[strlen(str)], "Content-Type: application/json\r\n\r\n"); + DBG("%s", str); + + int ret; + ret = this->s->send_all(str, strlen(str)); + wait_ms(30); + DBG("%d bytes sent\r\n", ret); + if (ret < 0) { + ERR("send failed\r\n"); + return false; + } ret = this->s->receive(str,sizeof(str)); str[ret]=0;