色拍自拍亚洲综合图区-色婷婷av一区二区三区之e本道-中文国产成人精品久久app-亚洲乱码国产乱码精华-马与人黄色毛片一部免费视频-欧美黄网在线观看-午夜尤物-婷婷久久精品-成人免费看片98-夜精品a片一区二区三区无码白浆

行業應用
行業應用
基于樹莓派RP2040游戲機的簡易網絡氣象站
2022-09-06 168

一、設計目標

1.RP2040 Game Kit板通過提供的ESP32-S2的WiFi模塊連接網絡。

2.在RP2040 Game Kit上顯示某一個城市的氣象信息 - 時間、天氣實況、生活指數、天氣預報...

3.通過RP2040 Game Kit上的按鍵和四向搖桿配合能夠切換顯示不同城市的信息 ,做到能切換顯示、刷新數據、修改城市名。

4. 通過顯示屏與搖桿按鍵交互來模擬一個九鍵鍵盤,實現城市名的自主輸入,輸入錯誤也會有錯誤提示。

5. 搭配上圖片來豐富顯示內容,包括天氣氣象符號、各生活指數示意圖等。

二、準備工作

1?硬件連接

Rp2040游戲機與esp32-s2模塊的連線如下圖所示。

    pico                        esp32s2
    tx = Pin(16)   -->    RXD_PIN (GPIO_NUM_21)
    rx = Pin(17)   -->    RXD_PIN (GPIO_NUM_21)
    3V3               -->    3V3
    GND             -->    GND

2. 開發環境

(1)thonny。安裝過程具體可參考 https://class.eetree.cn/live_pc/l_60fe7f4fe4b0a27d0e360f74

(2)  Vscode的插件Espressif IDF v1.3.0。

3. 參考例程

(1)ESP32 IDF v4.3.1:樂鑫ESP開發環境,本項目參考了其中的http request,uart,wifi station 例程。具體可參考官方文檔ESP-IDF 編程指南。

(2)硬禾學堂2022寒假在家練:基于樹莓派RP2040的嵌入式系統學習平臺,相關內容可參考https://www.eetree.cn/project/detail/698

4.源代碼目錄結構

(1)Rp2040

-/
   -weather_main.py 主函數
   -draw.py 畫圖部分
   -http_deal.py http數據處理部分
   -location.py 鍵盤鍵位內容
   -button.py 按鍵
   -board.py 引腳定義
   -vga2_8x8.py字體小
   -vga1_16x32.py字體大
   -vga1_8x16.py 字體中
   -weather_picture_small/ 天氣現象圖片(?。?br style="box-sizing: border-box;"/>   -weather_picture_big/ 天氣現象圖片(大)
   -index of living/ 生活指數插圖

(2)ESP32-S2

    - http_request/
             - CMakeLists.txt
             - sdkconfig
             - main/       - CMakeLists.txt
                                - http_main.c   esp32主函數,http請求,json解析
                                - http.h        
                                - uart.c        串口通信部分
                                - uart.h
                                - wifi.c        wifi連接部分
                                - wifi.h

5.使用說明

(1)先將wifi_name和wifi_passwd分別修改成要連接的熱點的名字和密碼。
(2)分別編譯下載程序到pico和esp32s2(esp32s2可用vscode),具體可參照上面的源代碼目錄結構。
(3)使用杜邦線進行硬件連接,具體連線請參照上面的硬件連接。
(4)上電開機。

6.注意事項

(1)部分wifi可能不能被esp32識別。

(2)使用過程中請保持網絡順暢,若失去網絡連接或產生一些其它錯誤,可以試著先按下esp32的reset鍵重啟,再運行RP2040的主程序。

(3)由于使用心知天氣平臺的免費版,暫時只支持國內部分城市。

三、軟件流程圖

image.png

 

 

四、實現過程

1?網絡連接

(1)WiFi連接

wifi名和密碼需提前設定,具體在RP2040的weather_main.py中修改,如下。

# 在此處修改你要連接的wifi名和密碼wifi_name = "123"wifi_passwd = "12345678"

 

發送wifi信息給esp32前需進行簡單編碼以供esp32識別,具體請參考下面的多機通信部分。

在esp32接收到信息后立即調用wifi_init_sta()函數進行wifi連接,這里是在esp32idf的例程 ~Espressifframeworksesp-idf-v4.4.1exampleswifigetting_startedstation   的基礎上修改的,具體如下。

/**********wifi初始化函數**************/void wifi_init_sta( char *wifi_ssid , char *wifi_password){
    s_wifi_event_group = xEventGroupCreate();

    // ESP_ERROR_CHECK(esp_netif_init());

    // ESP_ERROR_CHECK(esp_event_loop_create_default());
    esp_netif_create_default_wifi_sta();

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    esp_event_handler_instance_t instance_any_id;
    esp_event_handler_instance_t instance_got_ip;
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &event_handler,
                                                        NULL,
                                                        &instance_any_id));
    ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                        IP_EVENT_STA_GOT_IP,
                                                        &event_handler,
                                                        NULL,
                                                        &instance_got_ip));

    wifi_config_t wifi_config = {
        .sta = {
            // .ssid = wifi_ssid ,
            // .password = wifi_password ,
            /* Setting a password implies station will connect to all security modes including WEP/WPA.
             * However these modes are deprecated and not advisable to be used. Incase your Access point
             * doesn't support WPA2, these mode can be enabled by commenting below line */
	     .threshold.authmode = WIFI_AUTH_WPA2_PSK,
        },
    };


    memcpy(wifi_config.sta.ssid, wifi_ssid, sizeof(wifi_config.sta.ssid));
    memcpy(wifi_config.sta.password, wifi_password, sizeof(wifi_config.sta.password));


    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
    ESP_ERROR_CHECK(esp_wifi_start() );

    ESP_LOGI(TAG, "wifi_init_sta finished.");

    /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
     * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
    EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
            WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
            pdFALSE,
            pdFALSE,
            portMAX_DELAY);

    /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
     * happened. */
    if (bits & WIFI_CONNECTED_BIT) {       
        ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
                 wifi_ssid, wifi_password);
                  http_get_task();  //連接成功,發送http請求
        // sendData(TAG,"connectsucess");
    } else if (bits & WIFI_FAIL_BIT) {
        ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
                 wifi_ssid, wifi_password);
        sendData(TAG,"Connectfail");  //連接失敗,發送狀態告知pico
        
    } else {
        ESP_LOGE(TAG, "UNEXPECTED EVENT");
        sendData(TAG,"Connectfail"); //連接失敗,發送狀態告知pico
    }

    /* The event will not be processed after unregister */
    ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
    ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
    vEventGroupdelete(s_wifi_event_group);}

