在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP32 IDF創(chuàng)建WEB SERVER的流程

CHANBAEK ? 來(lái)源:編程圈子 ? 作者:編程圈子 ? 2023-03-13 15:36 ? 次閱讀

一、ESP32 IDF創(chuàng)建WEB SERVER的流程

1. 配置web服務(wù)器

在ESP-IDF中,Web服務(wù)器使用httpd組件實(shí)現(xiàn)。我們需要先創(chuàng)建httpd_config_t結(jié)構(gòu)體,指定服務(wù)器的端口、最大并發(fā)連接數(shù)、URI匹配處理器等選項(xiàng)。然后,我們通過(guò)調(diào)用httpd_start函數(shù)來(lái)啟動(dòng)Web服務(wù)器。

httpd_config_t config = HTTPD_DEFAULT_CONFIG();
httpd_handle_t server = NULL;

// 設(shè)置服務(wù)器端口為80
config.server_port = 80;

// 創(chuàng)建HTTP服務(wù)器句柄
if (httpd_start(&server, &config) != ESP_OK) {
    printf("Error starting server!\\n");
    return;
}

在這個(gè)示例中,我們首先使用HTTPD_DEFAULT_CONFIG宏創(chuàng)建默認(rèn)的Web服務(wù)器配置。接著,我們將服務(wù)器端口設(shè)置為80,創(chuàng)建HTTP服務(wù)器句柄,并啟動(dòng)Web服務(wù)器。

2. 注冊(cè) URI處理器

在Web服務(wù)器啟動(dòng)后,我們需要為不同的URI注冊(cè)處理器函數(shù)。當(dāng)Web服務(wù)器接收到請(qǐng)求時(shí),會(huì)根據(jù)請(qǐng)求的URI選擇相應(yīng)的處理器函數(shù)進(jìn)行處理。在ESP-IDF中,我們可以使用

httpd_register_uri_handler函數(shù)注冊(cè)URI處理器。該函數(shù)的原型如下:

esp_err_t httpd_register_uri_handler(httpd_handle_t hd, const httpd_uri_t *uri)

其中,hd參數(shù)為HTTP服務(wù)器句柄;uri參數(shù)為包含URI路徑、HTTP方法、處理函數(shù)等信息的結(jié)構(gòu)體指針。例如:

static esp_err_t hello_get_handler(httpd_req_t *req)
{
    char resp_str[64];
    httpd_req_get_url_query_str(req, resp_str, sizeof(resp_str));
    printf("query string: %s\\n", resp_str);
    httpd_resp_send(req, "Hello, world!", HTTPD_RESP_USE_STRLEN);
    return ESP_OK;
}

httpd_uri_t hello = {
    .uri       = "/hello",
    .method    = HTTP_GET,
    .handler   = hello_get_handler,
    .user_ctx  = NULL
};

if (httpd_register_uri_handler(server, &hello) != ESP_OK) {
    printf("Error registering URI handler!\\n");
    return;
}

3. 實(shí)現(xiàn) URI處理器函數(shù)

在注冊(cè)URI處理器后,我們需要實(shí)現(xiàn)對(duì)應(yīng)的處理器函數(shù)。URI處理器函數(shù)的原型為:

typedef esp_err_t (*httpd_uri_func_t)(httpd_req_t *req);

其中,req參數(shù)為指向HTTP請(qǐng)求信息的結(jié)構(gòu)體指針,包含了請(qǐng)求的各種參數(shù)和數(shù)據(jù)。

4. 處理HTTP請(qǐng)求

