/* http_get - Retrieves a web page over HTTP GET. * * See http_get_ssl for a TLS-enabled version. * * This sample code is in the public domain., */ #include "espressif/esp_common.h" #include "esp/uart.h" #include #include "FreeRTOS.h" #include "task.h" #include "lwip/err.h" #include "lwip/sockets.h" #include "lwip/sys.h" #include "lwip/netdb.h" #include "lwip/dns.h" #include "ssid_config.h" #define WEB_SERVER "famtenberge.nl" #define WEB_PORT 80 #define WEB_URL "/terrasverlichting/bediening/FW.BIN" void http_get_task(void *pvParameters) { int successes = 0, failures = 0; printf("HTTP get task starting...\r\n"); while(1) { const struct addrinfo hints = { .ai_family = AF_INET, .ai_socktype = SOCK_STREAM, }; struct addrinfo *res; printf("Running DNS lookup for %s...\r\n", WEB_SERVER); int err = getaddrinfo(WEB_SERVER, "80", &hints, &res); if(err != 0 || res == NULL) { printf("DNS lookup failed err=%d res=%p\r\n", err, res); if(res) freeaddrinfo(res); vTaskDelay(1000 / portTICK_RATE_MS); failures++; continue; } /* Note: inet_ntoa is non-reentrant, look at ipaddr_ntoa_r for "real" code */ struct in_addr *addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr; printf("DNS lookup succeeded. IP=%s\r\n", inet_ntoa(*addr)); int s = socket(res->ai_family, res->ai_socktype, 0); if(s < 0) { printf("... Failed to allocate socket.\r\n"); freeaddrinfo(res); vTaskDelay(1000 / portTICK_RATE_MS); failures++; continue; } printf("... allocated socket\r\n"); if(connect(s, res->ai_addr, res->ai_addrlen) != 0) { lwip_close(s); freeaddrinfo(res); printf("... socket connect failed.\r\n"); vTaskDelay(4000 / portTICK_RATE_MS); failures++; continue; } printf("... connected\r\n"); freeaddrinfo(res); const char *req = "GET "WEB_URL" HTTP/1.1\r\n" "Host: "WEB_SERVER"\r\n" "User-Agent: esp-open-rtos/0.1 esp8266\r\n" "Connection: close\r\n" "\r\n"; if (lwip_write(s, req, strlen(req)) < 0) { printf("... socket send failed\r\n"); lwip_close(s); vTaskDelay(4000 / portTICK_RATE_MS); failures++; continue; } printf("... socket send success\r\n"); static char recv_buf[128]; int r; uint32_t total_received = 0; do { bzero(recv_buf, 128); r = lwip_read(s, recv_buf, 127); if(r > 0) { //printf("%s", recv_buf); printf("%i\n", r); total_received += r; } } while(r > 0); printf("... done reading from socket. Last read return=%d errno=%d\r\n", r, errno); printf("total length: %i\n", total_received); if(r != 0) failures++; else successes++; lwip_close(s); printf("successes = %d failures = %d\r\n", successes, failures); for(int countdown = 100; countdown >= 0; countdown--) { printf("%d... ", countdown); vTaskDelay(1000 / portTICK_RATE_MS); } printf("\r\nStarting again!\r\n"); } } void uart_tx_one_char(uint8_t uart, uint8_t TxChar) { while (true) { uint32_t fifo_cnt = READ_PERI_REG(UART_STATUS(uart)) & (UART_TXFIFO_CNT<> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) { break; } } WRITE_PERI_REG(UART_FIFO(uart) , TxChar); } void uart1_write_char(char c) { uart_tx_one_char(1, c); } void user_init(void) { uart_set_baud(0, 115200); uart_set_baud(1, 115200); sdk_os_install_putc1(uart1_write_char); // the system functions should send their debug output to UART1 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK); // set GPIO2 to alternative function TxD1 printf("SDK version:%s\n", sdk_system_get_sdk_version()); struct sdk_station_config config = { .ssid = WIFI_SSID, .password = WIFI_PASS, }; /* required to call wifi_set_opmode before station_set_config */ sdk_wifi_set_opmode(STATION_MODE); sdk_wifi_station_set_config(&config); xTaskCreate(&http_get_task, (signed char *)"get_task", 256, NULL, 2, NULL); }