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

Committer:
AmbientData
Date:
Mon Jun 06 11:41:56 2016 +0000
Revision:
1:dcc2714b5bcb
Parent:
0:7dca16f75bae
Child:
2:a319af936fd5
Change Class name from AMBIENT to Ambient

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AmbientData 0:7dca16f75bae 1 #include "Ambient.h"
AmbientData 0:7dca16f75bae 2
AmbientData 0:7dca16f75bae 3 #define _DEBUG 0
AmbientData 0:7dca16f75bae 4
AmbientData 0:7dca16f75bae 5 #if _DEBUG
AmbientData 0:7dca16f75bae 6 #define DBG(...) { printf(__VA_ARGS__); }
AmbientData 0:7dca16f75bae 7 #define ERR(...) { printf(__VA_ARGS__); }
AmbientData 0:7dca16f75bae 8 #else
AmbientData 0:7dca16f75bae 9 #define DBG(...)
AmbientData 0:7dca16f75bae 10 #define ERR(...)
AmbientData 0:7dca16f75bae 11 #endif /* _DBG */
AmbientData 0:7dca16f75bae 12
AmbientData 0:7dca16f75bae 13 const char* AMBIENT_HOST = "54.65.206.59";
AmbientData 0:7dca16f75bae 14 const int AMBIENT_PORT = 80;
AmbientData 0:7dca16f75bae 15 const char* AMBIENT_HOST_DEV = "192.168.0.8";
AmbientData 0:7dca16f75bae 16 const int AMBIENT_PORT_DEV = 4567;
AmbientData 0:7dca16f75bae 17
AmbientData 0:7dca16f75bae 18 const char * ambient_keys[] = {"\"d1\":\"", "\"d2\":\"", "\"d3\":\"", "\"d4\":\"", "\"d5\":\"", "\"d6\":\"", "\"d7\":\"", "\"d8\":\"", "\"lat\":\"", "\"lng\":\"", "\"created\":\""};
AmbientData 0:7dca16f75bae 19
AmbientData 1:dcc2714b5bcb 20 Ambient::Ambient() {
AmbientData 0:7dca16f75bae 21 }
AmbientData 0:7dca16f75bae 22
AmbientData 0:7dca16f75bae 23 bool
AmbientData 1:dcc2714b5bcb 24 Ambient::init(unsigned int channelId, const char * writeKey, TCPSocketConnection * s, int dev) {
AmbientData 0:7dca16f75bae 25 this->channelId = channelId;
AmbientData 0:7dca16f75bae 26
AmbientData 0:7dca16f75bae 27 if (sizeof(writeKey) > AMBIENT_WRITEKEY_SIZE) {
AmbientData 0:7dca16f75bae 28 ERR("writeKey length > AMBIENT_WRITEKEY_SIZE");
AmbientData 0:7dca16f75bae 29 return false;
AmbientData 0:7dca16f75bae 30 }
AmbientData 0:7dca16f75bae 31 strcpy(this->writeKey, writeKey);
AmbientData 0:7dca16f75bae 32
AmbientData 0:7dca16f75bae 33 if(NULL == s) {
AmbientData 0:7dca16f75bae 34 ERR("Socket Pointer is NULL, open a socket.");
AmbientData 0:7dca16f75bae 35 return false;
AmbientData 0:7dca16f75bae 36 }
AmbientData 0:7dca16f75bae 37 this->s = s;
AmbientData 0:7dca16f75bae 38 this->dev = dev;
AmbientData 0:7dca16f75bae 39 if (dev) {
AmbientData 0:7dca16f75bae 40 strcpy(this->host, AMBIENT_HOST_DEV);
AmbientData 0:7dca16f75bae 41 this->port = AMBIENT_PORT_DEV;
AmbientData 0:7dca16f75bae 42 } else {
AmbientData 0:7dca16f75bae 43 strcpy(this->host, AMBIENT_HOST);
AmbientData 0:7dca16f75bae 44 this->port = AMBIENT_PORT;
AmbientData 0:7dca16f75bae 45 }
AmbientData 0:7dca16f75bae 46 for (int i = 0; i < AMBIENT_NUM_PARAMS; i++) {
AmbientData 0:7dca16f75bae 47 this->data[i].set = false;
AmbientData 0:7dca16f75bae 48 }
AmbientData 0:7dca16f75bae 49 return true;
AmbientData 0:7dca16f75bae 50 }
AmbientData 0:7dca16f75bae 51
AmbientData 0:7dca16f75bae 52 bool
AmbientData 1:dcc2714b5bcb 53 Ambient::set(int field, char * data) {
AmbientData 0:7dca16f75bae 54 --field;
AmbientData 0:7dca16f75bae 55 if (field < 0 || field >= AMBIENT_NUM_PARAMS) {
AmbientData 0:7dca16f75bae 56 return false;
AmbientData 0:7dca16f75bae 57 }
AmbientData 0:7dca16f75bae 58 if (strlen(data) > AMBIENT_DATA_SIZE) {
AmbientData 0:7dca16f75bae 59 return false;
AmbientData 0:7dca16f75bae 60 }
AmbientData 0:7dca16f75bae 61 this->data[field].set = true;
AmbientData 0:7dca16f75bae 62 strcpy(this->data[field].item, data);
AmbientData 0:7dca16f75bae 63
AmbientData 0:7dca16f75bae 64 return true;
AmbientData 0:7dca16f75bae 65 }
AmbientData 0:7dca16f75bae 66
AmbientData 0:7dca16f75bae 67 bool
AmbientData 1:dcc2714b5bcb 68 Ambient::clear(int field) {
AmbientData 0:7dca16f75bae 69 --field;
AmbientData 0:7dca16f75bae 70 if (field < 0 || field >= AMBIENT_NUM_PARAMS) {
AmbientData 0:7dca16f75bae 71 return false;
AmbientData 0:7dca16f75bae 72 }
AmbientData 0:7dca16f75bae 73 this->data[field].set = false;
AmbientData 0:7dca16f75bae 74
AmbientData 0:7dca16f75bae 75 return true;
AmbientData 0:7dca16f75bae 76 }
AmbientData 0:7dca16f75bae 77
AmbientData 0:7dca16f75bae 78 bool
AmbientData 1:dcc2714b5bcb 79 Ambient::send() {
AmbientData 0:7dca16f75bae 80
AmbientData 0:7dca16f75bae 81 int retry;
AmbientData 0:7dca16f75bae 82 for (retry = 0; retry < AMBIENT_MAX_RETRY; retry++) {
AmbientData 0:7dca16f75bae 83 int ret;
AmbientData 0:7dca16f75bae 84 ret = this->s->connect(this->host, this->port);
AmbientData 0:7dca16f75bae 85 if (ret == 0) {
AmbientData 0:7dca16f75bae 86 break ;
AmbientData 0:7dca16f75bae 87 }
AmbientData 0:7dca16f75bae 88 }
AmbientData 0:7dca16f75bae 89 if(retry == AMBIENT_MAX_RETRY) {
AmbientData 0:7dca16f75bae 90 ERR("Could not connect socket to host\r\n");
AmbientData 0:7dca16f75bae 91 return false;
AmbientData 0:7dca16f75bae 92 }
AmbientData 0:7dca16f75bae 93
AmbientData 0:7dca16f75bae 94 char str[360] = {0};
AmbientData 0:7dca16f75bae 95 char header[54] = {0};
AmbientData 0:7dca16f75bae 96 char host[32] = {0};
AmbientData 0:7dca16f75bae 97 char contentLen[28] = {0};
AmbientData 0:7dca16f75bae 98 const char *contentType = "Content-Type: application/json\r\n\r\n";
AmbientData 0:7dca16f75bae 99 char body[192] = {0};
AmbientData 0:7dca16f75bae 100
AmbientData 0:7dca16f75bae 101 strcat(body, "{\"writeKey\":\"");
AmbientData 0:7dca16f75bae 102 strcat(body, this->writeKey);
AmbientData 0:7dca16f75bae 103 strcat(body, "\",");
AmbientData 0:7dca16f75bae 104
AmbientData 0:7dca16f75bae 105 for (int i = 0; i < AMBIENT_NUM_PARAMS; i++) {
AmbientData 0:7dca16f75bae 106 if (this->data[i].set) {
AmbientData 0:7dca16f75bae 107 strcat(body, ambient_keys[i]);
AmbientData 0:7dca16f75bae 108 strcat(body, this->data[i].item);
AmbientData 0:7dca16f75bae 109 strcat(body, "\",");
AmbientData 0:7dca16f75bae 110 }
AmbientData 0:7dca16f75bae 111 }
AmbientData 0:7dca16f75bae 112 body[strlen(body) - 1] = '\0';
AmbientData 0:7dca16f75bae 113
AmbientData 0:7dca16f75bae 114 strcat(body, "}\r\n");
AmbientData 0:7dca16f75bae 115
AmbientData 0:7dca16f75bae 116 sprintf(header, "POST /api/v2/channels/%d/data HTTP/1.1\r\n", this->channelId);
AmbientData 0:7dca16f75bae 117 if (this->port == 80) {
AmbientData 0:7dca16f75bae 118 sprintf(host, "Host: %s\r\n", this->host);
AmbientData 0:7dca16f75bae 119 } else {
AmbientData 0:7dca16f75bae 120 sprintf(host, "Host: %s:%d\r\n", this->host, this->port);
AmbientData 0:7dca16f75bae 121 }
AmbientData 0:7dca16f75bae 122 sprintf(contentLen, "Content-Length: %d\r\n", strlen(body));
AmbientData 0:7dca16f75bae 123 sprintf(str, "%s%s%s%s%s", header, host, contentLen, contentType, body);
AmbientData 0:7dca16f75bae 124
AmbientData 0:7dca16f75bae 125 DBG("sending: %d bytes\r\n%s", strlen(str), str);
AmbientData 0:7dca16f75bae 126
AmbientData 0:7dca16f75bae 127 int ret;
AmbientData 0:7dca16f75bae 128 ret = this->s->send_all(str, strlen(str));
AmbientData 0:7dca16f75bae 129 wait_ms(30);
AmbientData 0:7dca16f75bae 130 DBG("%d bytes sent\r\n", ret);
AmbientData 0:7dca16f75bae 131 if (ret < 0) {
AmbientData 0:7dca16f75bae 132 ERR("send failed\r\n");
AmbientData 0:7dca16f75bae 133 return false;
AmbientData 0:7dca16f75bae 134 }
AmbientData 0:7dca16f75bae 135
AmbientData 0:7dca16f75bae 136 ret = this->s->receive(str,sizeof(str));
AmbientData 0:7dca16f75bae 137 str[ret]=0;
AmbientData 0:7dca16f75bae 138 DBG("Received String : (%d)\r\n%s\r\n",ret, str);
AmbientData 0:7dca16f75bae 139
AmbientData 0:7dca16f75bae 140 this->s->close();
AmbientData 0:7dca16f75bae 141
AmbientData 0:7dca16f75bae 142 for (int i = 0; i < AMBIENT_NUM_PARAMS; i++) {
AmbientData 0:7dca16f75bae 143 this->data[i].set = false;
AmbientData 0:7dca16f75bae 144 }
AmbientData 0:7dca16f75bae 145
AmbientData 0:7dca16f75bae 146 return true;
AmbientData 0:7dca16f75bae 147 }