Code for an ethernet-enabled mbed that calls to a web api, and reasons with JSON resonses
Dependencies: NetServices RPCInterface mbed picojson xbee_api
main.cpp@4:fe02d3c20559, 2014-01-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |