XBee Wifi on EA LPC4088 QS bBoard

Dependencies:   EthernetNetIf XBee_EA_LPC4088_QS mbed

Fork of XBee_wifi_sample by Suga koubou

Committer:
marin8703
Date:
Tue Feb 10 21:22:48 2015 +0000
Revision:
4:ceb702ac59c3
Parent:
3:91764c4bb3d3
AT comm working

Who changed what in which revision?

UserRevisionLine numberNew 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 }