tes
Dependencies: ASyncTicker EthernetInterface WebSocketClient mbed-rtos mbed MbedJSONValue xbee_lib
main.cpp@4:84abfe990493, 2014-02-01 (annotated)
- Committer:
- ammanvedi
- Date:
- Sat Feb 01 01:37:50 2014 +0000
- Revision:
- 4:84abfe990493
- Parent:
- 3:28cd6502dafd
- Child:
- 5:80a7d03c94f5
json sockets implemented
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ammanvedi | 4:84abfe990493 | 1 | |
ammanvedi | 0:d73af3f5c81d | 2 | #include "mbed.h" |
ammanvedi | 0:d73af3f5c81d | 3 | #include "EthernetInterface.h" |
ammanvedi | 0:d73af3f5c81d | 4 | #include <stdio.h> |
ammanvedi | 0:d73af3f5c81d | 5 | #include <string.h> |
ammanvedi | 0:d73af3f5c81d | 6 | #include "Websocket.h" |
ammanvedi | 0:d73af3f5c81d | 7 | #include "Updateable.h" |
ammanvedi | 0:d73af3f5c81d | 8 | #include "ASyncTicker.h" |
ammanvedi | 1:6c1df6c9be4d | 9 | #include "xbee.h" |
ammanvedi | 1:6c1df6c9be4d | 10 | #include "xbeeFrame.h" |
ammanvedi | 4:84abfe990493 | 11 | #include "MbedJSONValue.h" |
ammanvedi | 3:28cd6502dafd | 12 | #include <ctype.h> |
ammanvedi | 4:84abfe990493 | 13 | #include <string> |
ammanvedi | 0:d73af3f5c81d | 14 | |
ammanvedi | 4:84abfe990493 | 15 | #define PORT 80 |
ammanvedi | 3:28cd6502dafd | 16 | |
ammanvedi | 4:84abfe990493 | 17 | // status leds |
ammanvedi | 4:84abfe990493 | 18 | // led 1 |
ammanvedi | 4:84abfe990493 | 19 | // lit - successful ethernet connection |
ammanvedi | 3:28cd6502dafd | 20 | DigitalOut led_ethernet(LED1); |
ammanvedi | 4:84abfe990493 | 21 | |
ammanvedi | 4:84abfe990493 | 22 | // led 2 |
ammanvedi | 4:84abfe990493 | 23 | // lit - successful socket connection |
ammanvedi | 3:28cd6502dafd | 24 | DigitalOut led_socket(LED2); |
ammanvedi | 3:28cd6502dafd | 25 | |
ammanvedi | 4:84abfe990493 | 26 | EthernetInterface ethernet; |
ammanvedi | 4:84abfe990493 | 27 | Websocket ws("ws://192.168.0.4:8080/"); |
ammanvedi | 3:28cd6502dafd | 28 | |
ammanvedi | 4:84abfe990493 | 29 | xbeeFrame xbee(p9, |
ammanvedi | 4:84abfe990493 | 30 | p10, |
ammanvedi | 4:84abfe990493 | 31 | p11); |
ammanvedi | 0:d73af3f5c81d | 32 | |
ammanvedi | 4:84abfe990493 | 33 | const char dest_address[8] = |
ammanvedi | 4:84abfe990493 | 34 | { |
ammanvedi | 4:84abfe990493 | 35 | 0x00, 0x13, 0xA2, 0x00, 0x40, 0x9B, 0x6D, 0xB0 |
ammanvedi | 4:84abfe990493 | 36 | }; |
ammanvedi | 4:84abfe990493 | 37 | char send_data[50] = "xbee string"; |
ammanvedi | 0:d73af3f5c81d | 38 | |
ammanvedi | 4:84abfe990493 | 39 | void pull_requests() |
ammanvedi | 4:84abfe990493 | 40 | { |
ammanvedi | 2:1c8d8d728b93 | 41 | } |
ammanvedi | 0:d73af3f5c81d | 42 | |
ammanvedi | 4:84abfe990493 | 43 | void pull_updates() |
ammanvedi | 4:84abfe990493 | 44 | { |
ammanvedi | 4:84abfe990493 | 45 | // build json request string |
ammanvedi | 4:84abfe990493 | 46 | MbedJSONValue request; |
ammanvedi | 4:84abfe990493 | 47 | |
ammanvedi | 4:84abfe990493 | 48 | std::string s; |
ammanvedi | 4:84abfe990493 | 49 | |
ammanvedi | 4:84abfe990493 | 50 | // fill the object |
ammanvedi | 4:84abfe990493 | 51 | request["TYPE"] = "UPDATE"; |
ammanvedi | 4:84abfe990493 | 52 | request["ORIGIN"] = "HUB"; |
ammanvedi | 4:84abfe990493 | 53 | request["ID"] = "N/A"; |
ammanvedi | 4:84abfe990493 | 54 | request["DATA"] = "N/A"; |
ammanvedi | 4:84abfe990493 | 55 | request["STATUS"] = "N/A"; |
ammanvedi | 4:84abfe990493 | 56 | |
ammanvedi | 4:84abfe990493 | 57 | // serialize it into a JSON string |
ammanvedi | 4:84abfe990493 | 58 | s = request.serialize(); |
ammanvedi | 4:84abfe990493 | 59 | |
ammanvedi | 4:84abfe990493 | 60 | // printf("json: %s\r\n", s.c_str()); |
ammanvedi | 4:84abfe990493 | 61 | |
ammanvedi | 4:84abfe990493 | 62 | char str[100]; |
ammanvedi | 4:84abfe990493 | 63 | char id[30]; |
ammanvedi | 4:84abfe990493 | 64 | char new_msg[50]; |
ammanvedi | 4:84abfe990493 | 65 | |
ammanvedi | 1:6c1df6c9be4d | 66 | // string with a message |
ammanvedi | 4:84abfe990493 | 67 | // sprintf(str, "PU"); |
ammanvedi | 4:84abfe990493 | 68 | ws.send((char *) s.c_str()); |
ammanvedi | 4:84abfe990493 | 69 | |
ammanvedi | 4:84abfe990493 | 70 | // clear the buffer and wait a sec... |
ammanvedi | 4:84abfe990493 | 71 | memset(str, 0, 100); |
ammanvedi | 4:84abfe990493 | 72 | wait(0.5f); |
ammanvedi | 3:28cd6502dafd | 73 | |
ammanvedi | 4:84abfe990493 | 74 | // websocket server should echo whatever we sent it |
ammanvedi | 4:84abfe990493 | 75 | if (ws.read(str)) |
ammanvedi | 4:84abfe990493 | 76 | { |
ammanvedi | 4:84abfe990493 | 77 | memset(id, 0, 30); |
ammanvedi | 4:84abfe990493 | 78 | memset(new_msg, 0, 50); |
ammanvedi | 4:84abfe990493 | 79 | |
ammanvedi | 4:84abfe990493 | 80 | // response from server is JSON |
ammanvedi | 4:84abfe990493 | 81 | // parse back to a traversable object |
ammanvedi | 4:84abfe990493 | 82 | MbedJSONValue updt_res; |
ammanvedi | 4:84abfe990493 | 83 | |
ammanvedi | 4:84abfe990493 | 84 | parse(updt_res, str); |
ammanvedi | 4:84abfe990493 | 85 | printf("msg form svr: %s\n\r", updt_res); |
ammanvedi | 4:84abfe990493 | 86 | sscanf((char *) updt_res["DATA"].get<std::string>().c_str(), "%s %[^\t]", id, new_msg); |
ammanvedi | 4:84abfe990493 | 87 | |
ammanvedi | 4:84abfe990493 | 88 | // printf("the id : %s will update to : %s\n\r", id, new_msg); |
ammanvedi | 4:84abfe990493 | 89 | // send string to xbee HERE |
ammanvedi | 4:84abfe990493 | 90 | if (strlen(new_msg) == 0) |
ammanvedi | 2:1c8d8d728b93 | 91 | { |
ammanvedi | 2:1c8d8d728b93 | 92 | printf("nothing to update, better luck next time! (svr response: %s)\n\r", id); |
ammanvedi | 4:84abfe990493 | 93 | |
ammanvedi | 2:1c8d8d728b93 | 94 | return; |
ammanvedi | 4:84abfe990493 | 95 | } |
ammanvedi | 4:84abfe990493 | 96 | else |
ammanvedi | 4:84abfe990493 | 97 | { |
ammanvedi | 4:84abfe990493 | 98 | // data was revieved |
ammanvedi | 2:1c8d8d728b93 | 99 | printf("id : %s string: %s (original: %s) \n\r", id, new_msg, str); |
ammanvedi | 2:1c8d8d728b93 | 100 | } |
ammanvedi | 4:84abfe990493 | 101 | |
ammanvedi | 4:84abfe990493 | 102 | char to_send[100]; |
ammanvedi | 4:84abfe990493 | 103 | char * p = to_send; |
ammanvedi | 4:84abfe990493 | 104 | char * r = send_data; |
ammanvedi | 4:84abfe990493 | 105 | |
ammanvedi | 4:84abfe990493 | 106 | while (*r) |
ammanvedi | 4:84abfe990493 | 107 | { |
ammanvedi | 1:6c1df6c9be4d | 108 | *p++ = *r++; |
ammanvedi | 4:84abfe990493 | 109 | } |
ammanvedi | 4:84abfe990493 | 110 | |
ammanvedi | 1:6c1df6c9be4d | 111 | *p++ = ' '; |
ammanvedi | 4:84abfe990493 | 112 | r = new_msg; |
ammanvedi | 4:84abfe990493 | 113 | |
ammanvedi | 4:84abfe990493 | 114 | while (*r) |
ammanvedi | 4:84abfe990493 | 115 | { |
ammanvedi | 1:6c1df6c9be4d | 116 | *p++ = *r++; |
ammanvedi | 4:84abfe990493 | 117 | } |
ammanvedi | 4:84abfe990493 | 118 | |
ammanvedi | 3:28cd6502dafd | 119 | *p++ = '\r'; |
ammanvedi | 4:84abfe990493 | 120 | *p = '\0'; |
ammanvedi | 4:84abfe990493 | 121 | |
ammanvedi | 4:84abfe990493 | 122 | char data_buf[50]; |
ammanvedi | 4:84abfe990493 | 123 | |
ammanvedi | 1:6c1df6c9be4d | 124 | xbee.InitFrame(); |
ammanvedi | 4:84abfe990493 | 125 | xbee.SetDestination((unsigned char *) dest_address); |
ammanvedi | 1:6c1df6c9be4d | 126 | xbee.SetPayload(to_send); |
ammanvedi | 3:28cd6502dafd | 127 | printf("sending payload: %s\n\r", to_send); |
ammanvedi | 1:6c1df6c9be4d | 128 | xbee.AssembleFrame(); |
ammanvedi | 1:6c1df6c9be4d | 129 | xbee.SendFrame(); |
ammanvedi | 4:84abfe990493 | 130 | |
ammanvedi | 4:84abfe990493 | 131 | for (int i = 0; i < 2; i++) |
ammanvedi | 1:6c1df6c9be4d | 132 | { |
ammanvedi | 1:6c1df6c9be4d | 133 | xbee.ReceiveFrame(data_buf, 500); |
ammanvedi | 4:84abfe990493 | 134 | |
ammanvedi | 4:84abfe990493 | 135 | if (xbee.frameReceived) |
ammanvedi | 1:6c1df6c9be4d | 136 | { |
ammanvedi | 1:6c1df6c9be4d | 137 | xbee.frameReceived = 0; |
ammanvedi | 4:84abfe990493 | 138 | |
ammanvedi | 4:84abfe990493 | 139 | if (xbee.GetType() == TX_STATUS) |
ammanvedi | 1:6c1df6c9be4d | 140 | { |
ammanvedi | 4:84abfe990493 | 141 | if (xbee.GetStatus() == 0) |
ammanvedi | 4:84abfe990493 | 142 | { |
ammanvedi | 1:6c1df6c9be4d | 143 | printf("Send success!\n\r"); |
ammanvedi | 4:84abfe990493 | 144 | } |
ammanvedi | 1:6c1df6c9be4d | 145 | else |
ammanvedi | 4:84abfe990493 | 146 | { |
ammanvedi | 1:6c1df6c9be4d | 147 | printf("Send failed :(\n\r"); |
ammanvedi | 4:84abfe990493 | 148 | } |
ammanvedi | 1:6c1df6c9be4d | 149 | } |
ammanvedi | 1:6c1df6c9be4d | 150 | else if (xbee.GetType() == RX_PACKET_64) |
ammanvedi | 4:84abfe990493 | 151 | { |
ammanvedi | 1:6c1df6c9be4d | 152 | printf("Received data: %s\n\r", data_buf); |
ammanvedi | 4:84abfe990493 | 153 | } |
ammanvedi | 1:6c1df6c9be4d | 154 | } |
ammanvedi | 1:6c1df6c9be4d | 155 | } |
ammanvedi | 4:84abfe990493 | 156 | } |
ammanvedi | 0:d73af3f5c81d | 157 | } |
ammanvedi | 0:d73af3f5c81d | 158 | |
ammanvedi | 4:84abfe990493 | 159 | int main() |
ammanvedi | 0:d73af3f5c81d | 160 | { |
ammanvedi | 3:28cd6502dafd | 161 | led_ethernet = 0; |
ammanvedi | 4:84abfe990493 | 162 | led_socket = 0; |
ammanvedi | 0:d73af3f5c81d | 163 | |
ammanvedi | 0:d73af3f5c81d | 164 | ethernet.init(); // connect with DHCP |
ammanvedi | 4:84abfe990493 | 165 | |
ammanvedi | 0:d73af3f5c81d | 166 | int ret_val = ethernet.connect(); |
ammanvedi | 4:84abfe990493 | 167 | |
ammanvedi | 4:84abfe990493 | 168 | if (0 == ret_val) |
ammanvedi | 4:84abfe990493 | 169 | { |
ammanvedi | 3:28cd6502dafd | 170 | printf("\n\rIP Address: %s\n\r", ethernet.getIPAddress()); |
ammanvedi | 4:84abfe990493 | 171 | |
ammanvedi | 3:28cd6502dafd | 172 | led_ethernet = 1; |
ammanvedi | 4:84abfe990493 | 173 | } |
ammanvedi | 4:84abfe990493 | 174 | else |
ammanvedi | 4:84abfe990493 | 175 | { |
ammanvedi | 0:d73af3f5c81d | 176 | error("ethernet failed to connect: %d.\n\r", ret_val); |
ammanvedi | 0:d73af3f5c81d | 177 | } |
ammanvedi | 4:84abfe990493 | 178 | |
ammanvedi | 2:1c8d8d728b93 | 179 | int interval = 5; |
ammanvedi | 4:84abfe990493 | 180 | |
ammanvedi | 4:84abfe990493 | 181 | if (ws.connect()) |
ammanvedi | 3:28cd6502dafd | 182 | { |
ammanvedi | 3:28cd6502dafd | 183 | led_socket = 1; |
ammanvedi | 3:28cd6502dafd | 184 | } |
ammanvedi | 4:84abfe990493 | 185 | |
ammanvedi | 1:6c1df6c9be4d | 186 | Timer timer; |
ammanvedi | 4:84abfe990493 | 187 | |
ammanvedi | 1:6c1df6c9be4d | 188 | timer.start(); |
ammanvedi | 2:1c8d8d728b93 | 189 | |
ammanvedi | 4:84abfe990493 | 190 | // every <interval> seconds call to the server to pull updates |
ammanvedi | 4:84abfe990493 | 191 | while (true) |
ammanvedi | 4:84abfe990493 | 192 | { |
ammanvedi | 4:84abfe990493 | 193 | if (timer.read() >= interval) |
ammanvedi | 4:84abfe990493 | 194 | { |
ammanvedi | 4:84abfe990493 | 195 | // perform checks |
ammanvedi | 1:6c1df6c9be4d | 196 | pull_updates(); |
ammanvedi | 1:6c1df6c9be4d | 197 | timer.reset(); |
ammanvedi | 1:6c1df6c9be4d | 198 | timer.start(); |
ammanvedi | 0:d73af3f5c81d | 199 | } |
ammanvedi | 1:6c1df6c9be4d | 200 | } |
ammanvedi | 0:d73af3f5c81d | 201 | |
ammanvedi | 4:84abfe990493 | 202 | // pull_updates(); |
ammanvedi | 4:84abfe990493 | 203 | ws.close(); |
ammanvedi | 0:d73af3f5c81d | 204 | } |
ammanvedi | 4:84abfe990493 | 205 | |
ammanvedi | 4:84abfe990493 | 206 | |
ammanvedi | 4:84abfe990493 | 207 | //~ Formatted by Jindent --- http://www.jindent.com |