]> granicus.if.org Git - esp-idf/commitdiff
examples: HTTP request example
authorAngus Gratton <angus@espressif.com>
Wed, 21 Sep 2016 04:57:02 +0000 (14:57 +1000)
committerAngus Gratton <angus@espressif.com>
Tue, 27 Sep 2016 00:38:00 +0000 (10:38 +1000)
examples/02_http_request/Makefile [new file with mode: 0644]
examples/02_http_request/README.md [new file with mode: 0644]
examples/02_http_request/main/Kconfig.projbuild [new file with mode: 0644]
examples/02_http_request/main/component.mk [new file with mode: 0644]
examples/02_http_request/main/http_request_main.c [new file with mode: 0644]

diff --git a/examples/02_http_request/Makefile b/examples/02_http_request/Makefile
new file mode 100644 (file)
index 0000000..2625075
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# This is a project Makefile. It is assumed the directory this Makefile resides in is a
+# project subdirectory.
+#
+
+PROJECT_NAME := http-request
+
+include $(IDF_PATH)/make/project.mk
+
diff --git a/examples/02_http_request/README.md b/examples/02_http_request/README.md
new file mode 100644 (file)
index 0000000..1e1bd3d
--- /dev/null
@@ -0,0 +1,5 @@
+# HTTP Request Example
+
+Uses a POSIX socket to make a very simple HTTP request.
+
+See the README.md file in the upper level 'examples' directory for more information about examples.
diff --git a/examples/02_http_request/main/Kconfig.projbuild b/examples/02_http_request/main/Kconfig.projbuild
new file mode 100644 (file)
index 0000000..c5d5523
--- /dev/null
@@ -0,0 +1,17 @@
+menu "Example Configuration"
+
+config WIFI_SSID
+    string "WiFi SSID"
+       default "myssid"
+       help
+               SSID (network name) for the example to connect to.
+
+config WIFI_PASSWORD
+    string "WiFi Password"
+       default "myssid"
+       help
+               WiFi password (WPA or WPA2) for the example to use.
+
+               Can be left blank if the network has no security set.
+
+endmenu
\ No newline at end of file
diff --git a/examples/02_http_request/main/component.mk b/examples/02_http_request/main/component.mk
new file mode 100644 (file)
index 0000000..24356f2
--- /dev/null
@@ -0,0 +1,10 @@
+#
+# Main Makefile. This is basically the same as a component makefile.
+#
+# This Makefile should, at the very least, just include $(SDK_PATH)/make/component_common.mk. By default, 
+# this will take the sources in the src/ directory, compile them and link them into 
+# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable,
+# please read the ESP-IDF documents if you need to do this.
+#
+
+include $(IDF_PATH)/make/component_common.mk
diff --git a/examples/02_http_request/main/http_request_main.c b/examples/02_http_request/main/http_request_main.c
new file mode 100644 (file)
index 0000000..8360c9e
--- /dev/null
@@ -0,0 +1,159 @@
+/* HTTP GET Example using plain POSIX sockets
+
+   This example code is in the Public Domain (or CC0 licensed, at your option.)
+
+   Unless required by applicable law or agreed to in writing, this
+   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+   CONDITIONS OF ANY KIND, either express or implied.
+*/
+#include <string.h>
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "esp_wifi.h"
+#include "esp_event.h"
+#include "esp_log.h"
+
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+#include "lwip/netdb.h"
+#include "lwip/dns.h"
+
+/* The examples use simple WiFi configuration that you can set via
+   'make menuconfig'.
+
+   If you'd rather not, just change the below entries to strings with
+   the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
+*/
+#define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID
+#define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD
+
+/* Flag for when we are connected & ready to make a request */
+static volatile bool ready;
+
+/* Constants that aren't configurable in menuconfig */
+#define WEB_SERVER "example.com"
+#define WEB_PORT 80
+#define WEB_URL "http://example.com/"
+
+static const char *TAG = "example";
+
+static const char *REQUEST = "GET " WEB_URL " HTTP/1.1\n"
+    "Host: "WEB_SERVER"\n"
+    "User-Agent: esp-idf/1.0 esp32\n"
+    "\n";
+
+static esp_err_t wifi_event_cb(void *ctx, system_event_t *event)
+{
+    switch(event->event_id) {
+    case SYSTEM_EVENT_STA_GOT_IP:
+        ready = true;
+        break;
+    case SYSTEM_EVENT_STA_DISCONNECTED:
+        ready = false;
+        break;
+    default:
+        break;
+    }
+    return ESP_OK;
+}
+
+static void set_wifi_configuration(void)
+{
+    wifi_config_t wifi_config = {
+        .sta = {
+            .ssid = EXAMPLE_WIFI_SSID,
+            .password = EXAMPLE_WIFI_PASS,
+        },
+    };
+    ESP_LOGI(TAG, "Setting WiFi configuration SSID %s...", wifi_config.sta.ssid);
+    esp_wifi_set_mode(WIFI_MODE_STA);
+    esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
+}
+
+static void http_get_task(void *pvParameters)
+{
+    const struct addrinfo hints = {
+        .ai_family = AF_INET,
+        .ai_socktype = SOCK_STREAM,
+    };
+    struct addrinfo *res;
+    struct in_addr *addr;
+    int s, r;
+    char recv_buf[64];
+
+    while(1) {
+        esp_wifi_connect();
+        /* Wait for the event callback to tell us we are connected */
+        while (!ready) {
+            vTaskDelay(1);
+        }
+        ESP_LOGI(TAG, "Connected to AP");
+
+        int err = getaddrinfo(WEB_SERVER, "80", &hints, &res);
+
+        if(err != 0 || res == NULL) {
+            ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res);
+            vTaskDelay(1000 / portTICK_RATE_MS);
+            continue;
+        }
+
+        /* Code to print the resolved IP.
+
+           Note: inet_ntoa is non-reentrant, look at ipaddr_ntoa_r for "real" code */
+        addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
+        ESP_LOGI(TAG, "DNS lookup succeeded. IP=%s", inet_ntoa(*addr));
+
+        s = socket(res->ai_family, res->ai_socktype, 0);
+        if(s < 0) {
+            ESP_LOGE(TAG, "... Failed to allocate socket.");
+            freeaddrinfo(res);
+            vTaskDelay(1000 / portTICK_RATE_MS);
+            continue;
+        }
+        ESP_LOGI(TAG, "... allocated socket\r\n");
+
+        if(connect(s, res->ai_addr, res->ai_addrlen) != 0) {
+            ESP_LOGE(TAG, "... socket connect failed errno=%d", errno);
+            close(s);
+            freeaddrinfo(res);
+            vTaskDelay(4000 / portTICK_RATE_MS);
+            continue;
+        }
+
+        ESP_LOGI(TAG, "... connected");
+        freeaddrinfo(res);
+
+        if (write(s, REQUEST, strlen(REQUEST)) < 0) {
+            ESP_LOGE(TAG, "... socket send failed");
+            close(s);
+            vTaskDelay(4000 / portTICK_RATE_MS);
+            continue;
+        }
+        ESP_LOGI(TAG, "... socket send success");
+
+        /* Read HTTP response */
+        do {
+            bzero(recv_buf, sizeof(recv_buf));
+            r = read(s, recv_buf, sizeof(recv_buf)-1);
+            for(int i = 0; i < r; i++) {
+                putchar(recv_buf[i]);
+            }
+        } while(r > 0);
+
+        ESP_LOGI(TAG, "... done reading from socket. Last read return=%d errno=%d\r\n", r, errno);
+        close(s);
+        for(int countdown = 10; countdown >= 0; countdown--) {
+            ESP_LOGI(TAG, "%d... ", countdown);
+            vTaskDelay(1000 / portTICK_RATE_MS);
+        }
+        ESP_LOGI(TAG, "Starting again!");
+    }
+}
+
+void app_main()
+{
+    esp_event_set_cb(wifi_event_cb, NULL);
+    set_wifi_configuration();
+    xTaskCreate(&http_get_task, "http_get_task", 2048, NULL, 5, NULL);
+}