XBeeWiFi (S6) with SPI connection.
Dependencies: XBeeWiFi_common XBee_with_SPI mbed
Fork of XBee_wifi_sample by
main.cpp@3:67a2c13289ad, 2014-01-04 (annotated)
- Committer:
- ban4jp
- Date:
- Sat Jan 04 16:58:46 2014 +0000
- Revision:
- 3:67a2c13289ad
- Parent:
- 1:27bf8d24244b
Add SPI connection support.
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 |
okini3939 | 0:a566d771935a | 8 | #define SSID "XBEEWIFI" |
okini3939 | 0:a566d771935a | 9 | #define PASSPHRASE "PASSWORD" |
okini3939 | 1:27bf8d24244b | 10 | /* |
okini3939 | 0:a566d771935a | 11 | #define SECURITY SECURITY_OPEN |
okini3939 | 0:a566d771935a | 12 | #define SSID "XBEEWIFI" |
okini3939 | 0:a566d771935a | 13 | #define PASSPHRASE "" |
okini3939 | 1:27bf8d24244b | 14 | */ |
okini3939 | 1:27bf8d24244b | 15 | #define HTTP_PORT 80 |
okini3939 | 1:27bf8d24244b | 16 | #define HTTP_SRC_PORT 10080 |
okini3939 | 1:27bf8d24244b | 17 | #define HTTP_TIMEOUT 5000 // ms |
okini3939 | 1:27bf8d24244b | 18 | #define METHOD_GET 0 |
okini3939 | 1:27bf8d24244b | 19 | #define METHOD_POST 1 |
okini3939 | 0:a566d771935a | 20 | |
okini3939 | 0:a566d771935a | 21 | DigitalOut myled(LED1); |
okini3939 | 0:a566d771935a | 22 | Serial pc(USBTX, USBRX); |
okini3939 | 0:a566d771935a | 23 | |
ban4jp | 3:67a2c13289ad | 24 | #if defined(TARGET_LPC1768) || defined(TARGET_LPC11U24) |
ban4jp | 3:67a2c13289ad | 25 | XBeeWiFi xbee(p11, p12, p13, p14, p15, p16); // mosi, miso, sclk, ssel, attn, reset |
ban4jp | 3:67a2c13289ad | 26 | #elif defined(TARGET_LPC1114) |
ban4jp | 3:67a2c13289ad | 27 | XBeeWiFi xbee(dp2, dp1, dp6, dp9, dp10, dp11); // mosi, miso, sclk, ssel, attn, reset |
ban4jp | 3:67a2c13289ad | 28 | #endif |
okini3939 | 0:a566d771935a | 29 | |
okini3939 | 0:a566d771935a | 30 | int init_wifi (int timeout) { |
okini3939 | 0:a566d771935a | 31 | int i, r; |
okini3939 | 0:a566d771935a | 32 | |
okini3939 | 1:27bf8d24244b | 33 | pc.printf("reset\r\n"); |
okini3939 | 0:a566d771935a | 34 | r = xbee.reset(); |
okini3939 | 1:27bf8d24244b | 35 | if (r < 0) { |
okini3939 | 1:27bf8d24244b | 36 | pc.printf("error reset %d\r\n", r); |
okini3939 | 0:a566d771935a | 37 | return -1; |
okini3939 | 0:a566d771935a | 38 | } |
okini3939 | 1:27bf8d24244b | 39 | |
okini3939 | 0:a566d771935a | 40 | xbee.getWiResponse(MODEM_STATUS_RESPONSE, 5000); |
okini3939 | 0:a566d771935a | 41 | |
okini3939 | 1:27bf8d24244b | 42 | r = xbee.setup(SECURITY, SSID, PASSPHRASE); |
okini3939 | 1:27bf8d24244b | 43 | if (r < 0) { |
okini3939 | 1:27bf8d24244b | 44 | pc.printf("error setup %d\r\n", r); |
okini3939 | 1:27bf8d24244b | 45 | return -1; |
okini3939 | 1:27bf8d24244b | 46 | } |
okini3939 | 0:a566d771935a | 47 | |
okini3939 | 0:a566d771935a | 48 | for (i = 0; i < timeout; i ++) { |
okini3939 | 0:a566d771935a | 49 | wait(1); |
okini3939 | 0:a566d771935a | 50 | r = xbee.getStatus(); |
okini3939 | 0:a566d771935a | 51 | pc.printf("status %02x: ", r); |
okini3939 | 0:a566d771935a | 52 | switch (r) { |
okini3939 | 0:a566d771935a | 53 | case JOINED_AP: |
okini3939 | 0:a566d771935a | 54 | pc.printf("Successfully joined an access point.\r\n"); |
okini3939 | 0:a566d771935a | 55 | return 0; |
okini3939 | 0:a566d771935a | 56 | case INITIALIZATION: |
okini3939 | 0:a566d771935a | 57 | pc.printf("WiFi initialization in progress.\r\n"); |
okini3939 | 0:a566d771935a | 58 | break; |
okini3939 | 0:a566d771935a | 59 | case SSID_NOT_FOUND: |
okini3939 | 0:a566d771935a | 60 | pc.printf("SSID not found.\r\n"); |
okini3939 | 0:a566d771935a | 61 | return -1; |
okini3939 | 0:a566d771935a | 62 | case SSID_NOT_CONFIGURED: |
okini3939 | 0:a566d771935a | 63 | pc.printf("SSID not configured.\r\n"); |
okini3939 | 0:a566d771935a | 64 | return -1; |
okini3939 | 0:a566d771935a | 65 | case JOIN_FAILED: |
okini3939 | 0:a566d771935a | 66 | pc.printf("SSID join failed.\r\n"); |
okini3939 | 0:a566d771935a | 67 | return -1; |
okini3939 | 0:a566d771935a | 68 | case WAITING_IPADDRESS: |
okini3939 | 0:a566d771935a | 69 | pc.printf("Waiting for IP configuration.\r\n"); |
okini3939 | 0:a566d771935a | 70 | break; |
okini3939 | 0:a566d771935a | 71 | case WAITING_SOCKETS: |
okini3939 | 0:a566d771935a | 72 | pc.printf("Listening sockets are being set up.\r\n"); |
okini3939 | 0:a566d771935a | 73 | break; |
okini3939 | 0:a566d771935a | 74 | case SCANNING_SSID: |
okini3939 | 0:a566d771935a | 75 | pc.printf("Currently scanning for SSID.\r\n"); |
okini3939 | 0:a566d771935a | 76 | break; |
okini3939 | 0:a566d771935a | 77 | default: |
okini3939 | 0:a566d771935a | 78 | pc.printf("\r\n"); |
okini3939 | 0:a566d771935a | 79 | break; |
okini3939 | 0:a566d771935a | 80 | } |
okini3939 | 0:a566d771935a | 81 | } |
okini3939 | 0:a566d771935a | 82 | return -1; |
okini3939 | 0:a566d771935a | 83 | } |
okini3939 | 0:a566d771935a | 84 | |
okini3939 | 0:a566d771935a | 85 | |
okini3939 | 1:27bf8d24244b | 86 | int httpRequest (int method, Host *host, char *uri, char *head, char *body) { |
okini3939 | 1:27bf8d24244b | 87 | Timer timeout; |
okini3939 | 1:27bf8d24244b | 88 | char buf[1500], tmp[40]; |
okini3939 | 1:27bf8d24244b | 89 | int r, len; |
okini3939 | 1:27bf8d24244b | 90 | IPv4TransmitRequest httpRequest; |
okini3939 | 1:27bf8d24244b | 91 | AtCommandRequest atRequest; |
okini3939 | 1:27bf8d24244b | 92 | AtCommandResponse atResponse; |
okini3939 | 1:27bf8d24244b | 93 | IPV4RxFrame httpResponse; |
okini3939 | 1:27bf8d24244b | 94 | IpAddr ipaddr; |
okini3939 | 1:27bf8d24244b | 95 | |
okini3939 | 1:27bf8d24244b | 96 | // connect |
okini3939 | 1:27bf8d24244b | 97 | if (host->getIp().isNull()) { |
okini3939 | 1:27bf8d24244b | 98 | return -1; |
okini3939 | 1:27bf8d24244b | 99 | } |
okini3939 | 1:27bf8d24244b | 100 | if (! host->getPort()) { |
okini3939 | 1:27bf8d24244b | 101 | host->setPort(HTTP_PORT); |
okini3939 | 1:27bf8d24244b | 102 | } |
okini3939 | 1:27bf8d24244b | 103 | |
okini3939 | 1:27bf8d24244b | 104 | // create request |
okini3939 | 1:27bf8d24244b | 105 | if (method == METHOD_POST) { |
okini3939 | 1:27bf8d24244b | 106 | strcpy(buf, "POST "); |
okini3939 | 1:27bf8d24244b | 107 | } else { |
okini3939 | 1:27bf8d24244b | 108 | strcpy(buf, "GET "); |
okini3939 | 1:27bf8d24244b | 109 | } |
okini3939 | 1:27bf8d24244b | 110 | strcat(buf, uri); |
okini3939 | 1:27bf8d24244b | 111 | strcat(buf, " HTTP/1.1\r\nHost: "); |
okini3939 | 1:27bf8d24244b | 112 | strcat(buf, host->getName()); |
okini3939 | 1:27bf8d24244b | 113 | strcat(buf, "\r\n"); |
okini3939 | 1:27bf8d24244b | 114 | strcat(buf, "Connection: close\r\n"); |
okini3939 | 1:27bf8d24244b | 115 | if (head) { |
okini3939 | 1:27bf8d24244b | 116 | strcat(buf, head); |
okini3939 | 1:27bf8d24244b | 117 | } |
okini3939 | 1:27bf8d24244b | 118 | if (method == METHOD_POST) { |
okini3939 | 1:27bf8d24244b | 119 | sprintf(tmp, "Content-Length: %d\r\n", strlen(body)); |
okini3939 | 1:27bf8d24244b | 120 | strcat(buf, tmp); |
okini3939 | 1:27bf8d24244b | 121 | } |
okini3939 | 1:27bf8d24244b | 122 | strcat(buf, "\r\n"); |
okini3939 | 1:27bf8d24244b | 123 | |
okini3939 | 1:27bf8d24244b | 124 | // send HTTP request |
okini3939 | 1:27bf8d24244b | 125 | len = strlen(buf); |
okini3939 | 1:27bf8d24244b | 126 | ipaddr = host->getIp(); |
okini3939 | 1:27bf8d24244b | 127 | httpRequest.setAddress(ipaddr); |
okini3939 | 1:27bf8d24244b | 128 | httpRequest.setDstPort(host->getPort()); |
okini3939 | 1:27bf8d24244b | 129 | httpRequest.setSrcPort(HTTP_SRC_PORT); |
okini3939 | 1:27bf8d24244b | 130 | httpRequest.setProtocol(PROTOCOL_TCP); |
okini3939 | 1:27bf8d24244b | 131 | httpRequest.setPayload((uint8_t*)buf); |
okini3939 | 1:27bf8d24244b | 132 | httpRequest.setPayloadLength(len); |
okini3939 | 1:27bf8d24244b | 133 | httpRequest.setFrameId(xbee.getNextFrameId()); |
okini3939 | 1:27bf8d24244b | 134 | xbee.send(httpRequest); |
okini3939 | 1:27bf8d24244b | 135 | r = xbee.getWiResponse(TX_STATUS_RESPONSE, httpRequest.getFrameId()); |
okini3939 | 1:27bf8d24244b | 136 | pc.printf("wifi TX: %d\r\n", r); |
okini3939 | 1:27bf8d24244b | 137 | if (r < 0) return -1; |
okini3939 | 1:27bf8d24244b | 138 | |
okini3939 | 1:27bf8d24244b | 139 | // wait responce |
okini3939 | 1:27bf8d24244b | 140 | timeout.reset(); |
okini3939 | 1:27bf8d24244b | 141 | timeout.start(); |
okini3939 | 1:27bf8d24244b | 142 | while (timeout.read_ms() < HTTP_TIMEOUT) { |
okini3939 | 1:27bf8d24244b | 143 | // recv HTTP request |
okini3939 | 1:27bf8d24244b | 144 | r = xbee.getWiResponse(IPv4_RX_FRAME, 0, 3000); |
okini3939 | 1:27bf8d24244b | 145 | pc.printf("wifi RX: %d\r\n", r); |
okini3939 | 1:27bf8d24244b | 146 | if (r >= 0) { |
okini3939 | 1:27bf8d24244b | 147 | timeout.reset(); |
okini3939 | 1:27bf8d24244b | 148 | xbee.getResponse().getAtCommandResponse(httpResponse); |
okini3939 | 1:27bf8d24244b | 149 | pc.printf("\r\n--- recv %d ---\r\n", httpResponse.getDataLength()); |
okini3939 | 1:27bf8d24244b | 150 | strncpy(buf, (char*)httpResponse.getData(), httpResponse.getDataLength()); |
okini3939 | 1:27bf8d24244b | 151 | buf[httpResponse.getDataLength()] = 0; |
okini3939 | 1:27bf8d24244b | 152 | pc.printf(buf); |
okini3939 | 1:27bf8d24244b | 153 | } |
okini3939 | 1:27bf8d24244b | 154 | } |
okini3939 | 1:27bf8d24244b | 155 | timeout.stop(); |
okini3939 | 1:27bf8d24244b | 156 | return 0; |
okini3939 | 1:27bf8d24244b | 157 | } |
okini3939 | 1:27bf8d24244b | 158 | |
okini3939 | 0:a566d771935a | 159 | int main() { |
ban4jp | 3:67a2c13289ad | 160 | // int i; |
okini3939 | 0:a566d771935a | 161 | IpAddr ipaddr, netmask, gateway, nameserver; |
okini3939 | 1:27bf8d24244b | 162 | Host host; |
okini3939 | 0:a566d771935a | 163 | |
ban4jp | 3:67a2c13289ad | 164 | // xbee.begin(115200); |
okini3939 | 1:27bf8d24244b | 165 | // xbee.baud(921000); |
ban4jp | 3:67a2c13289ad | 166 | pc.baud(9600); |
okini3939 | 0:a566d771935a | 167 | pc.printf("XBee WiFi test\r\n"); |
okini3939 | 0:a566d771935a | 168 | |
okini3939 | 1:27bf8d24244b | 169 | if (init_wifi(20)) { |
okini3939 | 0:a566d771935a | 170 | pc.printf("XBee error\r\n"); |
okini3939 | 0:a566d771935a | 171 | return -1; |
okini3939 | 0:a566d771935a | 172 | } |
okini3939 | 0:a566d771935a | 173 | |
okini3939 | 0:a566d771935a | 174 | xbee.getAddress(ipaddr, netmask, gateway, nameserver); |
okini3939 | 0:a566d771935a | 175 | pc.printf("IP address %d.%d.%d.%d\r\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); |
ban4jp | 3:67a2c13289ad | 176 | if (ipaddr.isNull()) { |
okini3939 | 1:27bf8d24244b | 177 | pc.printf("not configure\r\n"); |
okini3939 | 1:27bf8d24244b | 178 | return -1; |
okini3939 | 1:27bf8d24244b | 179 | } |
okini3939 | 0:a566d771935a | 180 | |
okini3939 | 1:27bf8d24244b | 181 | /* |
okini3939 | 1:27bf8d24244b | 182 | // DNS lookup |
okini3939 | 1:27bf8d24244b | 183 | // *** Note: wifi is turned off when XBee send/recv the port 53 udp packet. |
okini3939 | 1:27bf8d24244b | 184 | // XBee wifi --> request --> DNS server (wifi OK) |
okini3939 | 1:27bf8d24244b | 185 | // DNS server --> responce --> XBee wifi (wifi turned off) |
okini3939 | 1:27bf8d24244b | 186 | // why ?? |
okini3939 | 0:a566d771935a | 187 | nameserver = gateway; |
okini3939 | 1:27bf8d24244b | 188 | // nameserver = IpAddr(12,34,56,78); |
okini3939 | 1:27bf8d24244b | 189 | pc.printf("resolver %d.%d.%d.%d\r\n", nameserver[0], nameserver[1], nameserver[2], nameserver[3]); |
okini3939 | 0:a566d771935a | 190 | xbee.setNameserver(nameserver); |
okini3939 | 0:a566d771935a | 191 | i = xbee.getHostByName("mbed.org", ipaddr); |
okini3939 | 0:a566d771935a | 192 | if (i) { |
okini3939 | 0:a566d771935a | 193 | pc.printf("error resolv %d\r\n", i); |
okini3939 | 0:a566d771935a | 194 | } else { |
okini3939 | 0:a566d771935a | 195 | pc.printf("resolv address %d.%d.%d.%d\r\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); |
okini3939 | 0:a566d771935a | 196 | } |
okini3939 | 1:27bf8d24244b | 197 | */ |
okini3939 | 1:27bf8d24244b | 198 | // HTTP request |
okini3939 | 1:27bf8d24244b | 199 | wait(1); |
ban4jp | 3:67a2c13289ad | 200 | host.setIp(IpAddr(54,243,166,106)); |
ban4jp | 3:67a2c13289ad | 201 | host.setName("httpbin.org"); |
ban4jp | 3:67a2c13289ad | 202 | httpRequest(METHOD_GET, &host, "/get", "", ""); |
okini3939 | 0:a566d771935a | 203 | |
ban4jp | 3:67a2c13289ad | 204 | pc.printf("done.\r\n"); |
ban4jp | 3:67a2c13289ad | 205 | while(1); |
okini3939 | 0:a566d771935a | 206 | |
okini3939 | 0:a566d771935a | 207 | } |