wifi連接成功后就立即發送http請求,失敗則返回狀態給RP2040。

(2)http請求

這里參考了esp32idf的例程~Espressifframeworksesp-idf-v4.4.1examplesprotocolshttp_request,將其中的循環任務改成了單次調動并根據不同的請求內容增加了參數判斷,就能根據需要進行http請求,并在發生錯誤時發送狀態給RP2040,具體內容在http_main.c中,如下。

//HTTP請求函數void http_get(char arg){
    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];
    char mid_buf[1400];   //接受http報文正文部分

    memset(mid_buf,0,sizeof(mid_buf));
    char WEB_PATH[200] = "GET " ;  
    
    // 組合字段構成http請求的發送內容,根據不同的請求進行不同的組合
    switch (arg){
       //實時天氣,例:http://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=beijing&language=en&unit=c
       case WEATHER_CURRENT: 
        strcat(WEB_PATH,WEB_PATH_CURRENT_1);
        strcat(WEB_PATH,reqLocation);
        strcat(WEB_PATH,WEB_PATH_CURRENT_2);
        strcat(WEB_PATH,REQUEST_ED);
        break;
        //生活指數,例:http://api.seniverse.com/v3/life/suggestion.json?key=SzOM2PDJp7crLA0Ug&location=haikou&language=en
        case WEATHER_LIFE:         
        strcat(WEB_PATH,WEB_PATH_LIFE_1);
        strcat(WEB_PATH,reqLocation);
        strcat(WEB_PATH,WEB_PATH_LIFE_2);
        strcat(WEB_PATH,REQUEST_ED);
        break;
        //天氣預報,例:http://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&days=5
        case WEATHER_FORECAST:  
        strcat(WEB_PATH,WEB_PATH_FORECAST_1);
        strcat(WEB_PATH,reqLocation);
        strcat(WEB_PATH,WEB_PATH_FORECAST_2);
        strcat(WEB_PATH,REQUEST_ED);
        break;

        default:ESP_LOGI(TAG, "wrong");

    }
 
        
    int err = getaddrinfo(WEB_SERVER, WEB_PORT, &hints, &res);

    if(err != 0 || res == NULL) {
        ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        sendData(TAG,"httprequestfail");     //http初始化失敗,告知pico
        
    }else {
        /* 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_PERIOD_MS);
            sendData(TAG,"httprequestfail"); //http初始化失敗,告知pico
        }else{
            ESP_LOGI(TAG, "... allocated socket");

            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_PERIOD_MS);
                sendData(TAG,"httprequestfail"); //http初始化失敗,告知pico
            }else{
                ESP_LOGI(TAG, "... connected");
                freeaddrinfo(res);

                if (write(s, WEB_PATH, strlen(WEB_PATH)) < 0) {
                    ESP_LOGE(TAG, "... socket send failed");
                    close(s);
                    vTaskDelay(4000 / portTICK_PERIOD_MS);
                    sendData(TAG,"httprequestfail"); //http初始化失敗,告知pico
                }else{
                    ESP_LOGI(TAG, "... socket send success");

                    struct timeval receiving_timeout;
                    receiving_timeout.tv_sec = 5;
                    receiving_timeout.tv_usec = 0;
                    if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &receiving_timeout,
                        sizeof(receiving_timeout)) < 0) {
                        ESP_LOGE(TAG, "... failed to set socket receiving timeout");
                        close(s);
                        vTaskDelay(4000 / portTICK_PERIOD_MS);
                        sendData(TAG,"httprequestfail"); //http初始化失敗,告知pico
                    }else{
                        ESP_LOGI(TAG, "... set socket receiving timeout success");

                       
                        /* Read HTTP response */
                        do {
                            bzero(recv_buf, sizeof(recv_buf));
                            r = read(s, recv_buf, sizeof(recv_buf)-1);
                            strcat(mid_buf,recv_buf);
                            for(int i = 0; i < r; i++) {
                                putchar(recv_buf[i]);
                            }
                        } while(r > 0);
                        // ESP_LOGI(TAG,"return=%s",mid_buf);
                        //json格式轉化 
                        cjson_to_struct_info(mid_buf,arg);


                        ESP_LOGI(TAG, "... done reading from socket. Last read return=%d errno=%d.", r, errno);
                        close(s);
                        
                    }
                }
            }

        }
        
    }    }