在URI處理器函數(shù)中,我們可以通過(guò)HTTP請(qǐng)求信息結(jié)構(gòu)體指針httpd_req_t獲取HTTP請(qǐng)求的各種參數(shù)和數(shù)據(jù)。以下是一些常用的HTTP請(qǐng)求處理函數(shù):

  • httpd_req_get_hdr_value_str:獲取HTTP請(qǐng)求頭中指定字段的值(字符串格式)

  • httpd_req_get_url_query_str:獲取HTTP請(qǐng)求URL中的查詢參數(shù)(字符串格式)

  • httpd_query_key_value:解析HTTP請(qǐng)求URL中的查詢參數(shù),獲取指定參數(shù)名的值(字符串格式)

  • httpd_req_recv:從HTTP請(qǐng)求接收數(shù)據(jù)

  • httpd_req_send:發(fā)送HTTP響應(yīng)數(shù)據(jù)

  • httpd_resp_set_type:設(shè)置HTTP響應(yīng)內(nèi)容的MIME類型

  • httpd_resp_send_chunk:分塊發(fā)送HTTP響應(yīng)數(shù)據(jù)。

    例如,以下是一個(gè)URI處理器函數(shù)的示例,用于處理/echo路徑的POST請(qǐng)求:

static esp_err_t echo_post_handler(httpd_req_t *req)
{
    char buf[1024];
    int ret, remaining = req->content_len;

    // 從HTTP請(qǐng)求中接收數(shù)據(jù)
    while (remaining > 0) {
        ret = httpd_req_recv(req, buf, MIN(remaining, sizeof(buf)));
        if (ret <= 0) {
            if (ret == HTTPD_SOCK_ERR_TIMEOUT) {
                // 處理超時(shí)
                httpd_resp_send_408(req);
            }
            return ESP_FAIL;
        }

        // 處理接收到的數(shù)據(jù)
        // ...

        remaining -= ret;
    }

    // 發(fā)送HTTP響應(yīng)
    httpd_resp_set_type(req, HTTPD_TYPE_TEXT);
    httpd_resp_send(req, "Received data: ", -1);
    httpd_resp_send_chunk(req, buf, req->content_len);
    httpd_resp_send_chunk(req, NULL, 0);

    return ESP_OK;
}

5. 處理web socket連接

除了支持HTTP請(qǐng)求外,ESP-IDF的Web服務(wù)器還支持WebSocket連接。WebSocket是一種基于TCP的協(xié)議,可以提供雙向通信功能。在ESP-IDF中,我們可以使用httpd_ws_frame_t結(jié)構(gòu)體表示W(wǎng)ebSocket幀,使用httpd_ws_send_frame_async函數(shù)異步發(fā)送WebSocket幀。

要處理WebSocket連接,我們需要為WebSocket URI注冊(cè)專門的處理器函數(shù),并在該函數(shù)中處理WebSocket連接的各種事件。

6. 注冊(cè) URI 處理函數(shù)

創(chuàng)建好HTTP服務(wù)器后,需要注冊(cè)URI處理函數(shù),以便處理客戶端發(fā)送的請(qǐng)求。URI處理函數(shù)需要實(shí)現(xiàn)在HTTP請(qǐng)求中指定的URI。

在ESP-IDF中,可以使用

httpd_register_uri_handler()函數(shù)注冊(cè)URI處理函數(shù)。該函數(shù)需要傳入一個(gè)httpd_uri_t結(jié)構(gòu)體作為參數(shù),該結(jié)構(gòu)體包含了URI路徑和處理函數(shù)的信息。

例如,下面的代碼注冊(cè)了一個(gè)處理根目錄的URI處理函數(shù):

httpd_uri_t uri = {
    .uri       = "/",
    .method    = HTTP_GET,
    .handler   = hello_get_handler,
    .user_ctx  = NULL
};

httpd_register_uri_handler(server, &uri);

上面的代碼注冊(cè)了一個(gè)HTTP GET方法,URI路徑為“/”的處理函數(shù)hello_get_handler。當(dāng)客戶端請(qǐng)求根目錄時(shí),HTTP服務(wù)器將調(diào)用hello_get_handler函數(shù)處理請(qǐng)求。

7. 啟動(dòng)HTTP服務(wù)器

在所有的URI處理函數(shù)都被注冊(cè)后,可以調(diào)用httpd_start()函數(shù)啟動(dòng)HTTP服務(wù)器。

httpd_start(&server);

