tes
Dependencies: ASyncTicker EthernetInterface WebSocketClient mbed-rtos mbed MbedJSONValue xbee_lib
main.cpp@8:0d7ab8af0e59, 2014-06-18 (annotated)
- Committer:
- ammanvedi
- Date:
- Wed Jun 18 17:45:56 2014 +0000
- Revision:
- 8:0d7ab8af0e59
- Parent:
- 7:7039646b7083
x;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ammanvedi | 0:d73af3f5c81d | 1 | #include "mbed.h" |
ammanvedi | 0:d73af3f5c81d | 2 | #include "EthernetInterface.h" |
ammanvedi | 0:d73af3f5c81d | 3 | #include <stdio.h> |
ammanvedi | 0:d73af3f5c81d | 4 | #include "Websocket.h" |
ammanvedi | 1:6c1df6c9be4d | 5 | #include "xbee.h" |
ammanvedi | 1:6c1df6c9be4d | 6 | #include "xbeeFrame.h" |
ammanvedi | 4:84abfe990493 | 7 | #include "MbedJSONValue.h" |
ammanvedi | 3:28cd6502dafd | 8 | #include <ctype.h> |
ammanvedi | 4:84abfe990493 | 9 | #include <string> |
ammanvedi | 5:80a7d03c94f5 | 10 | #include "btNode.h" |
ammanvedi | 6:c1bd3fadce09 | 11 | #include <map> |
ammanvedi | 7:7039646b7083 | 12 | #include <utility> |
ammanvedi | 4:84abfe990493 | 13 | #define PORT 80 |
ammanvedi | 7:7039646b7083 | 14 | const std::string HUBID = "1"; |
ammanvedi | 3:28cd6502dafd | 15 | |
ammanvedi | 4:84abfe990493 | 16 | // status leds |
ammanvedi | 4:84abfe990493 | 17 | // led 1 |
ammanvedi | 4:84abfe990493 | 18 | // lit - successful ethernet connection |
ammanvedi | 3:28cd6502dafd | 19 | DigitalOut led_ethernet(LED1); |
ammanvedi | 4:84abfe990493 | 20 | |
ammanvedi | 4:84abfe990493 | 21 | // led 2 |
ammanvedi | 4:84abfe990493 | 22 | // lit - successful socket connection |
ammanvedi | 3:28cd6502dafd | 23 | DigitalOut led_socket(LED2); |
ammanvedi | 3:28cd6502dafd | 24 | |
ammanvedi | 6:c1bd3fadce09 | 25 | map<int, btNode> BTnodes; |
ammanvedi | 6:c1bd3fadce09 | 26 | |
ammanvedi | 4:84abfe990493 | 27 | EthernetInterface ethernet; |
ammanvedi | 4:84abfe990493 | 28 | Websocket ws("ws://192.168.0.4:8080/"); |
ammanvedi | 3:28cd6502dafd | 29 | |
ammanvedi | 7:7039646b7083 | 30 | bool sync_devices() |
ammanvedi | 7:7039646b7083 | 31 | { |
ammanvedi | 7:7039646b7083 | 32 | MbedJSONValue sync_data; |
ammanvedi | 5:80a7d03c94f5 | 33 | |
ammanvedi | 7:7039646b7083 | 34 | std::string sync_string; |
ammanvedi | 7:7039646b7083 | 35 | |
ammanvedi | 7:7039646b7083 | 36 | // fill the object |
ammanvedi | 7:7039646b7083 | 37 | sync_data["TYPE"] = "SYNC"; |
ammanvedi | 7:7039646b7083 | 38 | sync_data["ORIGIN"] = "HUB"; |
ammanvedi | 7:7039646b7083 | 39 | sync_data["ID"] = "N/A"; |
ammanvedi | 7:7039646b7083 | 40 | |
ammanvedi | 7:7039646b7083 | 41 | //sync_data["DATA"] = "N/A"; |
ammanvedi | 7:7039646b7083 | 42 | //iterate over local nodes and send node list to svr over socket |
ammanvedi | 7:7039646b7083 | 43 | |
ammanvedi | 7:7039646b7083 | 44 | // map<char, int>::iterator p; |
ammanvedi | 7:7039646b7083 | 45 | |
ammanvedi | 7:7039646b7083 | 46 | int index = 0; |
ammanvedi | 7:7039646b7083 | 47 | |
ammanvedi | 7:7039646b7083 | 48 | for (std::map<int, btNode>::iterator it = BTnodes.begin(); it != BTnodes.end(); ++it) |
ammanvedi | 7:7039646b7083 | 49 | { |
ammanvedi | 7:7039646b7083 | 50 | MbedJSONValue device = it->second.GetAsJSON(); |
ammanvedi | 7:7039646b7083 | 51 | printf("dev : %s\n\r", device.serialize()); |
ammanvedi | 7:7039646b7083 | 52 | sync_data["DEVICES"][index] = device.serialize(); |
ammanvedi | 7:7039646b7083 | 53 | index++; |
ammanvedi | 7:7039646b7083 | 54 | } |
ammanvedi | 7:7039646b7083 | 55 | sync_data["COUNT"] = index; |
ammanvedi | 7:7039646b7083 | 56 | sync_data["STATUS"] = "0"; |
ammanvedi | 7:7039646b7083 | 57 | |
ammanvedi | 7:7039646b7083 | 58 | sync_string = sync_data.serialize(); |
ammanvedi | 7:7039646b7083 | 59 | |
ammanvedi | 7:7039646b7083 | 60 | ws.send((char *)sync_string.c_str()); |
ammanvedi | 7:7039646b7083 | 61 | |
ammanvedi | 7:7039646b7083 | 62 | // serialize it into a JSON string |
ammanvedi | 7:7039646b7083 | 63 | |
ammanvedi | 7:7039646b7083 | 64 | |
ammanvedi | 7:7039646b7083 | 65 | return true; |
ammanvedi | 7:7039646b7083 | 66 | } |
ammanvedi | 5:80a7d03c94f5 | 67 | |
ammanvedi | 4:84abfe990493 | 68 | void pull_updates() |
ammanvedi | 4:84abfe990493 | 69 | { |
ammanvedi | 4:84abfe990493 | 70 | // build json request string |
ammanvedi | 4:84abfe990493 | 71 | MbedJSONValue request; |
ammanvedi | 4:84abfe990493 | 72 | |
ammanvedi | 4:84abfe990493 | 73 | std::string s; |
ammanvedi | 4:84abfe990493 | 74 | |
ammanvedi | 4:84abfe990493 | 75 | // fill the object |
ammanvedi | 4:84abfe990493 | 76 | request["TYPE"] = "UPDATE"; |
ammanvedi | 4:84abfe990493 | 77 | request["ORIGIN"] = "HUB"; |
ammanvedi | 4:84abfe990493 | 78 | request["ID"] = "N/A"; |
ammanvedi | 4:84abfe990493 | 79 | request["DATA"] = "N/A"; |
ammanvedi | 4:84abfe990493 | 80 | request["STATUS"] = "N/A"; |
ammanvedi | 4:84abfe990493 | 81 | |
ammanvedi | 4:84abfe990493 | 82 | // serialize it into a JSON string |
ammanvedi | 4:84abfe990493 | 83 | s = request.serialize(); |
ammanvedi | 4:84abfe990493 | 84 | |
ammanvedi | 4:84abfe990493 | 85 | // printf("json: %s\r\n", s.c_str()); |
ammanvedi | 4:84abfe990493 | 86 | |
ammanvedi | 4:84abfe990493 | 87 | char str[100]; |
ammanvedi | 4:84abfe990493 | 88 | char id[30]; |
ammanvedi | 4:84abfe990493 | 89 | char new_msg[50]; |
ammanvedi | 4:84abfe990493 | 90 | |
ammanvedi | 1:6c1df6c9be4d | 91 | // string with a message |
ammanvedi | 4:84abfe990493 | 92 | // sprintf(str, "PU"); |
ammanvedi | 4:84abfe990493 | 93 | ws.send((char *) s.c_str()); |
ammanvedi | 4:84abfe990493 | 94 | |
ammanvedi | 4:84abfe990493 | 95 | // clear the buffer and wait a sec... |
ammanvedi | 4:84abfe990493 | 96 | memset(str, 0, 100); |
ammanvedi | 4:84abfe990493 | 97 | wait(0.5f); |
ammanvedi | 3:28cd6502dafd | 98 | |
ammanvedi | 4:84abfe990493 | 99 | // websocket server should echo whatever we sent it |
ammanvedi | 4:84abfe990493 | 100 | if (ws.read(str)) |
ammanvedi | 4:84abfe990493 | 101 | { |
ammanvedi | 4:84abfe990493 | 102 | memset(id, 0, 30); |
ammanvedi | 4:84abfe990493 | 103 | memset(new_msg, 0, 50); |
ammanvedi | 4:84abfe990493 | 104 | |
ammanvedi | 4:84abfe990493 | 105 | // response from server is JSON |
ammanvedi | 4:84abfe990493 | 106 | // parse back to a traversable object |
ammanvedi | 4:84abfe990493 | 107 | MbedJSONValue updt_res; |
ammanvedi | 4:84abfe990493 | 108 | |
ammanvedi | 4:84abfe990493 | 109 | parse(updt_res, str); |
ammanvedi | 6:c1bd3fadce09 | 110 | printf("> %s from svr with data %s\n\r", updt_res["TYPE"].get<std::string>().c_str(), updt_res["DATA"].get<std::string>().c_str()); |
ammanvedi | 4:84abfe990493 | 111 | sscanf((char *) updt_res["DATA"].get<std::string>().c_str(), "%s %[^\t]", id, new_msg); |
ammanvedi | 4:84abfe990493 | 112 | |
ammanvedi | 4:84abfe990493 | 113 | // send string to xbee HERE |
ammanvedi | 4:84abfe990493 | 114 | if (strlen(new_msg) == 0) |
ammanvedi | 2:1c8d8d728b93 | 115 | { |
ammanvedi | 6:c1bd3fadce09 | 116 | printf("--> Nothing to update.\n\r\n\r"); |
ammanvedi | 2:1c8d8d728b93 | 117 | return; |
ammanvedi | 6:c1bd3fadce09 | 118 | }else{ |
ammanvedi | 6:c1bd3fadce09 | 119 | printf("--> id : %s string: %s \n\r", id, new_msg); |
ammanvedi | 2:1c8d8d728b93 | 120 | } |
ammanvedi | 5:80a7d03c94f5 | 121 | |
ammanvedi | 5:80a7d03c94f5 | 122 | std::string real_msg(new_msg); |
ammanvedi | 5:80a7d03c94f5 | 123 | |
ammanvedi | 6:c1bd3fadce09 | 124 | btNode bt = BTnodes.find(atoi(id))->second; |
ammanvedi | 5:80a7d03c94f5 | 125 | |
ammanvedi | 6:c1bd3fadce09 | 126 | printf("> Found device with ID : %d\n\r\n\r", bt.getID()); |
ammanvedi | 5:80a7d03c94f5 | 127 | |
ammanvedi | 6:c1bd3fadce09 | 128 | std::string result = bt.SendMessage(real_msg); |
ammanvedi | 6:c1bd3fadce09 | 129 | |
ammanvedi | 6:c1bd3fadce09 | 130 | printf("--> xbee response : %s\n\r\n\r", result.c_str()); |
ammanvedi | 6:c1bd3fadce09 | 131 | |
ammanvedi | 6:c1bd3fadce09 | 132 | } |
ammanvedi | 0:d73af3f5c81d | 133 | } |
ammanvedi | 0:d73af3f5c81d | 134 | |
ammanvedi | 4:84abfe990493 | 135 | int main() |
ammanvedi | 0:d73af3f5c81d | 136 | { |
ammanvedi | 7:7039646b7083 | 137 | //add a registered device to the device array |
ammanvedi | 7:7039646b7083 | 138 | btNode a(1, "msp430-homer", HUBID); |
ammanvedi | 7:7039646b7083 | 139 | btNode b(30, "mp430-adam", HUBID); |
ammanvedi | 7:7039646b7083 | 140 | BTnodes.insert(pair<int, btNode>(1,a)); |
ammanvedi | 6:c1bd3fadce09 | 141 | BTnodes.insert(pair<int, btNode>(30,b)); |
ammanvedi | 5:80a7d03c94f5 | 142 | |
ammanvedi | 3:28cd6502dafd | 143 | led_ethernet = 0; |
ammanvedi | 4:84abfe990493 | 144 | led_socket = 0; |
ammanvedi | 0:d73af3f5c81d | 145 | |
ammanvedi | 0:d73af3f5c81d | 146 | ethernet.init(); // connect with DHCP |
ammanvedi | 4:84abfe990493 | 147 | |
ammanvedi | 0:d73af3f5c81d | 148 | int ret_val = ethernet.connect(); |
ammanvedi | 4:84abfe990493 | 149 | |
ammanvedi | 4:84abfe990493 | 150 | if (0 == ret_val) |
ammanvedi | 4:84abfe990493 | 151 | { |
ammanvedi | 3:28cd6502dafd | 152 | printf("\n\rIP Address: %s\n\r", ethernet.getIPAddress()); |
ammanvedi | 4:84abfe990493 | 153 | |
ammanvedi | 3:28cd6502dafd | 154 | led_ethernet = 1; |
ammanvedi | 4:84abfe990493 | 155 | } |
ammanvedi | 4:84abfe990493 | 156 | else |
ammanvedi | 4:84abfe990493 | 157 | { |
ammanvedi | 0:d73af3f5c81d | 158 | error("ethernet failed to connect: %d.\n\r", ret_val); |
ammanvedi | 0:d73af3f5c81d | 159 | } |
ammanvedi | 4:84abfe990493 | 160 | |
ammanvedi | 2:1c8d8d728b93 | 161 | int interval = 5; |
ammanvedi | 4:84abfe990493 | 162 | |
ammanvedi | 4:84abfe990493 | 163 | if (ws.connect()) |
ammanvedi | 3:28cd6502dafd | 164 | { |
ammanvedi | 3:28cd6502dafd | 165 | led_socket = 1; |
ammanvedi | 3:28cd6502dafd | 166 | } |
ammanvedi | 4:84abfe990493 | 167 | |
ammanvedi | 1:6c1df6c9be4d | 168 | Timer timer; |
ammanvedi | 4:84abfe990493 | 169 | |
ammanvedi | 1:6c1df6c9be4d | 170 | timer.start(); |
ammanvedi | 7:7039646b7083 | 171 | |
ammanvedi | 7:7039646b7083 | 172 | sync_devices(); |
ammanvedi | 2:1c8d8d728b93 | 173 | |
ammanvedi | 4:84abfe990493 | 174 | // every <interval> seconds call to the server to pull updates |
ammanvedi | 4:84abfe990493 | 175 | while (true) |
ammanvedi | 4:84abfe990493 | 176 | { |
ammanvedi | 4:84abfe990493 | 177 | if (timer.read() >= interval) |
ammanvedi | 4:84abfe990493 | 178 | { |
ammanvedi | 4:84abfe990493 | 179 | // perform checks |
ammanvedi | 1:6c1df6c9be4d | 180 | pull_updates(); |
ammanvedi | 1:6c1df6c9be4d | 181 | timer.reset(); |
ammanvedi | 1:6c1df6c9be4d | 182 | timer.start(); |
ammanvedi | 0:d73af3f5c81d | 183 | } |
ammanvedi | 1:6c1df6c9be4d | 184 | } |
ammanvedi | 6:c1bd3fadce09 | 185 | //ws.close(); |
ammanvedi | 0:d73af3f5c81d | 186 | } |
ammanvedi | 4:84abfe990493 | 187 | |
ammanvedi | 4:84abfe990493 | 188 | |
ammanvedi | 6:c1bd3fadce09 | 189 |