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
M2XStreamClient_template.h@19:4dfa28d37b8f, 2016-01-01 (annotated)
- Committer:
- citrusbyte
- Date:
- Fri Jan 01 15:48:18 2016 +0000
- Revision:
- 19:4dfa28d37b8f
- Parent:
- 15:2610823f7f2e
- Child:
- 20:32d24a6355b5
Use correct M2XStreamClient.cpp file
Who changed what in which revision?
User | Revision | Line number | New 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 | 19:4dfa28d37b8f | 85 | bytes += print->print(values[value_index]); |
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 |