由于要請求的內容有三項(天氣實況、生活指數、天氣預報),分別對應三個不同的請求行:

void http_get_task(void){
    memset(send_data_quene,0,sizeof(send_data_quene));
    http_get(WEATHER_CURRENT); //天氣實況
    vTaskDelay(1000 / portTICK_PERIOD_MS);  //適當延時
    http_get(WEATHER_FORECAST); //天氣預報
    vTaskDelay(1000 / portTICK_PERIOD_MS);
    http_get(WEATHER_LIFE);     //生活指數
    vTaskDelay(1000 / portTICK_PERIOD_MS);
    ESP_LOGI(TAG,"send_data:%s",send_data_quene);
    sendData(TAG,send_data_quene);//整合發送}
實時天氣,例:http://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=beijing&language=en&unit=c
生活指數,例:http://api.seniverse.com/v3/life/suggestion.json?key=SzOM2PDJp7crLA0Ug&location=haikou&language=en
天氣預報,例:http://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&days=5
所以在函數在加入判斷到底發送哪一個,相應的請求行要進行不同組合,在http_get()函數中做判斷,具體內容在http.h中,如下。
#define WEB_SERVER "api.seniverse.com"#define WEB_PORT "80"#define reqUserKey "SzOM2PDJp7crLA0Ug"// #define reqLocation "Shenzhen"#define reqUnit "c"//天氣實況#define WEATHER_CURRENT 'C' #define WEB_PATH_CURRENT_1 "/v3/weather/now.json?key=" reqUserKey "&location="  #define WEB_PATH_CURRENT_2 "&language=en&unit=" reqUnit//生活指數#define WEATHER_LIFE 'L'#define WEB_PATH_LIFE_1 "/v3/life/suggestion.json?key=" reqUserKey "&location="  #define WEB_PATH_LIFE_2 "&language=en"//天氣預報#define WEATHER_FORECAST 'F'#define WEB_PATH_FORECAST_1 "/v3/weather/daily.json?key=" reqUserKey "&location="  #define WEB_PATH_FORECAST_2 "&language=en&unit=" reqUnit "&start=0&days=5"//http請求尾static const char *REQUEST_ED = " HTTP/1.0
"
        "Host: "WEB_SERVER":"WEB_PORT"
"
        "User-Agent: esp-idf/1.0 esp32
"
        "
";//城市名char *reqLocation ;

由于請求的城市名是會變化的,所以利用C語言strcat函數進行組合,組合好后就可以發送完整的請求行了。

而接收到的數據都是json格式,這里調用了cjson庫來進行解碼,針對不同的http報文有不同的處理方式,具體在http_main.c中,如下。

/***********json格式解析************/void cjson_to_struct_info(char *text,char arg){

    cJSON *root,*psub;
    cJSON *arrayItem;
    //截取有效json
    char *index=strchr(text,'{');
    strcpy(text,index);
 
    root = cJSON_Parse(text);
    
    if(root!=NULL)
    {
        /*******************天氣實況**********/
        if(arg == WEATHER_CURRENT){
            psub = cJSON_GetObjectItem(root, "results");
            arrayItem = cJSON_GetArrayItem(psub,0);
    
            cJSON *locat = cJSON_GetObjectItem(arrayItem, "location");
            cJSON *now = cJSON_GetObjectItem(arrayItem, "now");
            if((locat!=NULL)&&(now!=NULL))
            {
                psub=cJSON_GetObjectItem(locat,"name");
                sprintf(weathe.cit,"%s",psub->valuestring);
                ESP_LOGI(TAG,"city:%s",weathe.cit);
                strcat(send_data_quene,weathe.cit);  //拼接發送字符串
                strcat(send_data_quene,"+");         //分割符,讓pico識別
    
                psub=cJSON_GetObjectItem(now,"text");
                sprintf(weathe.weather_text,"%s",psub->valuestring);
                ESP_LOGI(TAG,"weather:%s",weathe.weather_text);
                strcat(send_data_quene,weathe.weather_text);
                strcat(send_data_quene,"+");
                
                psub=cJSON_GetObjectItem(now,"code");
                sprintf(weathe.weather_code,"%s",psub->valuestring);
                ESP_LOGI(TAG,"%s",weathe.weather_code);
                strcat(send_data_quene,weathe.weather_code);
                strcat(send_data_quene,"+");
    
                psub=cJSON_GetObjectItem(now,"temperature");
                sprintf(weathe.temperatur,"%s",psub->valuestring);
                ESP_LOGI(TAG,"temperatur:%s",weathe.temperatur);
                strcat(send_data_quene,weathe.temperatur);
                strcat(send_data_quene,"+");                
         
            }else{
                sendData(TAG,"httprequestfail"); //json格式有誤。http請求失敗
            }
        
        }

        /*****************天氣預報*************************/
        if(arg == WEATHER_FORECAST){
            psub = cJSON_GetObjectItem(root, "results");
            arrayItem = cJSON_GetArrayItem(psub,0);
            
            cJSON *locat = cJSON_GetObjectItem(arrayItem, "location");
            cJSON *daily = cJSON_GetObjectItem(arrayItem, "daily");
            if((locat!=NULL)&&(daily!=NULL))
            {
     
                for(int i = 0;i<3;i++){
                    arrayItem = cJSON_GetArrayItem(daily,i);
                    psub = cJSON_GetObjectItem(arrayItem, "date");
                    sprintf(weathe.daily_weathe[i].date,"%s",psub->valuestring);
                    ESP_LOGI(TAG,"date:%s",weathe.daily_weathe[i].date);
                    strcat(send_data_quene,weathe.daily_weathe[i].date);
                    strcat(send_data_quene,"+");

                    psub = cJSON_GetObjectItem(arrayItem, "text_day");
                    sprintf(weathe.daily_weathe[i].text_day,"%s",psub->valuestring);
                    ESP_LOGI(TAG,"text_day:%s",weathe.daily_weathe[i].text_day);
                    strcat(send_data_quene,weathe.daily_weathe[i].text_day);
                    strcat(send_data_quene,"+");

                    psub = cJSON_GetObjectItem(arrayItem, "code_day");
                    sprintf(weathe.daily_weathe[i].code_day,"%s",psub->valuestring);
                    ESP_LOGI(TAG,"code_day:%s",weathe.daily_weathe[i].code_day);
                    strcat(send_data_quene,weathe.daily_weathe[i].code_day);
                    strcat(send_data_quene,"+");

                    psub = cJSON_GetObjectItem(arrayItem, "text_night");
                    sprintf(weathe.daily_weathe[i].text_night,"%s",psub->valuestring);
                    ESP_LOGI(TAG,"text_night:%s",weathe.daily_weathe[i].text_night);
                    strcat(send_data_quene,weathe.daily_weathe[i].text_night);
                    strcat(send_data_quene,"+");

                    psub = cJSON_GetObjectItem(arrayItem, "code_night");
                    sprintf(weathe.daily_weathe[i].code_night,"%s",psub->valuestring);
                    ESP_LOGI(TAG,"code_night:%s",weathe.daily_weathe[i].code_night);
                    strcat(send_data_quene,weathe.daily_weathe[i].code_night);
                    strcat(send_data_quene,"+");

                    psub = cJSON_GetObjectItem(arrayItem, "high");
                    sprintf(weathe.daily_weathe[i].high,"%s",psub->valuestring);
                    ESP_LOGI(TAG,"high:%s",weathe.daily_weathe[i].high);
                    strcat(send_data_quene,weathe.daily_weathe[i].high);
                    strcat(send_data_quene,"+");

                    psub = cJSON_GetObjectItem(arrayItem, "low");
                    sprintf(weathe.daily_weathe[i].low,"%s",psub->valuestring);
                    ESP_LOGI(TAG,"low:%s",weathe.daily_weathe[i].low);
                    strcat(send_data_quene,weathe.daily_weathe[i].low);
                    strcat(send_data_quene,"+");

                    psub = cJSON_GetObjectItem(arrayItem, "precip");
                    sprintf(weathe.daily_weathe[i].precip,"%s",psub->valuestring);
                    ESP_LOGI(TAG,"precip:%s",weathe.daily_weathe[i].precip);
                    strcat(send_data_quene,weathe.daily_weathe[i].precip);
                    strcat(send_data_quene,"+");

                    psub = cJSON_GetObjectItem(arrayItem, "humidity");
                    sprintf(weathe.daily_weathe[i].humidity,"%s",psub->valuestring);
                    ESP_LOGI(TAG,"humidity:%s",weathe.daily_weathe[i].humidity);
                    strcat(send_data_quene,weathe.daily_weathe[i].humidity);
                    strcat(send_data_quene,"+");
                }
 
            }
            else{
                sendData(TAG,"httprequestfail");  //json格式有誤。http請求失敗
            }

        }
        
         /**************************生活指數****************************************/
        if(arg == WEATHER_LIFE){
            psub = cJSON_GetObjectItem(root, "results");
            arrayItem = cJSON_GetArrayItem(psub,0);
    
            cJSON *locat = cJSON_GetObjectItem(arrayItem, "location");
            cJSON *suggestion = cJSON_GetObjectItem(arrayItem, "suggestion");
            if((locat!=NULL)&&(suggestion!=NULL))
            {

                cJSON *car_washing=cJSON_GetObjectItem(suggestion,"car_washing");
                psub=cJSON_GetObjectItem(car_washing,"brief");
                sprintf(weathe.car_washing,"%s",psub->valuestring);
                ESP_LOGI(TAG,"car_washing:%s",weathe.car_washing);
                strcat(send_data_quene,weathe.car_washing);
                strcat(send_data_quene,"+");
                
    
                cJSON *dressing=cJSON_GetObjectItem(suggestion,"dressing");
                psub=cJSON_GetObjectItem(dressing,"brief");
                sprintf(weathe.dressing,"%s",psub->valuestring);
                ESP_LOGI(TAG,"dressing:%s",weathe.dressing);
                strcat(send_data_quene,weathe.dressing);
                strcat(send_data_quene,"+");

                cJSON *flu=cJSON_GetObjectItem(suggestion,"flu");
                psub=cJSON_GetObjectItem(flu,"brief");
                sprintf(weathe.flu,"%s",psub->valuestring);
                ESP_LOGI(TAG,"flu:%s",weathe.flu);
                strcat(send_data_quene,weathe.flu);
                strcat(send_data_quene,"+");

                cJSON *sport=cJSON_GetObjectItem(suggestion,"sport");
                psub=cJSON_GetObjectItem(sport,"brief");
                sprintf(weathe.sport,"%s",psub->valuestring);
                ESP_LOGI(TAG,"sport:%s",weathe.sport);
                strcat(send_data_quene,weathe.sport);
                strcat(send_data_quene,"+");

                cJSON *travel=cJSON_GetObjectItem(suggestion,"travel");
                psub=cJSON_GetObjectItem(travel,"brief");
                if (psub->valuestring[0] == '

主站蜘蛛池模板:
精品少妇无码av在线播放
|
色五月丁香五月综合五月
|
性色av无码久久一区二区三区
|
中文字幕日韩精品欧美一区
|
无码性午夜视频在线观看
|
小柔的淫辱日记(1~7)
|
日本中文字幕视频在线
|
精品一卡二卡三卡
|
国产精品丝袜高跟鞋
|
国产亚洲精品久久久闺蜜
|
催眠淫辱の教室3在线观看
国产在线播放精品视频
|
资源av|
人人爽人妻精品a片二区
|
国产一在线观看
|
永久福利视频
|
麻豆网页
|
久久婷婷综合缴情亚洲狠狠
|
人人妻人人澡人人爽精品日本
|
狠狠色噜噜狠狠狠777米奇小说
|
91超碰在
|
97国产揄拍国产精品人妻
|
成人在线观看黄色
|
日日射av
|
理论片高清免费理论片毛毛片
|
欧美精品a∨在线观看
|
久久久午夜精品理论片中文字幕
|
免费人成又黄又爽的视频
|
yjizz国产|
欧美日韩一区二区三区四区五区
|
韩国女同性做爰三级
|
国产精品无码免费专区午夜
|
嘿咻嘿咻男女免费专区
|
中国熟妇人妻xxxxx
|
av观看国产
|
欧美日韩一二三区
|
色久影院
|
亚洲欧美一区二区三区国产精品
|
天天干天天上
|
日本边添边摸边做边爱
|
国产欧美一区二区白浆黑人
|
在线免费看黄色片
|
国产在线观看无码不卡
|
又粗又猛又爽黄老大爷视频
|
亚洲在线精品视频
|
一边吃奶一边添p好爽故事
人人草人人干
|
亚洲精品色
|
日日猛噜噜狠狠扒开双腿小说
|
久久av综合网
|
青青草国产精品一区二区
|
国产成人片无码免费视频软件
|
最新av片|
成人在线观看免费网站
|
最新在线精品国自产拍福利
|
日韩av中文字幕在线
|
亚洲欧洲av综合色无码
|
近亲伦l中文字幕
|
欧美高清性色生活片免费观看
|
青青青草网站免费视频在线观看
|
欧美亚洲日本国产综合在线
|
性猛交富婆╳xxx乱大交麻豆
|
女同av网站
|
亚洲午夜未满十八勿入
|
国产98色在线
|
三极片黄色|
亚洲永久精品国产
|
全村肉体暴力强伦轩np小说
|
国产精品女同一区二区
|
亚洲日韩乱码中文字幕
|
久久人人爽人人爽久久小说
|
无翼乌工口全彩肉肉无遮挡18
|
十二月综合缴缴情小说
|
亚洲视频色图
|
国产69精品久久久久9999不卡免费
|
亚洲欧美一级
|
久久无码中文字幕免费影院蜜桃
|
亚洲色av天天天天天天
|
国产人妻人伦精品久久久
|
日韩精品无码一区二区三区不卡
|
国产偷摄中国推油按摩富婆
|
亚洲另类欧美综合久久
|
黄色片免费在线
|
国产一级黄色片子
|
91精品国产日韩91久久久久久
|
免费欧美一级
|
五月婷婷之综合缴情
|
中文字幕一线产区和二线
|
美丽姑娘国语版在线播放
|
日韩精品亚洲一区在线综合
|
美女无遮挡免费视频网站
|
97人人超碰国产精品最新o
|
国产黄色片免费观看
|
91精品国产综合久久精品性色
|
日韩成人一区
|
欧美人与牲禽动a交精品
|
精品欧美一区二区三区
|
日韩国产精品无码一区二区三区
|
日日干日日草
|
久久精品午夜福利
|
亚洲中文波霸中文字幕
|
性福宝av
|
美女日日日
|
久久综合精品无码av一区二区三区
|
国产日韩在线一区
|
中文字幕无线码中文字幕免费
|
欧美激情免费在线
|
欧洲金发美女大战黑人
|
国产精品99久久久久久董美香
|
成人高清免费
|
久久99热只有频精品6国语
|
亚洲欧美不卡
|
色99在线|
欧美在线免费
|
av中文字幕免费在线观看
|
免费在线播放黄色片
|
久夜精品|
爱丝aiss无内高清丝袜视频
|
少妇被粗大的猛烈进出96影院
|
超碰在线观看免费版
|
爱逼综合网|
韩国三级hd中文字幕叫床
|
精品国产一区二区三区香蕉
|
天堂网在线最新版www资源网
|
日韩高清在线播放
|
亚洲精品成人无码中文毛片
|
午夜精品成人一区二区视频
|
成人免费的视频
|
亚洲国产精品成人综合色在线婷婷
|
日本妇人成熟免费视频
|
失禁大喷潮在线播放
|
久久九九综合
|
成人av中文解说水果派
|
澳门永久av免费网站
|
午夜片无码区在线观看视频
|
国产精品99久久久久久白浆小说
|
韩国三级国产
|
直接在线观看的三级网址
|
美女自卫慰免费视频www免费
|
无码免费毛片手机在线无卡顿
|
国产精品一区二区在线看
|
97在线观看永久免费视频
|
欧美一级片在线播放
|
日韩av高清无码
|
亚洲欧美另类综合偷拍
|
国产激情久久久久影院老熟女免费
|
在线观看日本亚洲一区
|
亚洲高清视频一区二区三区
|
高潮毛片无遮挡高清免费
|
亚洲一区二区三区在线观看视频
|
狠狠色丁香久久综合
|
久久爽久久爽久久av东京爽
|
亚洲国产欧美在线成人app
|
91高跟黑色丝袜呻吟在线观看
|
好了av四色综合无码久久
|
男人天堂视频在线
|
久久亚洲色www成人男男
|
国产欧美日韩在线中文一区
|
777精品
|
a级国产视频
|
亚洲中文字幕在线第二页
|
91久久一区二区
|
97视频在线|
日本在线视频www鲁啊鲁
|
国产剧情一区在线
|
抽插丰满内射高潮视频
|
欧美日产国产新一区
|
国产午夜无码精品免费看
|
亚洲毛片无码专区亚洲乱
|
国产精品欧美一区二区三区奶水
|
久久影音
|
边啃奶头边躁狠狠躁
|
亚洲精品无码国产
|
亚洲乱码国产一区三区
|
国产又粗又猛又爽又黄无遮挡
|
日韩在线成年视频人网站观看
|
19禁无遮挡啪啪无码网站性色
|
熟妇人妻系列av无码一区二区
|
亚洲国产区男人本色
|
羞羞视频网站
|
av高潮|
亚洲图片欧美色图
|
国产热の有码热の无码视频
|
日本一区二区免费在线
|
特黄大片aaaaa毛片
|
久久伊人精品影院一本到综合
|
52avavjizz亚洲精品
|
欧美成人高清视频a在线看
欧美成人a视频
|
超色视频
|
av黄色一区|
中文字幕在线观看亚洲视频
|
精品视频在线一区
|
性色在线视频
|
天堂av免费看|
噜噜噜在线观看免费视频日本
|
伊人艹
|
日本一区二区三区在线观看
|
久久不见久久见免费视频6无删减
|
欧美日韩操
|
996久久国产精品线观看
|
2022av在线|
狠狠噜天天噜日日噜
|
高清国产亚洲欧洲av综合一区
|
影视先锋男人无码在线
|
午夜精品久久久久久不卡
|
亚洲综合日韩久久成人av
|
成人做爰69片免费看网站野花
|
国产又黄视频
|
超碰色偷偷男人的天堂
|
亚洲国产一区二区a毛片日本
|
6080yyy午夜理论片中无码
|
97夜夜澡人人爽人人喊a
|
色婷婷综合久久久中文一区二区
|
亚洲免费最大黄页网站
|
久久国产精品首页
|
91人人爱
|
国产欧美另类久久久精品图片
|
天天做天天爱天天综合色
|
激情影院内射美女
|
久久久激情
|
亚洲网站在线
|
国产美女嘘嘘嘘嘘嘘
|
www天天色
|
又黄又湿啪啪响18禁
|
777米奇色狠狠888俺也去乱
|
黄网址在线观看
|
免费午夜无码片在线观看影院
|
亚洲精品一线二线
|
久久wwww
|
日本午夜免a费看大片中文4
|
日韩av在线一区二区三区
|
婷婷综合少妇啪啪喷水动态小说
|
a级大片在线观看
|
亚洲精品成人片在线观看精品字幕
|
亚洲精品456在线播放
|
亚洲欧美人高清精品a∨
|
日韩美女毛片
|
国产五月
|
国产自偷自拍视频
|
亚洲女人色综合小说
|
青青草一区二区三区
|
国产精品美女久久久久图片
|
久久91视频
|
亚洲色图校园春色
|
中文字幕久久波多野结衣av不卡
|
性开放的女人aaa片
国产口语对白老妇
|
欧美真人性做爰全过程
|
黑人干亚洲
|
a√毛片
|
免费看欧美中韩毛片影院
|
日本熟妇色熟妇在线视频播放
|
国产精品日本欧美一区二区三区
|
国产麻豆精品精东影业av网站
|
丰满人妻翻云覆雨呻吟视频
|
欧美成人资源
|
一级片特黄
|
邻居少妇张开双腿让我爽一夜
|
黄色片18
|
四川丰满妇女毛片四川话
|
亚洲我射|
久热这里只有精品99在线观看
|
欧美国产日韩a欧美在线观看
|
亚洲欧洲自拍偷拍
|
香蕉国产在线视频
|
91九色蝌蚪porny|
无码办公室丝袜ol中文字幕
|
十八禁视频在线观看免费无码无遮挡骂过
|
久久婷婷五月综合鬼色
|
中出乱码av亚洲精品久久天堂
|
九九99亚洲精品久久久久
|
午夜福利合集1000在线
|
久久精品国产亚洲a片高清不卡
|
免费黄色小视频网站
|
5g影院天天爽入口入口
|
美女福利视频一区
|
成人网站av亚洲国产
|
亚洲成人在线网站
|
aa在线
|
女神思瑞女神久久一区二区
|
国内精品久久久久影院日本
|
香蕉伊蕉伊中文视频在线
|
久久精品国产最新地址
|
嫩模周妍希视频一区二区
|
亚洲自偷自偷在线成人网站传媒
|
中文在线a∨在线
|
九色91|
国产成人精选视频在线观看
|
日韩欧美亚洲综合久久影院ds
|
国产精品推荐手机在线
|
精品无码国产一区二区三区51安
|
99热久久这里只精品国产www
|
国产一区久久久
|
午夜精品视频在线观看
|
国产玉足脚交欧美一区二区
|
国产午夜福利院757视频
|
欧美亚洲综合在线一区
|
久久不卡区
|
亚洲精品一卡二卡
|
少妇翘臀亚洲精品av图片
|
国产精品国产三级国产av′
|
国产对白老熟女正在播放
|
摸少妇的奶她呻吟不断爽视频
|
国产亚洲精品久久久久四川人
|
少妇午夜三级伦理影院播放器
|
无码国模大尺度视频在线观看
|
911精品国产一区二区在线
|
日批视频免费观看
|
免费的av片
|
日产精品久久久久久久性色
|
www毛片|
黄色国产小视频
|
伊人干网综合亚洲
|
欧美精品日韩在线观看
|
国产蝌蚪视频一区二区三区
|
亚洲一区av无码少妇电影玲奈
|
亚洲精品av少妇一区二区
|
又爽又黄又无遮挡的激情视频免费
|
欧美性受xxxxx
|
久久天天躁夜夜躁狠狠 ds005.com
|
男人的天堂亚洲
|
国产揉捏爆乳巨胸挤奶视频
|
91九色网址|
色婷婷激情一区二区三区
|
国产无遮挡无码视频免费软件
|
免费a级毛片大学生免费观看
|
粉嫩大学生无套内射无码卡视频
|
精品国产乱码久久久久久1区二区
|
精品av天堂毛片久久久借种
|
一本清日本在线视频精品
|
国产精品国产三级国产aⅴ原创
|
国产专区一区二区
|
狠狠干狠狠爱
|
国产精品熟女人妻
|
亚洲欧洲精品成人久久奇米网
|
午夜专区
|
国产91富婆露脸刺激对白
|
色香av|
丰满人妻被公侵犯中文版
|
中国农村少妇xxxx视频
|
国产仑乱无码内谢
|
尤物视频激情在线视频观看网站
|
我想看一级黄色毛片
|
激情网站在线
|
亚州中文字幕午夜福利电影
|
免费日韩欧美
|
99产精品成人啪免费网站
|
99久久久无码国产精品
|
中文字幕日韩精品亚洲七区
|
少妇午夜三级伦理影院播放器
|
少妇在军营h文高辣
|
欧美做受xxxxxⅹ性视频
|
性生交片免费无码看人
|
成人日批视频
|
国产乱大交
|
国产亚洲一卡2卡3卡4卡网站
|
成人精品国产
|
岛国av在线免费观看
|
无人区码一码二码w358cc
|
wwwse天堂
|
中国三级视频
|
亚洲一卡2卡三卡4卡国色天香
|
亚洲自偷自偷在线制服
|
小嫩嫩流白浆
|
日韩av网址大全
|
丰满大爆乳波霸奶
|
亚洲中文字幕在线乱码
|
日本熟妇色一本在线视频
|
337p日本欧洲亚洲大胆艺术图
|
av中文字幕潮喷人妻系列
|
在线免费你懂的
|
欧美偷拍视频
|
北京少妇宾馆露脸对白
|
国产成人精品视频在线
|
天天夜夜久久
|
亚洲成人免费视频
|
国产白丝精品爽爽久久久久久蜜臀
|
亚洲人成人无码www影院
|
国产成年免费视频
|
av大尺度一区二区三区
|
人体内射精一区二区三区
|
国产在线精品一品二区
|
久草在线新时代视觉体验
|
精品国产自在精品国产
|
黄色片网站视频
|
精品日本免费一区二区三区
|
婷婷丁香社区
|
国产亚洲精品久久久久久禁果tv
|
精品国产性色无码av网站
|
激情第一区仑乱
|
最新2020无码中文字幕在线视频
|
偷国内自拍视频在线观看
|
精品国精品国产自在久国产不卡
|
亚洲大尺度无码无码专线
|
999久久久国产999久久久
|
欧美人与性动交g欧美精器
九九综合九色综合网站
|
伊人av中文av狼人av
|
xxxxx毛片
|
青青草自拍
|
少妇精品免费视频欧美
|
国产亚洲成av人片在线观看桃
|
欧美成人精品三级网站视频
|
日韩av高清无码
|
偷拍激情视频一区二区三区
|
91免费在线观看网站
|
97超碰国产精品无码分类
|
av国産精品毛片一区二区在线
|
国内自拍xxxx18
|
亚洲成a∨人片在无码2023
|
日韩人妻无码精品系列
|
99久久久无码国产精品
|
又色又爽又高潮免费观看
|
精品无码国产自产拍在线观看蜜
|
一本aⅴ高清一区二区三区
欧美黄页
|
av边做边流奶水无码免费
|
国内自拍xxx
|
色欲色香天天天综合网站免费
|
97国产精华最好的产品亚洲
|
人成免费a级毛片
|
国产理论高清一卡二卡三卡
|
网址av|
成年人网站免费观看
|
撕开奶罩揉吃奶高潮av在线观看
|
成人做爰66片免费看网站
|
欧美另类一区二区
|
亚洲欧美日韩愉拍自拍美利坚
|
久久久久久亚洲
|
91国视频
|
黄色精品在线
|
国产人成精品香港三级在线
|
欧美一卡二卡在线
|
婷婷五月深深久久精品
|
人人妻人人做人人爽夜欢视频
|
日本一区二区三区视频在线观看
|
日日摸天天爽天天爽视频
|
57pao国产成永久免费视频
|
亚洲激情三区
|
97夜夜澡人人爽人人喊a
|
中文字幕乱码人妻无码久久
|
插插操操|
青青草国产精品欧美成人
|
亚洲精品久久7777777国产
|
舌头伸进去添的我好爽高潮欧美
|
国产精品午夜福利在线观看地址
|
国产成人av乱码免费观看
|
精品9e精品视频在线观看
|
国产激情无码一区二区三区
|
欧美丰满熟妇bbbbbb
|
heyzo久久|
奴色虐av一区二区三区
|
国内揄拍国产精品人妻电影
|
成人午夜看黄在线尤物成人
|
久久精品小视频
|
天天爽夜夜爽夜夜爽精品视频
|
国产亚洲精品久久久久久久久久
|
一二级毛片|
成人香蕉视频
|
亚洲人成人网色www
天堂av成年av影视
|
亚洲欧美一区二区三区
|
国产91小视频
|
午夜色大片
|
亚洲一区 国产
|
久久99久国产精品66
|
www成人啪啪18软件
|
中文字幕亚洲色妞精品天堂
|
红桃视频成人
|
国产精品女人精品久久久天天
|
2018国产在线
|
黄色一级大片在线观看
|
伊人干网综合亚洲
|
色综合天天操
|
国产好吊看视频在线观看
|
久久午夜夜伦鲁鲁片免费无码
|
国产av偷闻女邻居内裤被发现
|
国产精品成久久久久三级6二k
|
色八区人妻在线视频
|
亚洲精品无码午夜福利理论片
|
国产成人午夜福利高清在线观看
|
中文字幕不卡一区
|
日韩免费无码人妻波多野
|
国产影视av|
欧美专区在线播放
|
欧美在线观看视频一区二区
|
午夜影院0606
|
日本三级香港三级三级人!妇久
|
欧美在线性爱视频
|
亚洲欧美一区久久牛牛
|
狠狠色丁香久久婷婷综合_中
|
日本在线免费看
|
国产偷国产偷亚洲高清人乐享
|
欧美午夜视频在线观看
|
男女做爰猛烈叫床爽爽免费网站
|
极品美女扒开粉嫩小泬
|
国产一卡2卡3卡4卡网站免费
|
色欲欲www成人网站
欧美成人吸奶水做爰
|
av在线手机观看
|
亚洲 丝袜 另类 校园 欧美
|
久久天堂综合亚洲伊人hd
|
黄色一区二区三区四区
|
麻豆视频一区二区
|
亚洲乱码国产乱码精品精不卡
|
国产麻豆乱子伦午夜视频观看
|
久久久久久久一区
|
91黑人巨炮vs亚裔美女
|
色婷婷国产精品高潮呻吟av久久
|
色悠久久久久久久综合网伊人
|
99久在线观看
|
国产免费一级片
|
第三级在线播放
|
国产一极内射視颍一
|
另类少妇人与禽zozz0性伦
|
毛片24种姿势无遮无拦
|
国产中文字幕第一页
|
中文字幕无码免费久久
|
亚洲综合色在线观看一区
|
日本又色又爽又黄的a片吻戏
|
日韩精品在线免费观看视频
|
日韩免费码中文在线观看
|
五月天丁香网
|
熟妇与小伙子matur老熟妇e
|
久久久久久中文
|
宅男66lu国产在线观看
|
日韩福利一区二区
|
免费日韩网站
|
日韩黄色大全
|
国产美女视频国产视视频
|
欧美情趣视频
|
青青青草网站免费视频在线观看
|
国产av一区二区三区最新精品
|
一级全黄少妇性色生活片毛片
|
亚洲欧美国产日产综合不卡
|
另类天堂av
|
欧美日韩大片在线观看
|
久久精品人人槡人妻人人玩av
|
婷婷开心深爱五月天播播
|
2021无码最新国产在线观看
|
美女一区二区三区
|
91麻豆精品一二三区在线
|
亚洲国产美女久久久久
|
成人在线激情网
|
一级特黄特色的免费大片视频
|
麻豆mv免费观看
|
国产免费91视频
|
直接看的毛片
|
国产一区二区三区四区三区
|
亚洲一区色
|
www.国产麻豆
|
亚洲色国产欧美日韩
|
国产成人亚洲综合无码
|
色综合色国产热无码一
|
国产精品久久无码不卡
|
日韩精品久久久久久久白丝
|
国产福利一区二区麻豆
|
香蕉视频久久
|
亚洲人成在线观看网站不卡
|
国产成人午夜福利免费无码r
|
国产精品亚洲一区二区在线观看
|
久久精品免费网站
|
国产精品a国产精品a手机版
|
国产福利精品一区二区
|
成人学院中文字幕
|
gg国产精品国内免费观看
|
亚洲国产精品lv
|
蜜桃色永久入口
|
天堂а√在线中文在线
|
日日碰狠狠躁久久躁9
|
亚洲区小说区
|
少妇人妻呻吟青椒bobx
|
国产区图片区一区二区三区
|
丝袜国产在线
|
国产精品午夜在线观看体验区
|
国产熟睡乱子伦午夜视频
|
亚洲一码二码三码精华液
|
四川丰满少妇被弄到高潮
|
北条麻妃在线一区二区韩世雅
|
草逼免费视频
|
91午夜精品一区二区三区
|
日日碰狠狠躁久久躁婷婷
|
含羞草一区二区
|
牲欲强的熟妇农村老妇女视频
|
免费无码久久成人网站入口
|
色综合福利
|
99久久婷婷国产精品综合
|
亚洲天堂av线
|
www.av欧美|
久久精品福利视频
|
亚洲www在线
|
精品国产一区二区三区久久
|
97视频免费观看
|
91精品国产闺蜜国产在线闺蜜
|
久草蜜桃
|
欧美成人h
|
黄色特级片
|
17c在线观看视频
|
少妇淫真视频一区二区
|
国产毛1卡2卡3卡4卡网站
|
夜夜天天噜狠狠爱2019
|