Using TCP Client on WIZwiki-W7500, display weather conditions on led and temperature with servo-motor
Dependencies: WIZnetInterface mbed-src
Prerequisite
This example is for PIR test using digital I/O.
To implement this function, you need a Platform board, network Interface board.
- WIZwiki-W7500 from WIZnet (Platform board and Ethernet I/F board)
Hardware Configuration
WIZwiki-W7500 Pin map
Just connect Ethernet Cable & USB Cable
Software
Init Ethernet
void initEthernet(uint8_t* mac_addr) { int phy_link; eth.init(mac_addr); //Use DHCP eth.connect(); /* phy link */ do{ phy_link = eth.ethernet_link(); printf("."); wait(2); }while(!phy_link); printf("\r\n"); printf("IP Address is %s\r\n", eth.getIPAddress()); }
Request to server using HTTP
void requestHTTP(void) { char req_buf[256]; /* TCP socket connect */ sock.connect(WEB_SERVER, 80); /* Request to WEB Server using HTTP */ sprintf(req_buf,"GET /data/2.5/weather?q=%s,%s&appid=%s HTTP/1.1\nHost: %s\nConnection: close\n\n", CITY,COUNTRY, API_KEY, WEB_SERVER); sock.send_all(req_buf, strlen(req_buf)); }
Get data from server & Parsing it
void parsingGetData(void) { char buffer[1024]; /* get info */ int ret; while (true) { ret = sock.receive_all(buffer, sizeof(buffer)-1); if (ret <= 0) break; buffer[ret] = '\0'; pc.printf("Received %d chars from server: %s\n", ret, buffer); } /* parsing weather, city, tempurature */ char *weather; char *city; char *temp; uint8_t i; pc.printf("\r\n\r\n======== WeatherForecast ========\r\n"); weather = strstr(buffer, "main"); pc.printf("\t State : "); for(i = 7; i < 20; i++) { if(*(weather+i) == '\"') break; pc.printf("%c", *(weather+i)); } city = strstr(buffer, "name"); pc.printf("\r\n\t City : "); for(i = 7; i < 20; i++) { if(*(city+i) == '\"') break; pc.printf("%c", *(city+i)); } temp = strstr(buffer, "temp"); pc.printf("\r\n\t temp(kelvin) : "); for(i = 6; i < 12; i++) { if((*(temp+i) == '\"')||(*(temp+i) == ',')) break; pc.printf("%c", *(temp+i)); } pc.printf("\r\n\r\n"); }
Caution
Must fix API_KEY & MAC Address
main.cpp@19:46fa6a0a9b5c, 2017-04-07 (annotated)
- Committer:
- kei44
- Date:
- Fri Apr 07 08:51:49 2017 +0000
- Revision:
- 19:46fa6a0a9b5c
- Parent:
- 18:a02a73acd3c8
Modify old code.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kei44 | 19:46fa6a0a9b5c | 1 | #include <stdio.h> |
kei44 | 19:46fa6a0a9b5c | 2 | #include <string.h> |
donatien | 0:bb128f0e952f | 3 | #include "mbed.h" |
donatien | 0:bb128f0e952f | 4 | #include "EthernetInterface.h" |
joon874 | 17:ca0b0402a4fe | 5 | |
kei44 | 19:46fa6a0a9b5c | 6 | #define CITY "Seoul" |
kei44 | 19:46fa6a0a9b5c | 7 | #define COUNTRY "kr" |
kei44 | 19:46fa6a0a9b5c | 8 | #define API_KEY "YOUR_API" //Fix This |
kei44 | 19:46fa6a0a9b5c | 9 | #define WEB_SERVER "api.openweathermap.org" |
joon874 | 17:ca0b0402a4fe | 10 | |
kei44 | 19:46fa6a0a9b5c | 11 | Serial pc(USBTX, USBRX); |
kei44 | 19:46fa6a0a9b5c | 12 | EthernetInterface eth; |
kei44 | 19:46fa6a0a9b5c | 13 | TCPSocketConnection sock; |
donatien | 0:bb128f0e952f | 14 | |
kei44 | 19:46fa6a0a9b5c | 15 | uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0xFF, 0xFF, 0xFF}; //Fix This |
kei44 | 19:46fa6a0a9b5c | 16 | |
kei44 | 19:46fa6a0a9b5c | 17 | // Function Prototypes |
kei44 | 19:46fa6a0a9b5c | 18 | void parsingGetData(void); |
kei44 | 19:46fa6a0a9b5c | 19 | void initEthernet(uint8_t* mac_addr); |
kei44 | 19:46fa6a0a9b5c | 20 | void requestHTTP(void); |
kei44 | 19:46fa6a0a9b5c | 21 | |
kei44 | 19:46fa6a0a9b5c | 22 | int main() |
kei44 | 19:46fa6a0a9b5c | 23 | { |
kei44 | 19:46fa6a0a9b5c | 24 | pc.baud(115200); |
joon874 | 17:ca0b0402a4fe | 25 | |
kei44 | 19:46fa6a0a9b5c | 26 | initEthernet(mac_addr); |
donatien | 0:bb128f0e952f | 27 | |
kei44 | 19:46fa6a0a9b5c | 28 | while(1) |
kei44 | 19:46fa6a0a9b5c | 29 | { |
kei44 | 19:46fa6a0a9b5c | 30 | requestHTTP(); |
kei44 | 19:46fa6a0a9b5c | 31 | |
kei44 | 19:46fa6a0a9b5c | 32 | parsingGetData(); |
joon874 | 17:ca0b0402a4fe | 33 | |
kei44 | 19:46fa6a0a9b5c | 34 | sock.close(); |
kei44 | 19:46fa6a0a9b5c | 35 | eth.disconnect(); |
kei44 | 19:46fa6a0a9b5c | 36 | |
kei44 | 19:46fa6a0a9b5c | 37 | wait(60.0); |
kei44 | 19:46fa6a0a9b5c | 38 | }; |
kei44 | 19:46fa6a0a9b5c | 39 | |
kei44 | 19:46fa6a0a9b5c | 40 | } |
kei44 | 19:46fa6a0a9b5c | 41 | |
kei44 | 19:46fa6a0a9b5c | 42 | /** |
kei44 | 19:46fa6a0a9b5c | 43 | * @brief parsing Get Data from server |
kei44 | 19:46fa6a0a9b5c | 44 | * @detail Function get data from server at once & parsing it for take needed data |
kei44 | 19:46fa6a0a9b5c | 45 | * @param void |
kei44 | 19:46fa6a0a9b5c | 46 | * @return void |
kei44 | 19:46fa6a0a9b5c | 47 | * @throws return Occurs when the param value exceeds the specified range. |
kei44 | 19:46fa6a0a9b5c | 48 | */ |
kei44 | 19:46fa6a0a9b5c | 49 | void parsingGetData(void) |
kei44 | 19:46fa6a0a9b5c | 50 | { |
kei44 | 19:46fa6a0a9b5c | 51 | char buffer[1024]; |
kei44 | 19:46fa6a0a9b5c | 52 | |
joon874 | 17:ca0b0402a4fe | 53 | /* get info */ |
donatien | 0:bb128f0e952f | 54 | int ret; |
emilmont | 7:65188f4a8c25 | 55 | while (true) { |
kei44 | 19:46fa6a0a9b5c | 56 | ret = sock.receive_all(buffer, sizeof(buffer)-1); |
kei44 | 19:46fa6a0a9b5c | 57 | if (ret <= 0) break; |
emilmont | 9:4757a976148d | 58 | buffer[ret] = '\0'; |
kei44 | 19:46fa6a0a9b5c | 59 | pc.printf("Received %d chars from server: %s\n", ret, buffer); |
emilmont | 7:65188f4a8c25 | 60 | } |
kei44 | 19:46fa6a0a9b5c | 61 | |
kei44 | 19:46fa6a0a9b5c | 62 | /* parsing weather, city, tempurature */ |
joon874 | 17:ca0b0402a4fe | 63 | char *weather; |
joon874 | 17:ca0b0402a4fe | 64 | char *city; |
kei44 | 19:46fa6a0a9b5c | 65 | char *temp; |
kei44 | 19:46fa6a0a9b5c | 66 | uint8_t i; |
joon874 | 17:ca0b0402a4fe | 67 | |
kei44 | 19:46fa6a0a9b5c | 68 | pc.printf("\r\n\r\n======== WeatherForecast ========\r\n"); |
kei44 | 19:46fa6a0a9b5c | 69 | weather = strstr(buffer, "main"); |
kei44 | 19:46fa6a0a9b5c | 70 | pc.printf("\t State : "); |
kei44 | 19:46fa6a0a9b5c | 71 | for(i = 7; i < 20; i++) |
kei44 | 19:46fa6a0a9b5c | 72 | { |
kei44 | 19:46fa6a0a9b5c | 73 | if(*(weather+i) == '\"') break; |
kei44 | 19:46fa6a0a9b5c | 74 | pc.printf("%c", *(weather+i)); |
kei44 | 19:46fa6a0a9b5c | 75 | } |
kei44 | 19:46fa6a0a9b5c | 76 | |
kei44 | 19:46fa6a0a9b5c | 77 | city = strstr(buffer, "name"); |
kei44 | 19:46fa6a0a9b5c | 78 | pc.printf("\r\n\t City : "); |
kei44 | 19:46fa6a0a9b5c | 79 | for(i = 7; i < 20; i++) |
kei44 | 19:46fa6a0a9b5c | 80 | { |
kei44 | 19:46fa6a0a9b5c | 81 | if(*(city+i) == '\"') break; |
kei44 | 19:46fa6a0a9b5c | 82 | pc.printf("%c", *(city+i)); |
kei44 | 19:46fa6a0a9b5c | 83 | } |
joon874 | 17:ca0b0402a4fe | 84 | |
kei44 | 19:46fa6a0a9b5c | 85 | temp = strstr(buffer, "temp"); |
kei44 | 19:46fa6a0a9b5c | 86 | pc.printf("\r\n\t temp(kelvin) : "); |
kei44 | 19:46fa6a0a9b5c | 87 | for(i = 6; i < 12; i++) |
kei44 | 19:46fa6a0a9b5c | 88 | { |
kei44 | 19:46fa6a0a9b5c | 89 | if((*(temp+i) == '\"')||(*(temp+i) == ',')) break; |
kei44 | 19:46fa6a0a9b5c | 90 | pc.printf("%c", *(temp+i)); |
kei44 | 19:46fa6a0a9b5c | 91 | } |
kei44 | 19:46fa6a0a9b5c | 92 | pc.printf("\r\n\r\n"); |
kei44 | 19:46fa6a0a9b5c | 93 | } |
joon874 | 17:ca0b0402a4fe | 94 | |
kei44 | 19:46fa6a0a9b5c | 95 | /** |
kei44 | 19:46fa6a0a9b5c | 96 | * @brief Request to server using HTTP. |
kei44 | 19:46fa6a0a9b5c | 97 | * @detail Sends param values to the server via HTTP. |
kei44 | 19:46fa6a0a9b5c | 98 | * @param void |
kei44 | 19:46fa6a0a9b5c | 99 | * @return void |
kei44 | 19:46fa6a0a9b5c | 100 | * @throws |
kei44 | 19:46fa6a0a9b5c | 101 | */ |
kei44 | 19:46fa6a0a9b5c | 102 | void requestHTTP(void) |
kei44 | 19:46fa6a0a9b5c | 103 | { |
kei44 | 19:46fa6a0a9b5c | 104 | char req_buf[256]; |
kei44 | 19:46fa6a0a9b5c | 105 | |
kei44 | 19:46fa6a0a9b5c | 106 | /* TCP socket connect */ |
kei44 | 19:46fa6a0a9b5c | 107 | sock.connect(WEB_SERVER, 80); |
kei44 | 19:46fa6a0a9b5c | 108 | |
kei44 | 19:46fa6a0a9b5c | 109 | /* Request to WEB Server using HTTP */ |
kei44 | 19:46fa6a0a9b5c | 110 | sprintf(req_buf,"GET /data/2.5/weather?q=%s,%s&appid=%s HTTP/1.1\nHost: %s\nConnection: close\n\n", |
kei44 | 19:46fa6a0a9b5c | 111 | CITY,COUNTRY, API_KEY, WEB_SERVER); |
kei44 | 19:46fa6a0a9b5c | 112 | sock.send_all(req_buf, strlen(req_buf)); |
kei44 | 19:46fa6a0a9b5c | 113 | } |
joon874 | 17:ca0b0402a4fe | 114 | |
kei44 | 19:46fa6a0a9b5c | 115 | /** |
kei44 | 19:46fa6a0a9b5c | 116 | * @brief Initialize W5500 (Ethernet chip) |
kei44 | 19:46fa6a0a9b5c | 117 | * @detail Function to initialize W5500 chip to use ethernet |
kei44 | 19:46fa6a0a9b5c | 118 | * @param void |
kei44 | 19:46fa6a0a9b5c | 119 | * @return void |
kei44 | 19:46fa6a0a9b5c | 120 | * @throws |
kei44 | 19:46fa6a0a9b5c | 121 | */ |
kei44 | 19:46fa6a0a9b5c | 122 | void initEthernet(uint8_t* mac_addr) { |
kei44 | 19:46fa6a0a9b5c | 123 | int phy_link; |
kei44 | 19:46fa6a0a9b5c | 124 | |
kei44 | 19:46fa6a0a9b5c | 125 | eth.init(mac_addr); //Use DHCP |
donatien | 5:01f6c3e112af | 126 | |
kei44 | 19:46fa6a0a9b5c | 127 | eth.connect(); |
kei44 | 19:46fa6a0a9b5c | 128 | |
kei44 | 19:46fa6a0a9b5c | 129 | /* phy link */ |
kei44 | 19:46fa6a0a9b5c | 130 | do{ |
kei44 | 19:46fa6a0a9b5c | 131 | phy_link = eth.ethernet_link(); |
kei44 | 19:46fa6a0a9b5c | 132 | printf("."); |
kei44 | 19:46fa6a0a9b5c | 133 | wait(2); |
kei44 | 19:46fa6a0a9b5c | 134 | }while(!phy_link); |
kei44 | 19:46fa6a0a9b5c | 135 | printf("\r\n"); |
kei44 | 19:46fa6a0a9b5c | 136 | |
kei44 | 19:46fa6a0a9b5c | 137 | printf("IP Address is %s\r\n", eth.getIPAddress()); |
joon874 | 17:ca0b0402a4fe | 138 | } |