8. 發(fā)送響應(yīng)

在URI處理函數(shù)中,可以使用httpd_resp_send()函數(shù)將響應(yīng)發(fā)送回客戶端。該函數(shù)需要傳入一個(gè)httpd_req_t結(jié)構(gòu)體作為參數(shù),該結(jié)構(gòu)體表示HTTP請(qǐng)求和響應(yīng)。

例如,在上面的hello_get_handler處理函數(shù)中,可以使用httpd_resp_send()函數(shù)將“Hello, World!”字符串作為響應(yīng)發(fā)送回客戶端:

static esp_err_t hello_get_handler(httpd_req_t *req)
{
    const char* resp_str = "Hello, World!";
    httpd_resp_send(req, resp_str, strlen(resp_str));
    return ESP_OK;
}

9. 關(guān)閉 http 服務(wù)

使用httpd_stop()函數(shù),該函數(shù)用于停止HTTP服務(wù)并釋放所有資源。

// 創(chuàng)建HTTP服務(wù)
httpd_handle_t server = NULL;
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
httpd_start(&server, &config);

// 關(guān)閉HTTP服務(wù)
httpd_stop(server);

二、本要主要使用API的說(shuō)明

1. httpd_register_uri_handler

用于將HTTP請(qǐng)求的URI路由到處理程序。這個(gè)函數(shù)接收兩個(gè)參數(shù):httpd_handle_t類型的HTTP服務(wù)器句柄和httpd_uri_t類型的URI配置。

2. httpd_handle_t

httpd_handle_t是HTTP服務(wù)器的一個(gè)句柄,它是通過(guò)httpd_start函數(shù)創(chuàng)建的。而httpd_uri_t則定義了HTTP請(qǐng)求的URI信息,包括URI路徑、HTTP請(qǐng)求方法和處理函數(shù)等。

3. httpd_query_key_value獲取變量值

httpd_query_key_value 用于從查詢字符串中獲取指定鍵的值。查詢字符串是指URL中?后面的部分,包含多個(gè)鍵值對(duì),每個(gè)鍵值對(duì)之間使用&分隔。例如,對(duì)于以下URL:

http://192.168.1.1/path/to/handler?key1=value1&key2=value2

獲取其中的:

esp_err_t httpd_query_key_value(const char *query, const char *key, char *buf, size_t buf_len);

這是一個(gè)使用示例:

char query_str[] = "key1=value1&key2=value2";
char key[] = "key1";
char value[16];

if (httpd_query_key_value(query_str, key, value, sizeof(value)) == ESP_OK) {
    printf("value=%s\\n", value);
} else {
    printf("key not found\\n");
}

4. 獲取get參數(shù)示例

下面定義的 handler 演示了如何從請(qǐng)求參數(shù)里解析 字符串param1和整型變量param2:

esp_err_t index_handler(httpd_req_t *req)
{
     char* query_str = NULL;
     char param1_value[10] = {0};
     int param2_value=0;

     query_str = strstr(req->uri, "?");
     if(query_str!=NULL){
         query_str ++;
         httpd_query_key_value(query_str, "param1", param1_value, sizeof(param1_value));
         char param2_str[10] = {0};
         httpd_query_key_value(query_str, "param2", param2_str, sizeof(param2_str));
         param2_value = atoi(param2_str);
     }

     char resp_str[50] = {0};
     snprintf(resp_str, sizeof(resp_str), "param1=%s, param2=%d", param1_value, param2_value);
    httpd_resp_send(req, resp_str, strlen(resp_str));
    return ESP_OK;
}

5. 獲取post參數(shù)示例

下面的示例代碼中根據(jù)httpd_req_t的content_len來(lái)分配一個(gè)緩沖區(qū),并解析請(qǐng)求中的POST參數(shù):

