ARM mbed M2X API Client: The ARM mbed client library is used to send/receive data to/from AT&T's M2X service from mbed LPC1768 microcontrollers.

Dependents:   m2x-demo-all M2X_MTS_ACCEL_DEMO M2X_MTS_Accel M2X_K64F_ACCEL ... more

Committer:
citrusbyte
Date:
Sat Jan 02 02:29:43 2016 +0000
Revision:
21:6878944d2ce2
Parent:
20:32d24a6355b5
Update library version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jb8414 0:f479e4f4db0e 1 #ifndef M2XStreamClient_template_h
jb8414 0:f479e4f4db0e 2 #define M2XStreamClient_template_h
jb8414 0:f479e4f4db0e 3
jb8414 0:f479e4f4db0e 4 // Implementations of template functions
jb8414 0:f479e4f4db0e 5
jb8414 0:f479e4f4db0e 6 int print_encoded_string(Print* print, const char* str);
jb8414 0:f479e4f4db0e 7
jb8414 0:f479e4f4db0e 8 template <class T>
citrusbyte 13:0d574742208f 9 int M2XStreamClient::updateStreamValue(const char* deviceId, const char* streamName, T value) {
jb8414 0:f479e4f4db0e 10 if (_client->connect(_host, _port)) {
jb8414 0:f479e4f4db0e 11 DBGLN("%s", "Connected to M2X server!");
citrusbyte 13:0d574742208f 12 writePutHeader(deviceId, streamName,
citrusbyte 15:2610823f7f2e 13 // for {"value":" and "}
citrusbyte 15:2610823f7f2e 14 _null_print.print(value) + 12);
citrusbyte 15:2610823f7f2e 15 _client->print("{\"value\":\"");
jb8414 0:f479e4f4db0e 16 _client->print(value);
citrusbyte 15:2610823f7f2e 17 _client->print("\"}");
jb8414 0:f479e4f4db0e 18 } else {
jb8414 0:f479e4f4db0e 19 DBGLN("%s", "ERROR: Cannot connect to M2X server!");
jb8414 0:f479e4f4db0e 20 return E_NOCONNECTION;
jb8414 0:f479e4f4db0e 21 }
jb8414 0:f479e4f4db0e 22
jb8414 0:f479e4f4db0e 23 return readStatusCode(true);
jb8414 0:f479e4f4db0e 24 }
jb8414 0:f479e4f4db0e 25
jb8414 0:f479e4f4db0e 26 template <class T>
jb8414 0:f479e4f4db0e 27 inline int write_multiple_values(Print* print, int streamNum,
jb8414 0:f479e4f4db0e 28 const char* names[], const int counts[],
jb8414 0:f479e4f4db0e 29 const char* ats[], T values[]) {
jb8414 0:f479e4f4db0e 30 int bytes = 0, value_index = 0;
jb8414 0:f479e4f4db0e 31 bytes += print->print("{\"values\":{");
jb8414 0:f479e4f4db0e 32 for (int i = 0; i < streamNum; i++) {
jb8414 0:f479e4f4db0e 33 bytes += print->print("\"");
jb8414 0:f479e4f4db0e 34 bytes += print->print(names[i]);
jb8414 0:f479e4f4db0e 35 bytes += print->print("\":[");
jb8414 0:f479e4f4db0e 36 for (int j = 0; j < counts[i]; j++) {
citrusbyte 13:0d574742208f 37 bytes += print->print("{\"timestamp\": \"");
citrusbyte 10:4ce9eba38dbe 38 bytes += print->print(ats[value_index]);
citrusbyte 10:4ce9eba38dbe 39 bytes += print->print("\", \"value\": \"");
jb8414 0:f479e4f4db0e 40 bytes += print->print(values[value_index]);
jb8414 0:f479e4f4db0e 41 bytes += print->print("\"}");
jb8414 0:f479e4f4db0e 42 if (j < counts[i] - 1) { bytes += print->print(","); }
jb8414 0:f479e4f4db0e 43 value_index++;
jb8414 0:f479e4f4db0e 44 }
jb8414 0:f479e4f4db0e 45 bytes += print->print("]");
jb8414 0:f479e4f4db0e 46 if (i < streamNum - 1) { bytes += print->print(","); }
jb8414 0:f479e4f4db0e 47 }
jb8414 0:f479e4f4db0e 48 bytes += print->print("}}");
jb8414 0:f479e4f4db0e 49 return bytes;
jb8414 0:f479e4f4db0e 50 }
jb8414 0:f479e4f4db0e 51
jb8414 0:f479e4f4db0e 52 template <class T>
citrusbyte 13:0d574742208f 53 int M2XStreamClient::postDeviceUpdates(const char* deviceId, int streamNum,
citrusbyte 13:0d574742208f 54 const char* names[], const int counts[],
citrusbyte 13:0d574742208f 55 const char* ats[], T values[]) {
jb8414 0:f479e4f4db0e 56 if (_client->connect(_host, _port)) {
jb8414 0:f479e4f4db0e 57 DBGLN("%s", "Connected to M2X server!");
jb8414 0:f479e4f4db0e 58 int length = write_multiple_values(&_null_print, streamNum, names,
jb8414 0:f479e4f4db0e 59 counts, ats, values);
NetArc 14:205076b587fe 60 _client->print("POST ");
NetArc 14:205076b587fe 61 if (_path_prefix)
NetArc 14:205076b587fe 62 _client->print(_path_prefix);
NetArc 14:205076b587fe 63 _client->print("/v2/devices/");
citrusbyte 13:0d574742208f 64 print_encoded_string(_client, deviceId);
citrusbyte 13:0d574742208f 65 _client->println("/updates HTTP/1.0");
jb8414 0:f479e4f4db0e 66 writeHttpHeader(length);
jb8414 0:f479e4f4db0e 67 write_multiple_values(_client, streamNum, names, counts, ats, values);
jb8414 0:f479e4f4db0e 68 } else {
jb8414 0:f479e4f4db0e 69 DBGLN("%s", "ERROR: Cannot connect to M2X server!");
jb8414 0:f479e4f4db0e 70 return E_NOCONNECTION;
jb8414 0:f479e4f4db0e 71 }
jb8414 0:f479e4f4db0e 72 return readStatusCode(true);
jb8414 0:f479e4f4db0e 73 }
jb8414 0:f479e4f4db0e 74
jb8414 0:f479e4f4db0e 75 template <class T>
citrusbyte 19:4dfa28d37b8f 76 inline int write_single_device_values(Print* print, int streamNum,
citrusbyte 19:4dfa28d37b8f 77 const char* names[], T values[],
citrusbyte 19:4dfa28d37b8f 78 const char* at) {
citrusbyte 19:4dfa28d37b8f 79 int bytes = 0;
citrusbyte 19:4dfa28d37b8f 80 bytes += print->print("{\"values\":{");
citrusbyte 19:4dfa28d37b8f 81 for (int i = 0; i < streamNum; i++) {
citrusbyte 19:4dfa28d37b8f 82 bytes += print->print("\"");
citrusbyte 19:4dfa28d37b8f 83 bytes += print->print(names[i]);
citrusbyte 19:4dfa28d37b8f 84 bytes += print->print("\": \"");
citrusbyte 20:32d24a6355b5 85 bytes += print->print(values[i]);
citrusbyte 19:4dfa28d37b8f 86 bytes += print->print("\"");
citrusbyte 19:4dfa28d37b8f 87 if (i < streamNum - 1) { bytes += print->print(","); }
citrusbyte 19:4dfa28d37b8f 88 }
citrusbyte 19:4dfa28d37b8f 89 bytes += print->print("}");
citrusbyte 19:4dfa28d37b8f 90 if (at != NULL) {
citrusbyte 19:4dfa28d37b8f 91 bytes += print->print(",\"timestamp\":\"");
citrusbyte 19:4dfa28d37b8f 92 bytes += print->print(at);
citrusbyte 19:4dfa28d37b8f 93 bytes += print->print("\"");
citrusbyte 19:4dfa28d37b8f 94 }
citrusbyte 19:4dfa28d37b8f 95 bytes += print->print("}");
citrusbyte 19:4dfa28d37b8f 96 return bytes;
citrusbyte 19:4dfa28d37b8f 97 }
citrusbyte 19:4dfa28d37b8f 98
citrusbyte 19:4dfa28d37b8f 99 template <class T>
citrusbyte 19:4dfa28d37b8f 100 int M2XStreamClient::postSingleDeviceUpdate(const char* deviceId, int streamNum,
citrusbyte 19:4dfa28d37b8f 101 const char* names[], T values[],
citrusbyte 19:4dfa28d37b8f 102 const char* at) {
citrusbyte 19:4dfa28d37b8f 103 if (_client->connect(_host, _port)) {
citrusbyte 19:4dfa28d37b8f 104 DBGLN("%s", "Connected to M2X server!");
citrusbyte 19:4dfa28d37b8f 105 int length = write_single_device_values(&_null_print, streamNum, names,
citrusbyte 19:4dfa28d37b8f 106 values, at);
citrusbyte 19:4dfa28d37b8f 107 _client->print("POST ");
citrusbyte 19:4dfa28d37b8f 108 if (_path_prefix) {
citrusbyte 19:4dfa28d37b8f 109 _client->print(_path_prefix);
citrusbyte 19:4dfa28d37b8f 110 }
citrusbyte 19:4dfa28d37b8f 111 _client->print("/v2/devices/");
citrusbyte 19:4dfa28d37b8f 112 print_encoded_string(_client, deviceId);
citrusbyte 19:4dfa28d37b8f 113 _client->println("/update HTTP/1.0");
citrusbyte 19:4dfa28d37b8f 114 writeHttpHeader(length);
citrusbyte 19:4dfa28d37b8f 115 write_single_device_values(_client, streamNum, names, values, at);
citrusbyte 19:4dfa28d37b8f 116 } else {
citrusbyte 19:4dfa28d37b8f 117 DBGLN("%s", "ERROR: Cannot connect to M2X server!");
citrusbyte 19:4dfa28d37b8f 118 return E_NOCONNECTION;
citrusbyte 19:4dfa28d37b8f 119 }
citrusbyte 19:4dfa28d37b8f 120 return readStatusCode(true);
citrusbyte 19:4dfa28d37b8f 121 }
citrusbyte 19:4dfa28d37b8f 122
citrusbyte 19:4dfa28d37b8f 123 template <class T>
jb8414 0:f479e4f4db0e 124 static int write_location_data(Print* print, const char* name,
jb8414 0:f479e4f4db0e 125 T latitude, T longitude,
jb8414 0:f479e4f4db0e 126 T elevation) {
jb8414 0:f479e4f4db0e 127 int bytes = 0;
jb8414 0:f479e4f4db0e 128 bytes += print->print("{\"name\":\"");
jb8414 0:f479e4f4db0e 129 bytes += print->print(name);
jb8414 0:f479e4f4db0e 130 bytes += print->print("\",\"latitude\":\"");
jb8414 0:f479e4f4db0e 131 bytes += print->print(latitude);
jb8414 0:f479e4f4db0e 132 bytes += print->print("\",\"longitude\":\"");
jb8414 0:f479e4f4db0e 133 bytes += print->print(longitude);
jb8414 0:f479e4f4db0e 134 bytes += print->print("\",\"elevation\":\"");
jb8414 0:f479e4f4db0e 135 bytes += print->print(elevation);
jb8414 0:f479e4f4db0e 136 bytes += print->print("\"}");
jb8414 0:f479e4f4db0e 137 return bytes;
jb8414 0:f479e4f4db0e 138 }
jb8414 0:f479e4f4db0e 139
jb8414 0:f479e4f4db0e 140 static int write_location_data(Print* print, const char* name,
jb8414 0:f479e4f4db0e 141 double latitude, double longitude,
jb8414 0:f479e4f4db0e 142 double elevation) {
jb8414 0:f479e4f4db0e 143 int bytes = 0;
jb8414 0:f479e4f4db0e 144 bytes += print->print("{\"name\":\"");
jb8414 0:f479e4f4db0e 145 bytes += print->print(name);
jb8414 0:f479e4f4db0e 146 bytes += print->print("\",\"latitude\":\"");
jb8414 0:f479e4f4db0e 147 bytes += print->print(latitude, MAX_DOUBLE_DIGITS);
jb8414 0:f479e4f4db0e 148 bytes += print->print("\",\"longitude\":\"");
jb8414 0:f479e4f4db0e 149 bytes += print->print(longitude, MAX_DOUBLE_DIGITS);
jb8414 0:f479e4f4db0e 150 bytes += print->print("\",\"elevation\":\"");
jb8414 0:f479e4f4db0e 151 bytes += print->print(elevation);
jb8414 0:f479e4f4db0e 152 bytes += print->print("\"}");
jb8414 0:f479e4f4db0e 153 return bytes;
jb8414 0:f479e4f4db0e 154 }
jb8414 0:f479e4f4db0e 155
jb8414 0:f479e4f4db0e 156 template <class T>
citrusbyte 13:0d574742208f 157 int M2XStreamClient::updateLocation(const char* deviceId,
jb8414 0:f479e4f4db0e 158 const char* name,
jb8414 0:f479e4f4db0e 159 T latitude,
jb8414 0:f479e4f4db0e 160 T longitude,
jb8414 0:f479e4f4db0e 161 T elevation) {
jb8414 0:f479e4f4db0e 162 if (_client->connect(_host, _port)) {
jb8414 0:f479e4f4db0e 163 DBGLN("%s", "Connected to M2X server!");
jb8414 0:f479e4f4db0e 164
jb8414 0:f479e4f4db0e 165 int length = write_location_data(&_null_print, name, latitude, longitude,
jb8414 0:f479e4f4db0e 166 elevation);
NetArc 14:205076b587fe 167 _client->print("PUT ");
NetArc 14:205076b587fe 168 if (_path_prefix)
NetArc 14:205076b587fe 169 _client->print(_path_prefix);
NetArc 14:205076b587fe 170 _client->print("/v2/devices/");
citrusbyte 13:0d574742208f 171 print_encoded_string(_client, deviceId);
jb8414 0:f479e4f4db0e 172 _client->println("/location HTTP/1.0");
jb8414 0:f479e4f4db0e 173
jb8414 0:f479e4f4db0e 174 writeHttpHeader(length);
jb8414 0:f479e4f4db0e 175 write_location_data(_client, name, latitude, longitude, elevation);
jb8414 0:f479e4f4db0e 176 } else {
jb8414 0:f479e4f4db0e 177 DBGLN("%s", "ERROR: Cannot connect to M2X server!");
jb8414 0:f479e4f4db0e 178 return E_NOCONNECTION;
jb8414 0:f479e4f4db0e 179 }
jb8414 0:f479e4f4db0e 180 return readStatusCode(true);
jb8414 0:f479e4f4db0e 181 }
jb8414 0:f479e4f4db0e 182
jb8414 0:f479e4f4db0e 183 #endif