Renesas GR-Peach integrated with dweet.io
Dependencies: EthernetInterfaceprivate HTTPClient PubNub mbed-rtos mbed picojson spxml
main.cpp@0:675ae62a5261, 2015-10-23 (annotated)
- 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?
User | Revision | Line number | New 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 | {} |