XBee Wifi on EA LPC4088 QS bBoard
Dependencies: EthernetNetIf XBee_EA_LPC4088_QS mbed
Fork of XBee_wifi_sample by
main.cpp@3:91764c4bb3d3, 2015-02-10 (annotated)
- Committer:
- marin8703
- Date:
- Tue Feb 10 21:17:48 2015 +0000
- Revision:
- 3:91764c4bb3d3
- Parent:
- 1:27bf8d24244b
porting Xbee wifi library to EA LPC4088 Quick Start board
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:a566d771935a | 1 | #include "mbed.h" |
okini3939 | 0:a566d771935a | 2 | #include "XBeeWiFi.h" |
okini3939 | 1:27bf8d24244b | 3 | #include "EthernetNetIf.h" |
okini3939 | 1:27bf8d24244b | 4 | #include "TCPSocket.h" |
okini3939 | 0:a566d771935a | 5 | |
okini3939 | 1:27bf8d24244b | 6 | |
okini3939 | 0:a566d771935a | 7 | #define SECURITY SECURITY_WPA2 |
marin8703 | 3:91764c4bb3d3 | 8 | #define SSID "HomeNet24" |
marin8703 | 3:91764c4bb3d3 | 9 | #define PASSPHRASE "L57Q1*P3h" |
marin8703 | 3:91764c4bb3d3 | 10 | |
okini3939 | 1:27bf8d24244b | 11 | #define HTTP_PORT 80 |
okini3939 | 1:27bf8d24244b | 12 | #define HTTP_SRC_PORT 10080 |
okini3939 | 1:27bf8d24244b | 13 | #define HTTP_TIMEOUT 5000 // ms |
okini3939 | 1:27bf8d24244b | 14 | #define METHOD_GET 0 |
okini3939 | 1:27bf8d24244b | 15 | #define METHOD_POST 1 |
okini3939 | 0:a566d771935a | 16 | |
okini3939 | 0:a566d771935a | 17 | DigitalOut myled(LED1); |
marin8703 | 3:91764c4bb3d3 | 18 | Serial pc(p9, p10); |
okini3939 | 0:a566d771935a | 19 | |
marin8703 | 3:91764c4bb3d3 | 20 | XBeeWiFi xbee(P4_22 , P4_23, P4_20, P4_21); // TX, RX, CTS, RTS |
marin8703 | 3:91764c4bb3d3 | 21 | |
marin8703 | 3:91764c4bb3d3 | 22 | int led_count = 0; |
marin8703 | 3:91764c4bb3d3 | 23 | int error_fail = 0; |
okini3939 | 0:a566d771935a | 24 | |
okini3939 | 0:a566d771935a | 25 | int init_wifi (int timeout) { |
okini3939 | 0:a566d771935a | 26 | int i, r; |
okini3939 | 0:a566d771935a | 27 | |
okini3939 | 1:27bf8d24244b | 28 | pc.printf("reset\r\n"); |
okini3939 | 0:a566d771935a | 29 | r = xbee.reset(); |
okini3939 | 1:27bf8d24244b | 30 | if (r < 0) { |
okini3939 | 1:27bf8d24244b | 31 | pc.printf("error reset %d\r\n", r); |
okini3939 | 0:a566d771935a | 32 | return -1; |
okini3939 | 0:a566d771935a | 33 | } |
okini3939 | 1:27bf8d24244b | 34 | |
okini3939 | 0:a566d771935a | 35 | xbee.getWiResponse(MODEM_STATUS_RESPONSE, 5000); |
okini3939 | 0:a566d771935a | 36 | |
okini3939 | 1:27bf8d24244b | 37 | r = xbee.setup(SECURITY, SSID, PASSPHRASE); |
okini3939 | 1:27bf8d24244b | 38 | if (r < 0) { |
okini3939 | 1:27bf8d24244b | 39 | pc.printf("error setup %d\r\n", r); |
okini3939 | 1:27bf8d24244b | 40 | return -1; |
okini3939 | 1:27bf8d24244b | 41 | } |
okini3939 | 0:a566d771935a | 42 | |
okini3939 | 0:a566d771935a | 43 | for (i = 0; i < timeout; i ++) { |
okini3939 | 0:a566d771935a | 44 | wait(1); |
okini3939 | 0:a566d771935a | 45 | r = xbee.getStatus(); |
okini3939 | 0:a566d771935a | 46 | pc.printf("status %02x: ", r); |
okini3939 | 0:a566d771935a | 47 | switch (r) { |
okini3939 | 0:a566d771935a | 48 | case JOINED_AP: |
okini3939 | 0:a566d771935a | 49 | pc.printf("Successfully joined an access point.\r\n"); |
okini3939 | 0:a566d771935a | 50 | return 0; |
okini3939 | 0:a566d771935a | 51 | case INITIALIZATION: |
okini3939 | 0:a566d771935a | 52 | pc.printf("WiFi initialization in progress.\r\n"); |
okini3939 | 0:a566d771935a | 53 | break; |
okini3939 | 0:a566d771935a | 54 | case SSID_NOT_FOUND: |
okini3939 | 0:a566d771935a | 55 | pc.printf("SSID not found.\r\n"); |
okini3939 | 0:a566d771935a | 56 | return -1; |
okini3939 | 0:a566d771935a | 57 | case SSID_NOT_CONFIGURED: |
okini3939 | 0:a566d771935a | 58 | pc.printf("SSID not configured.\r\n"); |
okini3939 | 0:a566d771935a | 59 | return -1; |
okini3939 | 0:a566d771935a | 60 | case JOIN_FAILED: |
okini3939 | 0:a566d771935a | 61 | pc.printf("SSID join failed.\r\n"); |
okini3939 | 0:a566d771935a | 62 | return -1; |
okini3939 | 0:a566d771935a | 63 | case WAITING_IPADDRESS: |
okini3939 | 0:a566d771935a | 64 | pc.printf("Waiting for IP configuration.\r\n"); |
okini3939 | 0:a566d771935a | 65 | break; |
okini3939 | 0:a566d771935a | 66 | case WAITING_SOCKETS: |
okini3939 | 0:a566d771935a | 67 | pc.printf("Listening sockets are being set up.\r\n"); |
okini3939 | 0:a566d771935a | 68 | break; |
okini3939 | 0:a566d771935a | 69 | case SCANNING_SSID: |
okini3939 | 0:a566d771935a | 70 | pc.printf("Currently scanning for SSID.\r\n"); |
okini3939 | 0:a566d771935a | 71 | break; |
okini3939 | 0:a566d771935a | 72 | default: |
okini3939 | 0:a566d771935a | 73 | pc.printf("\r\n"); |
okini3939 | 0:a566d771935a | 74 | break; |
okini3939 | 0:a566d771935a | 75 | } |
okini3939 | 0:a566d771935a | 76 | } |
okini3939 | 0:a566d771935a | 77 | return -1; |
okini3939 | 0:a566d771935a | 78 | } |
okini3939 | 0:a566d771935a | 79 | |
okini3939 | 0:a566d771935a | 80 | |
okini3939 | 1:27bf8d24244b | 81 | int httpRequest (int method, Host *host, char *uri, char *head, char *body) { |
okini3939 | 1:27bf8d24244b | 82 | Timer timeout; |
okini3939 | 1:27bf8d24244b | 83 | char buf[1500], tmp[40]; |
okini3939 | 1:27bf8d24244b | 84 | int r, len; |
okini3939 | 1:27bf8d24244b | 85 | IPv4TransmitRequest httpRequest; |
okini3939 | 1:27bf8d24244b | 86 | AtCommandRequest atRequest; |
okini3939 | 1:27bf8d24244b | 87 | AtCommandResponse atResponse; |
okini3939 | 1:27bf8d24244b | 88 | IPV4RxFrame httpResponse; |
okini3939 | 1:27bf8d24244b | 89 | IpAddr ipaddr; |
okini3939 | 1:27bf8d24244b | 90 | |
okini3939 | 1:27bf8d24244b | 91 | // connect |
okini3939 | 1:27bf8d24244b | 92 | if (host->getIp().isNull()) { |
okini3939 | 1:27bf8d24244b | 93 | return -1; |
okini3939 | 1:27bf8d24244b | 94 | } |
okini3939 | 1:27bf8d24244b | 95 | if (! host->getPort()) { |
okini3939 | 1:27bf8d24244b | 96 | host->setPort(HTTP_PORT); |
okini3939 | 1:27bf8d24244b | 97 | } |
okini3939 | 1:27bf8d24244b | 98 | |
okini3939 | 1:27bf8d24244b | 99 | // create request |
okini3939 | 1:27bf8d24244b | 100 | if (method == METHOD_POST) { |
okini3939 | 1:27bf8d24244b | 101 | strcpy(buf, "POST "); |
okini3939 | 1:27bf8d24244b | 102 | } else { |
okini3939 | 1:27bf8d24244b | 103 | strcpy(buf, "GET "); |
okini3939 | 1:27bf8d24244b | 104 | } |
okini3939 | 1:27bf8d24244b | 105 | strcat(buf, uri); |
okini3939 | 1:27bf8d24244b | 106 | strcat(buf, " HTTP/1.1\r\nHost: "); |
okini3939 | 1:27bf8d24244b | 107 | strcat(buf, host->getName()); |
okini3939 | 1:27bf8d24244b | 108 | strcat(buf, "\r\n"); |
okini3939 | 1:27bf8d24244b | 109 | strcat(buf, "Connection: close\r\n"); |
okini3939 | 1:27bf8d24244b | 110 | if (head) { |
okini3939 | 1:27bf8d24244b | 111 | strcat(buf, head); |
okini3939 | 1:27bf8d24244b | 112 | } |
okini3939 | 1:27bf8d24244b | 113 | if (method == METHOD_POST) { |
okini3939 | 1:27bf8d24244b | 114 | sprintf(tmp, "Content-Length: %d\r\n", strlen(body)); |
okini3939 | 1:27bf8d24244b | 115 | strcat(buf, tmp); |
okini3939 | 1:27bf8d24244b | 116 | } |
okini3939 | 1:27bf8d24244b | 117 | strcat(buf, "\r\n"); |
okini3939 | 1:27bf8d24244b | 118 | |
okini3939 | 1:27bf8d24244b | 119 | // send HTTP request |
okini3939 | 1:27bf8d24244b | 120 | len = strlen(buf); |
okini3939 | 1:27bf8d24244b | 121 | ipaddr = host->getIp(); |
okini3939 | 1:27bf8d24244b | 122 | httpRequest.setAddress(ipaddr); |
okini3939 | 1:27bf8d24244b | 123 | httpRequest.setDstPort(host->getPort()); |
okini3939 | 1:27bf8d24244b | 124 | httpRequest.setSrcPort(HTTP_SRC_PORT); |
okini3939 | 1:27bf8d24244b | 125 | httpRequest.setProtocol(PROTOCOL_TCP); |
okini3939 | 1:27bf8d24244b | 126 | httpRequest.setPayload((uint8_t*)buf); |
okini3939 | 1:27bf8d24244b | 127 | httpRequest.setPayloadLength(len); |
okini3939 | 1:27bf8d24244b | 128 | httpRequest.setFrameId(xbee.getNextFrameId()); |
okini3939 | 1:27bf8d24244b | 129 | xbee.send(httpRequest); |
okini3939 | 1:27bf8d24244b | 130 | r = xbee.getWiResponse(TX_STATUS_RESPONSE, httpRequest.getFrameId()); |
okini3939 | 1:27bf8d24244b | 131 | pc.printf("wifi TX: %d\r\n", r); |
okini3939 | 1:27bf8d24244b | 132 | if (r < 0) return -1; |
okini3939 | 1:27bf8d24244b | 133 | |
okini3939 | 1:27bf8d24244b | 134 | // wait responce |
okini3939 | 1:27bf8d24244b | 135 | timeout.reset(); |
okini3939 | 1:27bf8d24244b | 136 | timeout.start(); |
okini3939 | 1:27bf8d24244b | 137 | while (timeout.read_ms() < HTTP_TIMEOUT) { |
okini3939 | 1:27bf8d24244b | 138 | // recv HTTP request |
okini3939 | 1:27bf8d24244b | 139 | r = xbee.getWiResponse(IPv4_RX_FRAME, 0, 3000); |
okini3939 | 1:27bf8d24244b | 140 | pc.printf("wifi RX: %d\r\n", r); |
okini3939 | 1:27bf8d24244b | 141 | if (r >= 0) { |
okini3939 | 1:27bf8d24244b | 142 | timeout.reset(); |
okini3939 | 1:27bf8d24244b | 143 | xbee.getResponse().getAtCommandResponse(httpResponse); |
okini3939 | 1:27bf8d24244b | 144 | pc.printf("\r\n--- recv %d ---\r\n", httpResponse.getDataLength()); |
okini3939 | 1:27bf8d24244b | 145 | strncpy(buf, (char*)httpResponse.getData(), httpResponse.getDataLength()); |
okini3939 | 1:27bf8d24244b | 146 | buf[httpResponse.getDataLength()] = 0; |
okini3939 | 1:27bf8d24244b | 147 | pc.printf(buf); |
okini3939 | 1:27bf8d24244b | 148 | } |
okini3939 | 1:27bf8d24244b | 149 | } |
okini3939 | 1:27bf8d24244b | 150 | timeout.stop(); |
okini3939 | 1:27bf8d24244b | 151 | return 0; |
okini3939 | 1:27bf8d24244b | 152 | } |
okini3939 | 1:27bf8d24244b | 153 | |
okini3939 | 0:a566d771935a | 154 | int main() { |
marin8703 | 3:91764c4bb3d3 | 155 | //int i; |
okini3939 | 0:a566d771935a | 156 | IpAddr ipaddr, netmask, gateway, nameserver; |
okini3939 | 1:27bf8d24244b | 157 | Host host; |
marin8703 | 3:91764c4bb3d3 | 158 | //Host host.setIp(IpAddr(217,140,96,42)); |
marin8703 | 3:91764c4bb3d3 | 159 | |
okini3939 | 0:a566d771935a | 160 | pc.baud(115200); |
marin8703 | 3:91764c4bb3d3 | 161 | pc.printf("Starting main program...\r\n\n"); |
marin8703 | 3:91764c4bb3d3 | 162 | |
marin8703 | 3:91764c4bb3d3 | 163 | // pc.printf("1 cycles of LED1 on/off start...\r\n"); |
marin8703 | 3:91764c4bb3d3 | 164 | // |
marin8703 | 3:91764c4bb3d3 | 165 | // led_count = 0; |
marin8703 | 3:91764c4bb3d3 | 166 | // while(led_count<1) { |
marin8703 | 3:91764c4bb3d3 | 167 | // myled = 1; |
marin8703 | 3:91764c4bb3d3 | 168 | // wait(1); |
marin8703 | 3:91764c4bb3d3 | 169 | // myled = 0; |
marin8703 | 3:91764c4bb3d3 | 170 | // wait(1); |
marin8703 | 3:91764c4bb3d3 | 171 | // led_count++; |
marin8703 | 3:91764c4bb3d3 | 172 | // } |
marin8703 | 3:91764c4bb3d3 | 173 | // myled = 1; |
marin8703 | 3:91764c4bb3d3 | 174 | // |
marin8703 | 3:91764c4bb3d3 | 175 | // pc.printf("1 cycles of LED1 on/off DONE.\r\n\n"); |
okini3939 | 0:a566d771935a | 176 | |
marin8703 | 3:91764c4bb3d3 | 177 | // pc.printf("XBee WiFi test starting...\r\n\n"); |
marin8703 | 3:91764c4bb3d3 | 178 | |
marin8703 | 3:91764c4bb3d3 | 179 | pc.printf("**CALLING xbee.begin...\r\n"); |
marin8703 | 3:91764c4bb3d3 | 180 | xbee.begin(9600); |
marin8703 | 3:91764c4bb3d3 | 181 | pc.printf("xbee.begin DONE.**\r\n\n"); |
marin8703 | 3:91764c4bb3d3 | 182 | pc.printf("**CALLING init_wifi...\r\n"); |
marin8703 | 3:91764c4bb3d3 | 183 | if (init_wifi(10)) { |
okini3939 | 0:a566d771935a | 184 | pc.printf("XBee error\r\n"); |
marin8703 | 3:91764c4bb3d3 | 185 | //return -1; |
marin8703 | 3:91764c4bb3d3 | 186 | error_fail = 1; |
okini3939 | 0:a566d771935a | 187 | } |
marin8703 | 3:91764c4bb3d3 | 188 | pc.printf("init_wifi DONE.*\r\n\n"); |
okini3939 | 0:a566d771935a | 189 | |
marin8703 | 3:91764c4bb3d3 | 190 | while(error_fail) { |
marin8703 | 3:91764c4bb3d3 | 191 | myled = 1; |
marin8703 | 3:91764c4bb3d3 | 192 | wait(1); |
marin8703 | 3:91764c4bb3d3 | 193 | myled = 0; |
marin8703 | 3:91764c4bb3d3 | 194 | wait(1); |
marin8703 | 3:91764c4bb3d3 | 195 | } |
marin8703 | 3:91764c4bb3d3 | 196 | |
marin8703 | 3:91764c4bb3d3 | 197 | pc.printf("**Getting IP address**\r\n\n"); |
okini3939 | 0:a566d771935a | 198 | xbee.getAddress(ipaddr, netmask, gateway, nameserver); |
okini3939 | 0:a566d771935a | 199 | pc.printf("IP address %d.%d.%d.%d\r\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); |
okini3939 | 1:27bf8d24244b | 200 | if (ipaddr == 0) { |
okini3939 | 1:27bf8d24244b | 201 | pc.printf("not configure\r\n"); |
okini3939 | 1:27bf8d24244b | 202 | return -1; |
okini3939 | 1:27bf8d24244b | 203 | } |
marin8703 | 3:91764c4bb3d3 | 204 | wait(5); |
okini3939 | 0:a566d771935a | 205 | |
marin8703 | 3:91764c4bb3d3 | 206 | ///////////////////////////////// |
okini3939 | 1:27bf8d24244b | 207 | /* |
okini3939 | 1:27bf8d24244b | 208 | // DNS lookup |
okini3939 | 1:27bf8d24244b | 209 | // *** Note: wifi is turned off when XBee send/recv the port 53 udp packet. |
okini3939 | 1:27bf8d24244b | 210 | // XBee wifi --> request --> DNS server (wifi OK) |
okini3939 | 1:27bf8d24244b | 211 | // DNS server --> responce --> XBee wifi (wifi turned off) |
okini3939 | 1:27bf8d24244b | 212 | // why ?? |
okini3939 | 0:a566d771935a | 213 | nameserver = gateway; |
okini3939 | 1:27bf8d24244b | 214 | // nameserver = IpAddr(12,34,56,78); |
okini3939 | 1:27bf8d24244b | 215 | pc.printf("resolver %d.%d.%d.%d\r\n", nameserver[0], nameserver[1], nameserver[2], nameserver[3]); |
okini3939 | 0:a566d771935a | 216 | xbee.setNameserver(nameserver); |
okini3939 | 0:a566d771935a | 217 | i = xbee.getHostByName("mbed.org", ipaddr); |
okini3939 | 0:a566d771935a | 218 | if (i) { |
okini3939 | 0:a566d771935a | 219 | pc.printf("error resolv %d\r\n", i); |
okini3939 | 0:a566d771935a | 220 | } else { |
okini3939 | 0:a566d771935a | 221 | pc.printf("resolv address %d.%d.%d.%d\r\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); |
okini3939 | 0:a566d771935a | 222 | } |
okini3939 | 1:27bf8d24244b | 223 | */ |
marin8703 | 3:91764c4bb3d3 | 224 | /////////////////////////////////////// |
okini3939 | 1:27bf8d24244b | 225 | // HTTP request |
okini3939 | 1:27bf8d24244b | 226 | wait(1); |
okini3939 | 1:27bf8d24244b | 227 | host.setIp(IpAddr(217,140,96,42)); |
okini3939 | 1:27bf8d24244b | 228 | host.setName("mbed.org"); |
okini3939 | 1:27bf8d24244b | 229 | httpRequest(METHOD_GET, &host, "/", "", ""); |
okini3939 | 0:a566d771935a | 230 | |
okini3939 | 1:27bf8d24244b | 231 | // Serial through |
marin8703 | 3:91764c4bb3d3 | 232 | // { |
marin8703 | 3:91764c4bb3d3 | 233 | // Serial xbeeserial(p9, p10); |
marin8703 | 3:91764c4bb3d3 | 234 | //DigitalOut rts(p22); |
marin8703 | 3:91764c4bb3d3 | 235 | //DigitalOut rts(P4_21); |
okini3939 | 1:27bf8d24244b | 236 | |
marin8703 | 3:91764c4bb3d3 | 237 | // xbeeserial.baud(115200); |
marin8703 | 3:91764c4bb3d3 | 238 | //rts = 0; |
marin8703 | 3:91764c4bb3d3 | 239 | // pc.printf("Serial through\r\n"); |
marin8703 | 3:91764c4bb3d3 | 240 | // for (;;) { |
marin8703 | 3:91764c4bb3d3 | 241 | // if (pc.readable()) xbeeserial.putc(pc.getc()); |
marin8703 | 3:91764c4bb3d3 | 242 | // if (xbeeserial.readable()) pc.putc(xbeeserial.getc()); |
okini3939 | 1:27bf8d24244b | 243 | // if (xbeeserial.readable()) pc.printf("%02x ", xbeeserial.getc()); |
marin8703 | 3:91764c4bb3d3 | 244 | // } |
marin8703 | 3:91764c4bb3d3 | 245 | // } |
okini3939 | 0:a566d771935a | 246 | |
okini3939 | 0:a566d771935a | 247 | } |