SenseClient is an API to interact with Sen.se platform. Sen.se is the place where Humans, Machines, Objects, Environments, Information, Physical and Virtual spaces mix up, talk, intertwine, interact, enrich and empower each other.

Dependencies:   NetServicesProxy

Dependents:   SenseClientSample

Committer:
mimil
Date:
Wed Jul 11 13:55:07 2012 +0000
Revision:
1:0249701444ee
Parent:
0:ed7287a3edbf
new version using a web server to receive messages from the sen.se platform

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mimil 0:ed7287a3edbf 1 /*
mimil 0:ed7287a3edbf 2 Copyright [2011] [mimilowns@gmail.com]
mimil 0:ed7287a3edbf 3
mimil 0:ed7287a3edbf 4 Licensed under the Apache License, Version 2.0 (the "License");
mimil 0:ed7287a3edbf 5 you may not use this file except in compliance with the License.
mimil 0:ed7287a3edbf 6 You may obtain a copy of the License at
mimil 0:ed7287a3edbf 7
mimil 0:ed7287a3edbf 8 http://www.apache.org/licenses/LICENSE-2.0
mimil 0:ed7287a3edbf 9
mimil 0:ed7287a3edbf 10 Unless required by applicable law or agreed to in writing, software
mimil 0:ed7287a3edbf 11 distributed under the License is distributed on an "AS IS" BASIS,
mimil 0:ed7287a3edbf 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mimil 0:ed7287a3edbf 13 See the License for the specific language governing permissions and
mimil 0:ed7287a3edbf 14 limitations under the License.
mimil 0:ed7287a3edbf 15 */
mimil 0:ed7287a3edbf 16 #ifndef SENSECLIENT_H_
mimil 0:ed7287a3edbf 17 #define SENSECLIENT_H_
mimil 0:ed7287a3edbf 18
mimil 0:ed7287a3edbf 19 #include "mbed.h"
mimil 0:ed7287a3edbf 20 #include "HTTPClient.h"
mimil 1:0249701444ee 21 #include "HTTPServer.h"
mimil 1:0249701444ee 22 #include "SenseHandler.h"
mimil 1:0249701444ee 23
mimil 1:0249701444ee 24
mimil 1:0249701444ee 25
mimil 1:0249701444ee 26
mimil 1:0249701444ee 27 // Helper macro to convert two-character hex strings to character value
mimil 1:0249701444ee 28 #define ToHex(Y) (Y>='0'&&Y<='9'?Y-'0':Y-'A'+10)
mimil 0:ed7287a3edbf 29
mimil 0:ed7287a3edbf 30 /**
mimil 0:ed7287a3edbf 31 * SenseClient is an API to interact with Sen.se platform.
mimil 0:ed7287a3edbf 32 *
mimil 0:ed7287a3edbf 33 * @code
mimil 0:ed7287a3edbf 34 * #include "SenseClient.h"
mimil 0:ed7287a3edbf 35 * #include "picojson.h" //eventualy
mimil 0:ed7287a3edbf 36 *
mimil 0:ed7287a3edbf 37 * SenseClient sense("my sen.se key", "http://proxy:port"); // or "" for no proxy
mimil 0:ed7287a3edbf 38 * string feedID = "a feed id";
mimil 0:ed7287a3edbf 39 * string deviceID = "a device id";
mimil 0:ed7287a3edbf 40 *
mimil 0:ed7287a3edbf 41 * int main() {
mimil 0:ed7287a3edbf 42 * // init network etc.
mimil 0:ed7287a3edbf 43 *
mimil 0:ed7287a3edbf 44 * sense.PostEvent(feedID, tosend);
mimil 0:ed7287a3edbf 45 * if (sense.Result() == HTTP_OK) {
mimil 0:ed7287a3edbf 46 * const char* response = sense.ResponseContent().gets();
mimil 0:ed7287a3edbf 47 * printf("http response content: %s\r\n", response);
mimil 0:ed7287a3edbf 48 * // ...
mimil 0:ed7287a3edbf 49 * } else {
mimil 0:ed7287a3edbf 50 * printf("Sen.se result / response code : %d / %d\r\n", sense.Result(), sense.Response());
mimil 0:ed7287a3edbf 51 * }
mimil 0:ed7287a3edbf 52 * @endcode
mimil 0:ed7287a3edbf 53 */
mimil 0:ed7287a3edbf 54 class SenseClient {
mimil 0:ed7287a3edbf 55
mimil 0:ed7287a3edbf 56 public:
mimil 0:ed7287a3edbf 57 /**
mimil 0:ed7287a3edbf 58 * Creates a client to interacte with sen.se platform.
mimil 0:ed7287a3edbf 59 *
mimil 0:ed7287a3edbf 60 * @param senseKey your credential on sen.se platform.
mimil 0:ed7287a3edbf 61 * @param httpproxy using format http://<ip addr>:<port> or an empty string if using a direct connection.
mimil 0:ed7287a3edbf 62 */
mimil 0:ed7287a3edbf 63 SenseClient(const string& senseKey, const string& httpproxy);
mimil 0:ed7287a3edbf 64 virtual ~SenseClient();
mimil 0:ed7287a3edbf 65
mimil 0:ed7287a3edbf 66 /**
mimil 0:ed7287a3edbf 67 * Posts an event from device to sen.se platform to the given feed. The value must be
mimil 0:ed7287a3edbf 68 * a valid json string which means that it must be surrounded by double-quotes and other
mimil 0:ed7287a3edbf 69 * quotes must be escaped etc.
mimil 0:ed7287a3edbf 70 *
mimil 0:ed7287a3edbf 71 * Some examples of value:
mimil 0:ed7287a3edbf 72 * @code
mimil 0:ed7287a3edbf 73 * string value1 = "\"a text\"";
mimil 0:ed7287a3edbf 74 * string value2 = "\"10\"";
mimil 0:ed7287a3edbf 75 * string value3 = "\"{\\"aa\\":\\"tt\\",\\"bb\\":1.660000}\"";
mimil 0:ed7287a3edbf 76 * @endcode
mimil 0:ed7287a3edbf 77 *
mimil 0:ed7287a3edbf 78 * You can also use picojson library (http://mbed.org/users/mimil/libraries/picojson/lwryzp) as the following:
mimil 0:ed7287a3edbf 79 * @code
mimil 0:ed7287a3edbf 80 * picojson::object v;
mimil 0:ed7287a3edbf 81 * v["aa"] = picojson::value(string("tt"));
mimil 0:ed7287a3edbf 82 * v["bb"] = picojson::value(double(1.66));
mimil 0:ed7287a3edbf 83 * string str = picojson::value(v).serialize();
mimil 0:ed7287a3edbf 84 * // if you want to send your data as a json value,
mimil 0:ed7287a3edbf 85 * // you have to know that it is in fact a string inside another json
mimil 0:ed7287a3edbf 86 * // so it needs to be escaped as any json string
mimil 0:ed7287a3edbf 87 * string value4 = picojson::value(str).serialize();
mimil 0:ed7287a3edbf 88 * @endcode
mimil 0:ed7287a3edbf 89 *
mimil 0:ed7287a3edbf 90 * The effective json sent to sen.se platform will be:
mimil 0:ed7287a3edbf 91 * @code
mimil 0:ed7287a3edbf 92 * {
mimil 0:ed7287a3edbf 93 * "feed_id":4293,
mimil 0:ed7287a3edbf 94 * "value":"{\"aa\":\"tt\",\"bb\":1.660000}"
mimil 0:ed7287a3edbf 95 * }
mimil 0:ed7287a3edbf 96 * @endcode
mimil 0:ed7287a3edbf 97 *
mimil 0:ed7287a3edbf 98 * The response of the call will be available on SenseClient::ResponseContent method and will be
mimil 0:ed7287a3edbf 99 * a json like this:
mimil 0:ed7287a3edbf 100 * @code
mimil 0:ed7287a3edbf 101 * [
mimil 0:ed7287a3edbf 102 * {
mimil 0:ed7287a3edbf 103 * "publish_id": "5234C4C389AC2",
mimil 0:ed7287a3edbf 104 * "value": "{\"aa\":\"tt\",\"bb\":1.660000}",
mimil 0:ed7287a3edbf 105 * "timetag": "2011-09-06T12:35:15.559778+00:00",
mimil 0:ed7287a3edbf 106 * "feed_id": 4293,
mimil 0:ed7287a3edbf 107 * "id": 29768312,
mimil 0:ed7287a3edbf 108 * "unit": ""
mimil 0:ed7287a3edbf 109 * }
mimil 0:ed7287a3edbf 110 * ]
mimil 0:ed7287a3edbf 111 * @endcode
mimil 0:ed7287a3edbf 112 *
mimil 0:ed7287a3edbf 113 * @param feedID the feed ID on which you want to post.
mimil 0:ed7287a3edbf 114 * @param value a valid json string.
mimil 0:ed7287a3edbf 115 */
mimil 0:ed7287a3edbf 116 void PostEvent(const string& feedID, const string& value);
mimil 0:ed7287a3edbf 117 /**
mimil 0:ed7287a3edbf 118 * Retrieves the latest event from the given feed.
mimil 0:ed7287a3edbf 119 *
mimil 0:ed7287a3edbf 120 * The response of the call will be available on SenseClient::ResponseContent method and will be
mimil 0:ed7287a3edbf 121 * a json like this:
mimil 0:ed7287a3edbf 122 * @code
mimil 0:ed7287a3edbf 123 * {
mimil 0:ed7287a3edbf 124 * "publish_id": "5234C4C389AC2",
mimil 0:ed7287a3edbf 125 * "value": "{\"aa\":\"tt\",\"bb\":1.660000}",
mimil 0:ed7287a3edbf 126 * "timetag": "2011-09-06T12:35:15+00:00",
mimil 0:ed7287a3edbf 127 * "feed_id": 4293,
mimil 0:ed7287a3edbf 128 * "id": 29768312,
mimil 0:ed7287a3edbf 129 * "unit": ""
mimil 0:ed7287a3edbf 130 * }
mimil 0:ed7287a3edbf 131 * @endcode
mimil 0:ed7287a3edbf 132 *
mimil 0:ed7287a3edbf 133 * @param feedID the feed ID you want to query.
mimil 0:ed7287a3edbf 134 */
mimil 0:ed7287a3edbf 135 void GetLastFeedEvent(const string& feedID);
mimil 0:ed7287a3edbf 136 /**
mimil 0:ed7287a3edbf 137 * Retrieves the latest event from the given device.
mimil 0:ed7287a3edbf 138 *
mimil 0:ed7287a3edbf 139 * The response of the call will be available on SenseClient::ResponseContent method and will be
mimil 0:ed7287a3edbf 140 * a json like this:
mimil 0:ed7287a3edbf 141 * @code
mimil 0:ed7287a3edbf 142 * {
mimil 0:ed7287a3edbf 143 * "publish_id": "5234C4C389AC2",
mimil 0:ed7287a3edbf 144 * "value": "{\"aa\":\"tt\",\"bb\":1.660000}",
mimil 0:ed7287a3edbf 145 * "timetag": "2011-09-06T12:35:15+00:00",
mimil 0:ed7287a3edbf 146 * "feed_id": 4293,
mimil 0:ed7287a3edbf 147 * "id": 29768312,
mimil 0:ed7287a3edbf 148 * "unit": ""
mimil 0:ed7287a3edbf 149 * }
mimil 0:ed7287a3edbf 150 * @endcode
mimil 0:ed7287a3edbf 151 *
mimil 0:ed7287a3edbf 152 * @param deviceID the device ID you want to query.
mimil 0:ed7287a3edbf 153 */
mimil 0:ed7287a3edbf 154 void GetDeviceLastEvent(const string& deviceID);
mimil 0:ed7287a3edbf 155
mimil 0:ed7287a3edbf 156 //void GetFeedEvents();
mimil 0:ed7287a3edbf 157 //void GetDeviceEvents();
mimil 0:ed7287a3edbf 158 //void GetAccountEvents();
mimil 0:ed7287a3edbf 159
mimil 0:ed7287a3edbf 160
mimil 0:ed7287a3edbf 161 /**
mimil 0:ed7287a3edbf 162 * Returns the HTTPClient result of the last HTTP call.
mimil 0:ed7287a3edbf 163 *
mimil 0:ed7287a3edbf 164 * @returns The last call result.
mimil 0:ed7287a3edbf 165 */
mimil 0:ed7287a3edbf 166 HTTPResult Result();
mimil 0:ed7287a3edbf 167 /**
mimil 0:ed7287a3edbf 168 * Returns the HTTP response code of the last HTTP call.
mimil 0:ed7287a3edbf 169 *
mimil 0:ed7287a3edbf 170 * @returns The last HTTP code.
mimil 0:ed7287a3edbf 171 */
mimil 0:ed7287a3edbf 172 int Response();
mimil 0:ed7287a3edbf 173 /**
mimil 0:ed7287a3edbf 174 * Returns the content payload of the last HTTP call.
mimil 0:ed7287a3edbf 175 *
mimil 0:ed7287a3edbf 176 * You can use picojson library to parse the content like this:
mimil 0:ed7287a3edbf 177 * @code
mimil 0:ed7287a3edbf 178 * picojson::value v2;
mimil 0:ed7287a3edbf 179 * const char* response = sense.ResponseContent().gets();
mimil 0:ed7287a3edbf 180 * printf("http response content: %s\r\n", response);
mimil 0:ed7287a3edbf 181 * string err = picojson::parse(v2, response, response + strlen(response));
mimil 0:ed7287a3edbf 182 * printf("--> res error: %s\r\n", err.c_str());
mimil 0:ed7287a3edbf 183 * printf("--> res isarray: %d\r\n", v2.is<picojson::array>());
mimil 0:ed7287a3edbf 184 * if(v2.is<picojson::array>()) {
mimil 0:ed7287a3edbf 185 * // this is a response from PostEvent
mimil 0:ed7287a3edbf 186 * printf("--> res date: %s\r\n", v2.get(0).get("timetag").get<string>());
mimil 0:ed7287a3edbf 187 * }
mimil 0:ed7287a3edbf 188 * @endcode
mimil 0:ed7287a3edbf 189 *
mimil 0:ed7287a3edbf 190 * @returns The content payload.
mimil 0:ed7287a3edbf 191 */
mimil 0:ed7287a3edbf 192 HTTPText SenseClient::ResponseContent();
mimil 1:0249701444ee 193
mimil 1:0249701444ee 194 /**
mimil 1:0249701444ee 195 * Returns the given parameter value identified by its name from the given http query string.
mimil 1:0249701444ee 196 *
mimil 1:0249701444ee 197 * @return The parameter value
mimil 1:0249701444ee 198 * @param queryString The http query string
mimil 1:0249701444ee 199 * @param name The parameter name
mimil 1:0249701444ee 200 */
mimil 1:0249701444ee 201 char* getParam(char *queryString, const char *name);
mimil 1:0249701444ee 202
mimil 1:0249701444ee 203 /**
mimil 1:0249701444ee 204 * Starts an http server to receive messages from sen.se platform. A function void parseEvent(char* content) MUST be defined in your main.
mimil 1:0249701444ee 205 *
mimil 1:0249701444ee 206 * @param port The port on which to start the http server
mimil 1:0249701444ee 207 */
mimil 1:0249701444ee 208 void startHttpServer(int port);
mimil 1:0249701444ee 209
mimil 1:0249701444ee 210
mimil 0:ed7287a3edbf 211
mimil 0:ed7287a3edbf 212 private:
mimil 0:ed7287a3edbf 213 HTTPText _jsonContent;
mimil 0:ed7287a3edbf 214 HTTPText _jsonRespContent;
mimil 0:ed7287a3edbf 215 string _key;
mimil 0:ed7287a3edbf 216 string _proxy;
mimil 0:ed7287a3edbf 217
mimil 0:ed7287a3edbf 218 HTTPResult _result;
mimil 0:ed7287a3edbf 219 int _response;
mimil 1:0249701444ee 220
mimil 1:0249701444ee 221 HTTPServer _svr;
mimil 1:0249701444ee 222
mimil 0:ed7287a3edbf 223
mimil 0:ed7287a3edbf 224 };
mimil 0:ed7287a3edbf 225
mimil 0:ed7287a3edbf 226 #endif // SENSECLIENT_H_