Renesas GR-Peach integrated with dweet.io

Dependencies:   EthernetInterfaceprivate HTTPClient PubNub mbed-rtos mbed picojson spxml

Committer:
nikhilchaturtvedi
Date:
Fri Oct 23 20:18:55 2015 +0000
Revision:
0:675ae62a5261
Renesas GR-Peach dweet test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nikhilchaturtvedi 0:675ae62a5261 1 #include "HTTPClient.h"
nikhilchaturtvedi 0:675ae62a5261 2 #include "picojson.h"
nikhilchaturtvedi 0:675ae62a5261 3 #include "spdomparser.hpp"
nikhilchaturtvedi 0:675ae62a5261 4 #include "spxmlnode.hpp"
nikhilchaturtvedi 0:675ae62a5261 5 #include "spxmlhandle.hpp"
nikhilchaturtvedi 0:675ae62a5261 6 #include "PubNub.h"
nikhilchaturtvedi 0:675ae62a5261 7 #include "mbed.h"
nikhilchaturtvedi 0:675ae62a5261 8 #include "EthernetInterface.h"
nikhilchaturtvedi 0:675ae62a5261 9
nikhilchaturtvedi 0:675ae62a5261 10 /*****Function defs*****/
nikhilchaturtvedi 0:675ae62a5261 11 void read_temp();
nikhilchaturtvedi 0:675ae62a5261 12 char* get_time();
nikhilchaturtvedi 0:675ae62a5261 13 void get_weather();
nikhilchaturtvedi 0:675ae62a5261 14 void parseWeather(SP_XmlElementNode *node);
nikhilchaturtvedi 0:675ae62a5261 15 void read_and_execute_message(PubNub &pn, const char *jsonmsg);
nikhilchaturtvedi 0:675ae62a5261 16 void publish_to_pubnub(PubNub &pn);
nikhilchaturtvedi 0:675ae62a5261 17 int pubnub_main();
nikhilchaturtvedi 0:675ae62a5261 18 /***********************/
nikhilchaturtvedi 0:675ae62a5261 19
nikhilchaturtvedi 0:675ae62a5261 20 /********Change these values accordingly********/
nikhilchaturtvedi 0:675ae62a5261 21 const char* ip_address = "143.103.6.188"; //change to your ip address
nikhilchaturtvedi 0:675ae62a5261 22 const char* subnet = "255.255.255.0";
nikhilchaturtvedi 0:675ae62a5261 23 const char* gateway = "143.103.6.254"; //change this
nikhilchaturtvedi 0:675ae62a5261 24 /***********************************************/
nikhilchaturtvedi 0:675ae62a5261 25
nikhilchaturtvedi 0:675ae62a5261 26 /*********Keys for PubNub************/
nikhilchaturtvedi 0:675ae62a5261 27 const char pubkey[] = "pub-c-0fee6373-fae0-4aa9-9fe9-b9b48605a82f"; //fill from the pubnub application
nikhilchaturtvedi 0:675ae62a5261 28 const char subkey[] = "sub-c-62761692-404d-11e5-976c-02ee2ddab7fe"; //fill from the pubnub application
nikhilchaturtvedi 0:675ae62a5261 29 const char channel[] = "peach-channel"; //name given to your channel
nikhilchaturtvedi 0:675ae62a5261 30 /************************************/
nikhilchaturtvedi 0:675ae62a5261 31
nikhilchaturtvedi 0:675ae62a5261 32 Serial pc_console(USBTX, USBRX);
nikhilchaturtvedi 0:675ae62a5261 33 EthernetInterface ethernet;
nikhilchaturtvedi 0:675ae62a5261 34
nikhilchaturtvedi 0:675ae62a5261 35 /*Temp sensor ; for this example, used a MAX31723 sensor interfaced through SPI*/
nikhilchaturtvedi 0:675ae62a5261 36 SPI temp_sensor(P4_6, P4_7, P4_4);
nikhilchaturtvedi 0:675ae62a5261 37 DigitalOut chip_select(P4_5);
nikhilchaturtvedi 0:675ae62a5261 38
nikhilchaturtvedi 0:675ae62a5261 39 PubNub pubnub(pubkey, subkey);
nikhilchaturtvedi 0:675ae62a5261 40
nikhilchaturtvedi 0:675ae62a5261 41
nikhilchaturtvedi 0:675ae62a5261 42 int main()
nikhilchaturtvedi 0:675ae62a5261 43 {
nikhilchaturtvedi 0:675ae62a5261 44 pc_console.baud(115200); //set the serial com baud rate
nikhilchaturtvedi 0:675ae62a5261 45
nikhilchaturtvedi 0:675ae62a5261 46 ethernet.init(ip_address, subnet, gateway);
nikhilchaturtvedi 0:675ae62a5261 47 pc_console.printf("Init eth\n");
nikhilchaturtvedi 0:675ae62a5261 48
nikhilchaturtvedi 0:675ae62a5261 49 ethernet.connect();
nikhilchaturtvedi 0:675ae62a5261 50 pc_console.printf("Connected eth\n");
nikhilchaturtvedi 0:675ae62a5261 51
nikhilchaturtvedi 0:675ae62a5261 52 pubnub_main(); //start the PubNub main loop
nikhilchaturtvedi 0:675ae62a5261 53
nikhilchaturtvedi 0:675ae62a5261 54 }
nikhilchaturtvedi 0:675ae62a5261 55
nikhilchaturtvedi 0:675ae62a5261 56 /*Publish a message to PubNub*/
nikhilchaturtvedi 0:675ae62a5261 57 void publish_to_pubnub(PubNub &pubnub)
nikhilchaturtvedi 0:675ae62a5261 58 {
nikhilchaturtvedi 0:675ae62a5261 59 char message[128];
nikhilchaturtvedi 0:675ae62a5261 60 PubNubRes ret = pubnub.publish(channel, message);
nikhilchaturtvedi 0:675ae62a5261 61 if (ret != PNR_OK) {}
nikhilchaturtvedi 0:675ae62a5261 62
nikhilchaturtvedi 0:675ae62a5261 63 }
nikhilchaturtvedi 0:675ae62a5261 64
nikhilchaturtvedi 0:675ae62a5261 65 /*Read message from PubNub and perform an operation*/
nikhilchaturtvedi 0:675ae62a5261 66 void read_and_execute_message(PubNub &pubnub, const char *message)
nikhilchaturtvedi 0:675ae62a5261 67 {
nikhilchaturtvedi 0:675ae62a5261 68 picojson::value msg;
nikhilchaturtvedi 0:675ae62a5261 69 std::string err = picojson::parse(msg, message, message + strlen(message));
nikhilchaturtvedi 0:675ae62a5261 70 if (!err.empty()) {
nikhilchaturtvedi 0:675ae62a5261 71 return;
nikhilchaturtvedi 0:675ae62a5261 72 }
nikhilchaturtvedi 0:675ae62a5261 73
nikhilchaturtvedi 0:675ae62a5261 74 /*Use this message to read temp sensor value and send it to PubNub*/
nikhilchaturtvedi 0:675ae62a5261 75 if (msg.get("send_temperature").get<bool>())
nikhilchaturtvedi 0:675ae62a5261 76 {
nikhilchaturtvedi 0:675ae62a5261 77 publish_to_pubnub(pubnub);
nikhilchaturtvedi 0:675ae62a5261 78 }
nikhilchaturtvedi 0:675ae62a5261 79 /*Use this message to read the weather from openweather service and send the values to dweet.io
nikhilchaturtvedi 0:675ae62a5261 80 The message sent from PubNub console is { "weather": "get" }*/
nikhilchaturtvedi 0:675ae62a5261 81 if(msg.get("weather").is<std::string>())
nikhilchaturtvedi 0:675ae62a5261 82 {
nikhilchaturtvedi 0:675ae62a5261 83 get_weather();
nikhilchaturtvedi 0:675ae62a5261 84 }
nikhilchaturtvedi 0:675ae62a5261 85 }
nikhilchaturtvedi 0:675ae62a5261 86
nikhilchaturtvedi 0:675ae62a5261 87 /*The main PubNub loop function*/
nikhilchaturtvedi 0:675ae62a5261 88 int pubnub_main()
nikhilchaturtvedi 0:675ae62a5261 89 {
nikhilchaturtvedi 0:675ae62a5261 90
nikhilchaturtvedi 0:675ae62a5261 91 publish_to_pubnub(pubnub);
nikhilchaturtvedi 0:675ae62a5261 92 pc_console.printf("publish done\n");
nikhilchaturtvedi 0:675ae62a5261 93
nikhilchaturtvedi 0:675ae62a5261 94 while (1)
nikhilchaturtvedi 0:675ae62a5261 95 {
nikhilchaturtvedi 0:675ae62a5261 96
nikhilchaturtvedi 0:675ae62a5261 97 pc_console.printf("Subscribing\n");
nikhilchaturtvedi 0:675ae62a5261 98
nikhilchaturtvedi 0:675ae62a5261 99 char *reply = NULL;
nikhilchaturtvedi 0:675ae62a5261 100 PubNubRes result = pubnub.subscribe(channel, &reply);
nikhilchaturtvedi 0:675ae62a5261 101 if (result != PNR_OK) {
nikhilchaturtvedi 0:675ae62a5261 102
nikhilchaturtvedi 0:675ae62a5261 103 pc_console.printf("Error %d \n", result);
nikhilchaturtvedi 0:675ae62a5261 104 wait(1.0);
nikhilchaturtvedi 0:675ae62a5261 105 continue; //try again
nikhilchaturtvedi 0:675ae62a5261 106 }
nikhilchaturtvedi 0:675ae62a5261 107
nikhilchaturtvedi 0:675ae62a5261 108 if (reply)
nikhilchaturtvedi 0:675ae62a5261 109 {
nikhilchaturtvedi 0:675ae62a5261 110 read_and_execute_message(pubnub, reply);
nikhilchaturtvedi 0:675ae62a5261 111 }
nikhilchaturtvedi 0:675ae62a5261 112
nikhilchaturtvedi 0:675ae62a5261 113 wait(2); // just to avoid unnecessary busy loops
nikhilchaturtvedi 0:675ae62a5261 114 }
nikhilchaturtvedi 0:675ae62a5261 115 }
nikhilchaturtvedi 0:675ae62a5261 116
nikhilchaturtvedi 0:675ae62a5261 117 void get_weather()
nikhilchaturtvedi 0:675ae62a5261 118 {
nikhilchaturtvedi 0:675ae62a5261 119 HTTPClient weather_client;
nikhilchaturtvedi 0:675ae62a5261 120 char weather_message[128] = "";
nikhilchaturtvedi 0:675ae62a5261 121 char weather_response[812];
nikhilchaturtvedi 0:675ae62a5261 122 picojson::value msg;
nikhilchaturtvedi 0:675ae62a5261 123
nikhilchaturtvedi 0:675ae62a5261 124 sprintf(weather_message,"http://api.openweathermap.org/data/2.5/weather?q=%s,%s&mode=xml", "London", "uk");
nikhilchaturtvedi 0:675ae62a5261 125 pc_console.printf("URL %s\n", weather_message);
nikhilchaturtvedi 0:675ae62a5261 126 HTTPResult result;
nikhilchaturtvedi 0:675ae62a5261 127
nikhilchaturtvedi 0:675ae62a5261 128 result = weather_client.get(weather_message, weather_response, sizeof(weather_response));
nikhilchaturtvedi 0:675ae62a5261 129
nikhilchaturtvedi 0:675ae62a5261 130 pc_console.printf("Resp %s %d\n", weather_response, strlen(weather_response));
nikhilchaturtvedi 0:675ae62a5261 131
nikhilchaturtvedi 0:675ae62a5261 132 if(!result)
nikhilchaturtvedi 0:675ae62a5261 133 {
nikhilchaturtvedi 0:675ae62a5261 134 pc_console.printf("Weather response %s \n", weather_response);
nikhilchaturtvedi 0:675ae62a5261 135 }
nikhilchaturtvedi 0:675ae62a5261 136 else
nikhilchaturtvedi 0:675ae62a5261 137 {
nikhilchaturtvedi 0:675ae62a5261 138 pc_console.printf("Error code %d - %d - %s \n", result, weather_client.getHTTPResponseCode(), weather_response);
nikhilchaturtvedi 0:675ae62a5261 139 }
nikhilchaturtvedi 0:675ae62a5261 140
nikhilchaturtvedi 0:675ae62a5261 141 /*Parse the XML from openweather service
nikhilchaturtvedi 0:675ae62a5261 142 * Parsing is done here just for simplicity's sake*/
nikhilchaturtvedi 0:675ae62a5261 143 SP_XmlDomParser parser;
nikhilchaturtvedi 0:675ae62a5261 144 parser.append(weather_response, strlen(weather_response));
nikhilchaturtvedi 0:675ae62a5261 145
nikhilchaturtvedi 0:675ae62a5261 146 SP_XmlHandle rootHandle(parser.getDocument()->getRootElement());
nikhilchaturtvedi 0:675ae62a5261 147
nikhilchaturtvedi 0:675ae62a5261 148 SP_XmlElementNode *city_child = rootHandle.getChild("city").toElement();
nikhilchaturtvedi 0:675ae62a5261 149 SP_XmlElementNode *city_coord_child = rootHandle.getChild("city").getChild("coord").toElement();
nikhilchaturtvedi 0:675ae62a5261 150
nikhilchaturtvedi 0:675ae62a5261 151 SP_XmlElementNode *temperature_child;
nikhilchaturtvedi 0:675ae62a5261 152
nikhilchaturtvedi 0:675ae62a5261 153 temperature_child = rootHandle.getChild("temperature").toElement();
nikhilchaturtvedi 0:675ae62a5261 154 pc_console.printf("Child %s\n", temperature_child->getAttrValue("value"));
nikhilchaturtvedi 0:675ae62a5261 155 pc_console.printf("Temp unit %d\n", temperature_child->getAttrValue("unit"));
nikhilchaturtvedi 0:675ae62a5261 156
nikhilchaturtvedi 0:675ae62a5261 157 SP_XmlElementNode *humidity_child = rootHandle.getChild("humidity").toElement();
nikhilchaturtvedi 0:675ae62a5261 158
nikhilchaturtvedi 0:675ae62a5261 159 SP_XmlElementNode *wind_child = rootHandle.getChild("wind").getChild("speed").toElement();
nikhilchaturtvedi 0:675ae62a5261 160 pc_console.printf("Wind speed %s\n", wind_child->getAttrValue("value"));
nikhilchaturtvedi 0:675ae62a5261 161 pc_console.printf("Wind name %s\n", wind_child->getAttrValue("name"));
nikhilchaturtvedi 0:675ae62a5261 162
nikhilchaturtvedi 0:675ae62a5261 163 SP_XmlElementNode *wind_direction_child = rootHandle.getChild("wind").getChild("direction").toElement();
nikhilchaturtvedi 0:675ae62a5261 164 pc_console.printf("Wind direction %s\n", wind_direction_child->getAttrValue("name"));
nikhilchaturtvedi 0:675ae62a5261 165
nikhilchaturtvedi 0:675ae62a5261 166 SP_XmlElementNode *sky_child = rootHandle.getChild("weather").toElement();
nikhilchaturtvedi 0:675ae62a5261 167 pc_console.printf("Weather type %s\n", sky_child->getAttrValue("value"));
nikhilchaturtvedi 0:675ae62a5261 168
nikhilchaturtvedi 0:675ae62a5261 169 char dweet_resp[512];
nikhilchaturtvedi 0:675ae62a5261 170 char message_to_dweet[128] = "";
nikhilchaturtvedi 0:675ae62a5261 171 char thing_name[] = "Peach"; //name of the "thing" on dweet; change this for your own "thing name"
nikhilchaturtvedi 0:675ae62a5261 172
nikhilchaturtvedi 0:675ae62a5261 173 /*Uploading only the city name, temperature and its unit; can upload many more parsed values in the same format as below
nikhilchaturtvedi 0:675ae62a5261 174 Also, time stamp for the update can be posted by using the get_time() function*/
nikhilchaturtvedi 0:675ae62a5261 175 sprintf(message_to_dweet,"http://dweet.io/dweet/for/%s?City=%s&Temperature=%s&TempUnit=%s",
nikhilchaturtvedi 0:675ae62a5261 176 thing_name, city_child->getAttrValue("name"),
nikhilchaturtvedi 0:675ae62a5261 177 temperature_child->getAttrValue("value"),
nikhilchaturtvedi 0:675ae62a5261 178 temperature_child->getAttrValue("unit"));
nikhilchaturtvedi 0:675ae62a5261 179
nikhilchaturtvedi 0:675ae62a5261 180 pc_console.printf("Sending to dweet %s\n",message_to_dweet);
nikhilchaturtvedi 0:675ae62a5261 181 HTTPClient http;
nikhilchaturtvedi 0:675ae62a5261 182 int response = http.get(message_to_dweet, dweet_resp, sizeof(dweet_resp));
nikhilchaturtvedi 0:675ae62a5261 183
nikhilchaturtvedi 0:675ae62a5261 184 if(!response)
nikhilchaturtvedi 0:675ae62a5261 185 {
nikhilchaturtvedi 0:675ae62a5261 186 pc_console.printf("Response from dweet %s \n", dweet_resp);
nikhilchaturtvedi 0:675ae62a5261 187 } else
nikhilchaturtvedi 0:675ae62a5261 188 {
nikhilchaturtvedi 0:675ae62a5261 189 pc_console.printf("Error %d - HTTP response code = %d\n", response, http.getHTTPResponseCode());
nikhilchaturtvedi 0:675ae62a5261 190 }
nikhilchaturtvedi 0:675ae62a5261 191
nikhilchaturtvedi 0:675ae62a5261 192 wait(2);
nikhilchaturtvedi 0:675ae62a5261 193 }
nikhilchaturtvedi 0:675ae62a5261 194
nikhilchaturtvedi 0:675ae62a5261 195 /*Simple helper function for getting a child node*/
nikhilchaturtvedi 0:675ae62a5261 196 char* get_child_value(SP_XmlElementNode *node, char *value)
nikhilchaturtvedi 0:675ae62a5261 197 {
nikhilchaturtvedi 0:675ae62a5261 198 return (char*)node->getAttrValue(value);
nikhilchaturtvedi 0:675ae62a5261 199 }
nikhilchaturtvedi 0:675ae62a5261 200
nikhilchaturtvedi 0:675ae62a5261 201
nikhilchaturtvedi 0:675ae62a5261 202 /*Get the time for having a timestamp for dweet.io updates*/
nikhilchaturtvedi 0:675ae62a5261 203 char* get_time()
nikhilchaturtvedi 0:675ae62a5261 204 {
nikhilchaturtvedi 0:675ae62a5261 205 time_t seconds = time(NULL);
nikhilchaturtvedi 0:675ae62a5261 206 pc_console.printf("Seconds %d", seconds);
nikhilchaturtvedi 0:675ae62a5261 207 pc_console.printf("Time %s" ,ctime(&seconds));
nikhilchaturtvedi 0:675ae62a5261 208
nikhilchaturtvedi 0:675ae62a5261 209 char time_buf[32];
nikhilchaturtvedi 0:675ae62a5261 210 strftime(time_buf, sizeof(time_buf), "%I %M %p \n", localtime(&seconds));
nikhilchaturtvedi 0:675ae62a5261 211 pc_console.printf("Formatted time %s \n", time_buf);
nikhilchaturtvedi 0:675ae62a5261 212
nikhilchaturtvedi 0:675ae62a5261 213 return ctime(&seconds);
nikhilchaturtvedi 0:675ae62a5261 214 }
nikhilchaturtvedi 0:675ae62a5261 215
nikhilchaturtvedi 0:675ae62a5261 216 /*Unimplemented temp sensor read function; use it for your own sensor device*/
nikhilchaturtvedi 0:675ae62a5261 217 void read_temp()
nikhilchaturtvedi 0:675ae62a5261 218 {}