esp_err_t post_demo_handler(httpd_req_t *req)
{
    char post_string[64];
    int post_int=0;

    if (req->content_len > 0)
    {
        // 從請(qǐng)求體中讀取POST參數(shù)
        char *buf = malloc(req->content_len + 1);
        int ret = httpd_req_recv(req, buf, req->content_len);
        if (ret <= 0)
        {
            // 接收數(shù)據(jù)出錯(cuò)
            free(buf);
            return ESP_FAIL;
        }
        buf[req->content_len] = '\\0';

        // 解析POST參數(shù)
        char *param_str;
        param_str = strtok(buf, "&");
        while (param_str != NULL)
        {
            char *value_str = strchr(param_str, '=');
            if (value_str != NULL)
            {
                *value_str++ = '\\0';
                if (strcmp(param_str, "post_string") == 0)
                {
                    strncpy(post_string, value_str, sizeof(post_string));
                }
                else if (strcmp(param_str, "post_int") == 0)
                {
                    post_int = atoi(value_str);
                }
            }
            param_str = strtok(NULL, "&");
        }

        free(buf);
    }

    // 將結(jié)果打印輸出
    printf("post_string=%s, post_int=%d\\n", post_string, post_int);

    // 返回成功
    httpd_resp_send(req, NULL, 0);
    return ESP_OK;
}


 httpd_uri_t post_uri = {
         .uri = "/post",
         .method = HTTP_POST,
         .handler = post_demo_handler,
         .user_ctx = NULL
 };

三、基本用法完整示例

接前文的項(xiàng)目代碼示例,項(xiàng)目結(jié)構(gòu)如下:

本文主要是使用其中的web_server.c文件。

1. 加載http_server模塊

在 CMakeLists.txt里寫上 :

idf_component_register(
	REQUIRES "esp_http_server"
)

2. 建立 web_server.h 頭文件

#ifndef ESP32_LEARN_WEB_SERVER_H
#define ESP32_LEARN_WEB_SERVER_H
void http_server_task(void *pvParameters);
#endif //ESP32_LEARN_WEB_SERVER_H

3. web_server.c文件實(shí)現(xiàn)

#include "include/web_server.h"
#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_netif.h"
#include "esp_http_server.h"
#include "string.h"
/* Define the server port number */
#define SERVER_PORT 80

/* Define the routes for the web server */
const  char *INDEX_HTML = "Hello, world";

/* Define the handler for the HTTP requests */
 esp_err_t index_handler(httpd_req_t *req)
{
    httpd_resp_send(req, INDEX_HTML, strlen(INDEX_HTML));
    return ESP_OK;
}

/* Define the HTTP server configuration */
 httpd_uri_t index_uri = {
        .uri = "/",
        .method = HTTP_GET,
        .handler = index_handler,
        .user_ctx = NULL
};

