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

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

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?

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