Code for an ethernet-enabled mbed that calls to a web api, and reasons with JSON resonses

Dependencies:   NetServices RPCInterface mbed picojson xbee_api

Committer:
ammanvedi
Date:
Sun Jan 26 20:49:03 2014 +0000
Revision:
4:fe02d3c20559
Parent:
3:2f263c4517e2
v1, works with server and msp430 with xbee chip

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ammanvedi 0:d956c5c1bdd6 1 #include "mbed.h"
ammanvedi 0:d956c5c1bdd6 2 #include "EthernetNetIf.h"
ammanvedi 0:d956c5c1bdd6 3 #include "HTTPClient.h"
ammanvedi 0:d956c5c1bdd6 4 #include "NTPClient.h"
ammanvedi 0:d956c5c1bdd6 5 #include "HTTPServer.h"
ammanvedi 0:d956c5c1bdd6 6 #include "RPCFunction.h"
ammanvedi 3:2f263c4517e2 7 #include <sstream>
ammanvedi 4:fe02d3c20559 8 #include "picojson.h"
ammanvedi 4:fe02d3c20559 9 #include "xbee.h"
ammanvedi 4:fe02d3c20559 10 #include "xbeeFrame.h"
ammanvedi 3:2f263c4517e2 11
ammanvedi 2:86f64948da0f 12
ammanvedi 0:d956c5c1bdd6 13
ammanvedi 0:d956c5c1bdd6 14 #define HOSTNAME "HUB-01"
ammanvedi 3:2f263c4517e2 15 #define DEVICENAME "ADAM"
ammanvedi 3:2f263c4517e2 16
ammanvedi 3:2f263c4517e2 17
ammanvedi 0:d956c5c1bdd6 18
ammanvedi 0:d956c5c1bdd6 19 EthernetNetIf eth(HOSTNAME);
ammanvedi 0:d956c5c1bdd6 20 HTTPClient http;
ammanvedi 0:d956c5c1bdd6 21 NTPClient ntp;
ammanvedi 4:fe02d3c20559 22 Ticker pull_ticker;
ammanvedi 4:fe02d3c20559 23 xbeeFrame xbee(p9,p10,p11);
ammanvedi 4:fe02d3c20559 24
ammanvedi 4:fe02d3c20559 25 const char dest_address[8] = {0x00, 0x13, 0xA2, 0x00, 0x40, 0x9B, 0x6D, 0xB0};
ammanvedi 4:fe02d3c20559 26 const char payload[] = "connection_from_host";
ammanvedi 4:fe02d3c20559 27
ammanvedi 4:fe02d3c20559 28 char send_data[50] = "xbee string";
ammanvedi 4:fe02d3c20559 29
ammanvedi 0:d956c5c1bdd6 30
ammanvedi 1:7485d913aaf5 31 using namespace std;
ammanvedi 0:d956c5c1bdd6 32
ammanvedi 4:fe02d3c20559 33
ammanvedi 4:fe02d3c20559 34 void pull_updates(){
ammanvedi 4:fe02d3c20559 35
ammanvedi 4:fe02d3c20559 36 HTTPText a_txt;
ammanvedi 4:fe02d3c20559 37
ammanvedi 4:fe02d3c20559 38 HTTPResult rs = http.get("192.168.0.4:3000/pull_updates", &a_txt);
ammanvedi 4:fe02d3c20559 39 if (rs==HTTP_OK) {
ammanvedi 4:fe02d3c20559 40 printf("Result ok : %s (code : %d )\n\r", a_txt.gets(), rs);
ammanvedi 4:fe02d3c20559 41 } else {
ammanvedi 4:fe02d3c20559 42 printf("Error %s\n\r", a_txt.gets());
ammanvedi 4:fe02d3c20559 43 }
ammanvedi 4:fe02d3c20559 44
ammanvedi 4:fe02d3c20559 45 char id[30] = "";
ammanvedi 4:fe02d3c20559 46 char new_msg[50] = "";
ammanvedi 4:fe02d3c20559 47
ammanvedi 4:fe02d3c20559 48 sscanf((char *)a_txt.gets(), "%s %s", id, new_msg);
ammanvedi 4:fe02d3c20559 49 if(strlen(new_msg) == 0){
ammanvedi 4:fe02d3c20559 50 printf("no data\n\r");
ammanvedi 4:fe02d3c20559 51 return;
ammanvedi 4:fe02d3c20559 52 }else{
ammanvedi 4:fe02d3c20559 53 printf("update device %s with string %s\n\r", id, new_msg);
ammanvedi 4:fe02d3c20559 54 }
ammanvedi 4:fe02d3c20559 55
ammanvedi 4:fe02d3c20559 56 char to_send[100];
ammanvedi 4:fe02d3c20559 57 char* p = to_send;
ammanvedi 4:fe02d3c20559 58 char* r = send_data;
ammanvedi 4:fe02d3c20559 59 while(*r)
ammanvedi 4:fe02d3c20559 60 *p++ = *r++;
ammanvedi 4:fe02d3c20559 61 *p++ = ' ';
ammanvedi 4:fe02d3c20559 62 r = new_msg;
ammanvedi 4:fe02d3c20559 63 while(*r)
ammanvedi 4:fe02d3c20559 64 *p++ = *r++;
ammanvedi 4:fe02d3c20559 65 *p = '\0';
ammanvedi 4:fe02d3c20559 66
ammanvedi 4:fe02d3c20559 67
ammanvedi 4:fe02d3c20559 68
ammanvedi 4:fe02d3c20559 69 char data_buf[50];
ammanvedi 4:fe02d3c20559 70 xbee.InitFrame();
ammanvedi 4:fe02d3c20559 71 xbee.SetDestination((unsigned char *)dest_address);
ammanvedi 4:fe02d3c20559 72 xbee.SetPayload(to_send);
ammanvedi 4:fe02d3c20559 73 xbee.AssembleFrame();
ammanvedi 4:fe02d3c20559 74 xbee.SendFrame();
ammanvedi 4:fe02d3c20559 75
ammanvedi 4:fe02d3c20559 76
ammanvedi 4:fe02d3c20559 77 for(int i = 0; i<2; i++)
ammanvedi 4:fe02d3c20559 78 {
ammanvedi 4:fe02d3c20559 79 xbee.ReceiveFrame(data_buf, 500);
ammanvedi 4:fe02d3c20559 80 if(xbee.frameReceived)
ammanvedi 4:fe02d3c20559 81 {
ammanvedi 4:fe02d3c20559 82 xbee.frameReceived = 0;
ammanvedi 4:fe02d3c20559 83 if(xbee.GetType() == TX_STATUS)
ammanvedi 4:fe02d3c20559 84 {
ammanvedi 4:fe02d3c20559 85 if(xbee.GetStatus() == 0)
ammanvedi 4:fe02d3c20559 86 printf("Send success!\n\r");
ammanvedi 4:fe02d3c20559 87 else
ammanvedi 4:fe02d3c20559 88 printf("Send failed :(\n\r");
ammanvedi 4:fe02d3c20559 89 }
ammanvedi 4:fe02d3c20559 90 else if (xbee.GetType() == RX_PACKET_64)
ammanvedi 4:fe02d3c20559 91 printf("Received data: %s\n\r", data_buf);
ammanvedi 4:fe02d3c20559 92 }
ammanvedi 4:fe02d3c20559 93 }
ammanvedi 4:fe02d3c20559 94
ammanvedi 4:fe02d3c20559 95
ammanvedi 4:fe02d3c20559 96
ammanvedi 4:fe02d3c20559 97
ammanvedi 4:fe02d3c20559 98
ammanvedi 4:fe02d3c20559 99 }
ammanvedi 4:fe02d3c20559 100
ammanvedi 0:d956c5c1bdd6 101 int main() {
ammanvedi 0:d956c5c1bdd6 102
ammanvedi 0:d956c5c1bdd6 103
ammanvedi 4:fe02d3c20559 104 printf("Try starting the program with the network disconnected and then connect after a few timeouts reported\n\n\r");
ammanvedi 0:d956c5c1bdd6 105 EthernetErr ethErr;
ammanvedi 0:d956c5c1bdd6 106 int count = 0;
ammanvedi 0:d956c5c1bdd6 107 do {
ammanvedi 4:fe02d3c20559 108 printf("Setting up %d...\n\r", ++count);
ammanvedi 0:d956c5c1bdd6 109 ethErr = eth.setup();
ammanvedi 4:fe02d3c20559 110 if (ethErr) printf("Timeout\n\r", ethErr);
ammanvedi 0:d956c5c1bdd6 111 } while (ethErr != ETH_OK);
ammanvedi 0:d956c5c1bdd6 112
ammanvedi 4:fe02d3c20559 113 printf("Connected OK\n\r");
ammanvedi 0:d956c5c1bdd6 114 const char* hwAddr = eth.getHwAddr();
ammanvedi 4:fe02d3c20559 115 printf("HW address : %02x:%02x:%02x:%02x:%02x:%02x\n\r",
ammanvedi 0:d956c5c1bdd6 116 hwAddr[0], hwAddr[1], hwAddr[2],
ammanvedi 0:d956c5c1bdd6 117 hwAddr[3], hwAddr[4], hwAddr[5]);
ammanvedi 0:d956c5c1bdd6 118
ammanvedi 0:d956c5c1bdd6 119 IpAddr ethIp = eth.getIp();
ammanvedi 4:fe02d3c20559 120 printf("IP address : %d.%d.%d.%d\n\r", ethIp[0], ethIp[1], ethIp[2], ethIp[3]);
ammanvedi 2:86f64948da0f 121
ammanvedi 3:2f263c4517e2 122 char ip_buffer[20];
ammanvedi 3:2f263c4517e2 123 sprintf(ip_buffer, "%d.%d.%d.%d", ethIp[0], ethIp[1], ethIp[2], ethIp[3]);
ammanvedi 3:2f263c4517e2 124
ammanvedi 2:86f64948da0f 125 //the hub will register itself with the server
ammanvedi 2:86f64948da0f 126 HTTPMap msg;
ammanvedi 3:2f263c4517e2 127
ammanvedi 3:2f263c4517e2 128 stringstream url;
ammanvedi 3:2f263c4517e2 129 url << "192.168.0.4:3000/hubconnect?h_id=" << HOSTNAME << "&h_name=" << DEVICENAME << "&h_ip=" << ip_buffer;
ammanvedi 3:2f263c4517e2 130 const std::string uri = url.str();
ammanvedi 3:2f263c4517e2 131
ammanvedi 4:fe02d3c20559 132 printf("query server : %s \n\r", uri);
ammanvedi 2:86f64948da0f 133
ammanvedi 3:2f263c4517e2 134 HTTPResult r1 = http.post(uri.c_str(),msg,NULL);
ammanvedi 2:86f64948da0f 135 if( r1 == HTTP_OK )
ammanvedi 2:86f64948da0f 136 {
ammanvedi 4:fe02d3c20559 137 printf("Hub %s registered with server (code : %d )\n\r", HOSTNAME, r1);
ammanvedi 2:86f64948da0f 138 }
ammanvedi 2:86f64948da0f 139 else
ammanvedi 2:86f64948da0f 140 {
ammanvedi 4:fe02d3c20559 141 printf("Could not register, error : %d\n\r", r1);
ammanvedi 2:86f64948da0f 142 }
ammanvedi 2:86f64948da0f 143
ammanvedi 2:86f64948da0f 144
ammanvedi 2:86f64948da0f 145
ammanvedi 0:d956c5c1bdd6 146
ammanvedi 0:d956c5c1bdd6 147 printf("\nHTTPClient get...\n");
ammanvedi 0:d956c5c1bdd6 148 HTTPText txt;
ammanvedi 0:d956c5c1bdd6 149 HTTPResult r = http.get("192.168.0.4:3000/devices", &txt);
ammanvedi 0:d956c5c1bdd6 150 if (r==HTTP_OK) {
ammanvedi 4:fe02d3c20559 151 printf("Result ok : %s (code : %d )\n\r", txt.gets(), r);
ammanvedi 0:d956c5c1bdd6 152 } else {
ammanvedi 2:86f64948da0f 153 printf("Error %s\n", txt.gets());
ammanvedi 0:d956c5c1bdd6 154 }
ammanvedi 4:fe02d3c20559 155
ammanvedi 4:fe02d3c20559 156 //begin polling the server for updates to the devices
ammanvedi 4:fe02d3c20559 157
ammanvedi 4:fe02d3c20559 158 pull_ticker.attach(&pull_updates, 5.0);
ammanvedi 0:d956c5c1bdd6 159
ammanvedi 0:d956c5c1bdd6 160
ammanvedi 0:d956c5c1bdd6 161 }