/* Define the HTTP server task */
 void http_server_task(void *pvParameters)
{
    httpd_handle_t server = NULL;
    httpd_config_t config = HTTPD_DEFAULT_CONFIG();
    config.server_port = SERVER_PORT;

    /* Start the HTTP server */
    if (httpd_start(&server, &config) == ESP_OK) {
        /* Register the routes */
        httpd_register_uri_handler(server, &index_uri);
        ESP_LOGI("HTTP_SERVER", "Server started");
    }

    /* Loop to keep the task running */
    while (1) {
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

4. main.c 創(chuàng)建任務(wù)開啟web server

#include 

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include 
#include "network/include/wifi.h"
#include "network/include/wifi_sta.h"
#include "network/include/wifi_ap.h"
#include "network/include/web_server.h"
static const char *TAG = "main";



void app_main()
{
    ESP_LOGE(TAG, "app_main");
    // 初始化NVS存儲(chǔ)區(qū)
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    // Wi-Fi初始化
    ESP_LOGI(TAG, "Wi-Fi initialization");
    wifi_initialize();

    wifi_init_softap();
    /* Start the HTTP server task */
    xTaskCreate(http_server_task, "http_server_task", 4096, NULL, 5, NULL);
    while (1) {
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1272

    瀏覽量

    69757
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9331

    瀏覽量

    86131
  • IDF
    IDF
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    12991
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    63012
  • ESP32
    +關(guān)注

    關(guān)注

    18

    文章

    980

    瀏覽量

    17565
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    esp32教程】0、環(huán)境搭建

    基于Ubuntu下,利用esp-idf進(jìn)行esp32開發(fā)的教程
    的頭像 發(fā)表于 04-21 16:54 ?4339次閱讀

    [esp32教程] 4、LEDC使用

    基于Ubuntu下,利用esp-idf進(jìn)行esp32開發(fā)的教程
    的頭像 發(fā)表于 06-03 09:39 ?4632次閱讀
    [<b class='flag-5'>esp32</b>教程] 4、LEDC使用

    [esp32教程] 5、UART使用

    基于Ubuntu下,利用esp-idf進(jìn)行esp32開發(fā)的教程
    的頭像 發(fā)表于 06-13 09:04 ?7096次閱讀
    [<b class='flag-5'>esp32</b>教程] 5、UART使用

    淺析Zephyr在ESP32上的啟動(dòng)流程

    流程進(jìn)行分析,說(shuō)明ESP32從上電開始如何執(zhí)行到Zephyr應(yīng)用的main函數(shù)。 Zephyr支持兩種ESP32引導(dǎo)方式: 配置CONFIG_BOOTLOADER_ESP_IDF=n:
    的頭像 發(fā)表于 06-07 17:04 ?5426次閱讀

    ESP32ESP-IDF 教學(xué)(三)——通用硬件定時(shí)器(Timer)

    ESP32ESP-IDF 學(xué)習(xí)筆記(三)【通用硬件定時(shí)器(Timer)】文章目錄ESP32ESP-IDF 學(xué)習(xí)筆記(三)【通用硬件定時(shí)器(Timer)】通用硬件定時(shí)器(Ti
    發(fā)表于 11-26 11:36 ?38次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP-IDF</b> 教學(xué)(三)——通用硬件定時(shí)器(Timer)

    ESP32ESP-IDF 教學(xué)(九)—— 串口通信(UART)

    ESP32ESP-IDF 教學(xué)(九)—— 串口通信(UART)文章目錄ESP32ESP-IDF 教學(xué)(九)—— 串口通信(UART)一、
    發(fā)表于 11-26 13:21 ?44次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP-IDF</b> 教學(xué)(九)—— 串口通信(UART)

    ESP32ESP-IDF 教學(xué)(五(1))——ESP-IDF的CMake 構(gòu)建系統(tǒng)(Build System)

    ESP32ESP-IDF 學(xué)習(xí)筆記(五)【ESP-IDF CMake構(gòu)建系統(tǒng)(Build System)】文章目錄ESP32ESP-ID
    發(fā)表于 12-16 16:53 ?24次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP-IDF</b> 教學(xué)(五(1))——<b class='flag-5'>ESP-IDF</b>的CMake 構(gòu)建系統(tǒng)(Build System)

    ESP32ESP-IDF 教學(xué)(八)—— 模數(shù)轉(zhuǎn)換器(ADC)

    ESP32ESP-IDF 學(xué)習(xí)筆記(七)——模數(shù)轉(zhuǎn)換器(ADC)文章目錄ESP32ESP-IDF 學(xué)習(xí)筆記(七)——模數(shù)轉(zhuǎn)換器(ADC)一、簡(jiǎn)介1、兩個(gè) ADC 通道簡(jiǎn)介:
    發(fā)表于 12-22 19:08 ?38次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP-IDF</b> 教學(xué)(八)—— 模數(shù)轉(zhuǎn)換器(ADC)

    ESP32ESP-IDF 教學(xué)WiFi篇(一)—— WiFi兩種模式

    本文章 來(lái)自原創(chuàng)專欄《ESP32教學(xué)專欄 (基于ESP-IDF)》 下的一個(gè)二級(jí)專欄 《ESP32 上的 WiFi 及 Lwip 協(xié)議?!?,講解如何使用 ESP-IDF 構(gòu)建
    發(fā)表于 01-13 14:37 ?48次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP-IDF</b> 教學(xué)WiFi篇(一)—— WiFi兩種模式

    ESP32ESP-IDF 教學(xué)(十)—— 電機(jī)控制器(MCPWM)

    本文章 來(lái)自原創(chuàng)專欄《ESP32教學(xué)專欄 (基于ESP-IDF)》,講解如何使用 ESP-IDF 構(gòu)建 ESP32 程序,發(fā)布文章并會(huì)持續(xù)為已發(fā)布文章添加新內(nèi)容! 每篇文章都經(jīng)過(guò)了精打
    發(fā)表于 01-14 12:23 ?31次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP-IDF</b> 教學(xué)(十)—— 電機(jī)控制器(MCPWM)

    基于ESP32的簡(jiǎn)易web服務(wù)器設(shè)計(jì)

    本文介紹一下如何使用ESP32快速方便的搭建一個(gè)簡(jiǎn)易的web服務(wù)器。
    的頭像 發(fā)表于 01-05 10:49 ?4091次閱讀

    [esp32教程]2、按鍵中斷

    基于Ubuntu,利用esp-idf進(jìn)行esp32的教學(xué)
    的頭像 發(fā)表于 05-05 09:04 ?7511次閱讀
    [<b class='flag-5'>esp32</b>教程]2、按鍵中斷

    [esp32教程]3、利用idf.py創(chuàng)建組件

    [esp32教程]3、利用idf.py創(chuàng)建組件
    的頭像 發(fā)表于 05-05 09:05 ?2428次閱讀

    啟明去端分享| ESP32-S3如何實(shí)現(xiàn)tcp_client和tcp_server

    開發(fā)環(huán)境:esp-idf:master分支官方idf環(huán)境搭建文檔:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32
    的頭像 發(fā)表于 09-07 18:53 ?5549次閱讀
    啟明去端分享| <b class='flag-5'>ESP32</b>-S3如何實(shí)現(xiàn)tcp_client和tcp_<b class='flag-5'>server</b>

    啟明云端分享|ESP32-S3如何實(shí)現(xiàn)tcp_client和tcp_server

    開發(fā)環(huán)境:esp-idf:master分支硬件需求Esp32-s3開發(fā)板TCP介紹:傳輸控制協(xié)議(TCP,TransmissionControlProtocol)是一種面向連接的、可靠的、基于字節(jié)
    的頭像 發(fā)表于 09-24 17:50 ?4348次閱讀
    啟明云端分享|<b class='flag-5'>ESP32</b>-S3如何實(shí)現(xiàn)tcp_client和tcp_<b class='flag-5'>server</b>
    主站蜘蛛池模板: 久色国产 | 国产主播在线播放 | 狠狠色噜噜噜噜狠狠狠狠狠狠奇米 | 在线看你懂得 | 特级生活片 | 日本大黄在线观看 | 欧美爽爽网| 看片久久| 五月天丁香婷婷开心激情五月 | 国产人人澡 | 91精品啪国产在线观看免费牛牛 | 人人人人凹人人爽人人澡 | 亚洲黄色影片 | 免费看日本大片免费 | 色99色| 日日干夜夜欢 | 五月情网 | 欧美色惰 | 国产亚洲精品线观看77 | 国产美女精品视频免费观看 | 2017av在线 | 国产精品色片 | 日韩啪啪片 | h视频在线观看免费网站 | 亚洲成人伊人网 | 日本理论在线观看被窝网 | 日韩三级毛片 | 啪啪黄色片 | 亚洲第一网站快活影院 | 天天曰夜夜曰 | 欧美高清一级片 | 人人艹人人插 | 男人操女人视频在线观看 | 亚洲性视频网站 | 中文字幕久久精品波多野结 | 国产五月| 免费色片网站 | 欧美性视频一区二区三区 | 国产成人精品视频一区二区不卡 | 亚洲 欧美 另类 综合 日韩 | 免费一级毛片无毒不卡 |