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
Ambient.cpp@1:dcc2714b5bcb, 2016-06-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |