色拍自拍亚洲综合图区-色婷婷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] == '

主站蜘蛛池模板:
成人国产精品齐天大性
|
四虎884aa成人精品
|
国产免费无码一区二区三区
|
亚洲欧美激情四射在线日
|
免费看亚洲
|
亚洲精品久久久艾草网
|
www.97视频|
久热国产精品
|
北岛玲一区二区三区四区
|
黑人巨大精品欧美一区二区三区
|
天堂在线日本
|
人妻奶水人妻系列
|
村上凉子在线播放69xx
|
五月香|
天天曰天天射
|
亚洲欧美一区二区三区久久
|
国内精品免费久久久久电影院
|
日韩欧美无
|
国产av仑乱内谢
|
中文无码第3页不卡av
|
国产精品网红尤物福利在线观看
|
国产zzjjzzjj视频全免费
|
亚洲天堂久久新
|
师生出轨h灌满了1v1
|
欧美大片视频在线观看
|
国产精品不卡无码av在线播放
|
午夜yyy黄a一区二区三区
|
丰满人妻一区二区三区视频
|
在线观看欧美亚洲
|
亚洲精品久久久无码av片软件
|
国产毛片aaa
|
91精品国产高潮对白
|
午夜性刺激免费视频
|
色先锋av|
成人性做爰aaa片免费看曹查理
|
日日操天天射
|
婷婷在线视频观看
|
久久人搡人人玩人妻精品
|
亚洲日本乱码一区二区三区
|
小草久久久久久久久爱六
|
亚洲精品国男人在线视频
|
搡女人真爽免费午夜网站
|
欧美国产在线观看
|
久久riav|
国产久爱免费精品视频
|
添女人囗交vk
|
久久精品久久久久久久久久16
|
69久久久久|
国产精品婷婷午夜在线观看
|
国产免费黄
|
91久久久久久久国产欧美日韩-
|
天天干夜夜曰
|
97就去色|
xxx在线播放xxx
|
亚洲最大成人在线
|
深夜福利免费在线观看
|
黄色一几片
|
欧美一级网站
|
日本高清不卡中文字幕视频
|
99国产超薄丝袜足j在线播放
|
热久久国产
|
亚洲一级淫片
|
久久久亚洲欧洲日产国码二区
|
国内精品免费午夜又爽又色愉情
|
摸摸摸bbb毛毛毛片
一区二区三区无码免费看
久久久亚洲精品一区二区三区
|
亚洲黄色在线视频
|
久久久久97|
风流僵尸艳片a级
|
亚洲а∨天堂久久精品喷水
|
色哟哟免费视频
|
中文字幕无码肉感爆乳在线
|
91小宝寻花一区二区三区
|
久久伊人五月丁香狠狠色
|
国产又粗又硬又猛的毛片视频
|
日韩成人在线免费观看
|
44382亚洲最大成人网
|
真人床震高潮全部视频免费
|
无码成人片在线播放
|
女人爽到高潮的免费视频
|
亚洲国产精品精
|
国产在线拍揄自揄拍无码视频
|
色综合天天色综合
|
日韩少妇白浆无码系列
|
97久久国产|
午夜爱爱免费视频
|
国产成人亚洲精品无码青app
|
国产五区|
国产韩国精品一区二区三区久久
|
亚洲精品国产嫩草在线观看东京热
|
虎白女粉嫩尤物福利视频
|
风流僵尸艳片a级
|
亚洲成av人片一区二区小说
|
女人被弄到高潮叫床免
|
欧美激情aaa|
免费三级大片
|
中文国产日韩欧美二视频
|
污导航在线
|
久久久久青草大香综合精品
|
熟女视频一区二区在线观看
|
一本一本久久a久久精品综合
|
性色综合
|
人妻系列无码专区无码中出
|
337人体做爰大胆视频
|
麻豆人人妻人人妻人人片av
|
亚洲三级一区
|
国产精品传媒在线观看
|
jizz丰满的韩国女人
|
黄色国产片
|
亚洲国产一区二区在线
|
国产精品久久久久久2021
|
嘿咻嘿咻男女免费专区
|
老牛嫩草二区三区观影体验
|
亚洲中文字幕乱码一区
|
一二三四在线观看免费视频
|
少妇厨房愉情理伦片bd在线观看
|
999精欧美一区二区三区黑人
|
99精品国产在热久久无毒
|
无码专区人妻系列日韩精品少妇
|
国产午夜无码片在线观看影院
|
久久久久久免费毛片
|
免费国产精品视频在线
|
色拍拍在线精品视频
|
在线看日韩av
|
亚洲国产精品激情综合图片
|
成人小说亚洲一区二区三区
|
国产精品久久一区二区三区动漫
|
2020精品国产福利在线观看香蕉
|
国内福利视频
|
欧美日韩在线第一页
|
69亚洲乱人伦
|
久久国产精品久久w女人spa
|
日韩欧美在线观看一区二区
|
一区二区在线欧美日韩中文
|
少妇精品揄拍高潮少妇
|
日韩免费无码成人久久久久久片
|
国产欧美在线一区二区三
|
亚州久久久久区1区2少妇
|
国产精品色拉拉
|
国语对白超精彩
|
欧美日本激情
|
色校园
|
亚洲精品无码久久久久牙蜜区
|
av无码久久久久不卡网站下载
|
午夜熟女插插xx免费视频
|
国产黄色一级录像
|
九九综合
|
国产精品久久久久久人妻精品18
|
午夜精品在线视频
|
亚洲综合网站久久久
|
日韩中文高清在线专区
|
97超碰网|
毛片在线网址
|
成人福利一区
|
久久激情小说
|
欧美成 人影片 aⅴ免费观看
|
成人免费xxxxx在线观看
|
黄色一级大片在线免费看国产一
|
麻豆视传媒官网免费观看
|
久久99亚洲精品久久69
|
九九黄色大片
|
日本老头xxxx视频
|
中文韩国午夜理伦三级好看
|
少妇被又大又粗又爽毛片
|
xzjzjzjzjzj欧美大片
|
情侣作爱视频网站
|
日日夜夜婷婷
|
国产精品成人一区二区三区夜夜夜
|
日韩综合亚洲色在线影院
|
亚洲女同性同志熟女
|
天堂一区
|
免费一区二区三区
|
国产露脸无套对白在线播放
|
国产成人啪精品视频免费视频
|
欧美11p|
玖玖爱在线精品视频
|
精品日韩在线视频
|
泰国三级av
|
天天色欧美
|
欧美性猛交bbbbb精品
|
狠狠撸在线
|
国产美女高潮一区二区三区
|
日韩国产精品一区二区
|
丰满双乳峰白嫩少妇视频
|
美女久久久久久
|
亚洲激情在线播放
|
人妻熟妇乱又伦精品视频中文字幕
|
国产一性一交一伦一a片
|
超碰av在线播放
|
一边摸一边抽搐一进一出口述
|
91久久精品国产91久久性色tv
|
jizz视频|
日韩成人精品视频
|
色综合热无码热国产
|
国产精品一区二区福利视频
|
天堂aⅴ无码一区二区三区
18中国xxxxxⅹxxx96
|
久久精品亚洲精品无码
|
欧美激情一区二区三区成人
|
欧美伦理一区
|
狠狠色综合久久婷婷
|
欧美阿v高清资源在线
|
国产乱子伦视频大全亚瑟影院
|
欧美3p激情一区二区三区猛视频
|
玖玖在线播放
|
夜夜爽天天操
|
4438xx亚洲五月最大丁香
|
亚洲综合伊人久久综合
|
67194午夜|
国内精品久久久人妻中文字幕
|
91成人福利|
日韩精品不卡在线
|
99久热国产精品视频尤物
|
欧美少妇xxx|
97精品免费公开在线视频
|
亚洲中文字幕无码一区在线
|
免费国产在线精品一区二区三区
|
黄色a级免费
|
国产女人乱子对白av片
|
亚洲第一av片精品堂在线观看
|
亚洲日韩看片无码电影
|
99在线国产
|
欧美真人做爰在线观看
|
无码国产欧美一区二区三区不卡
|
精品麻豆国产色欲色欲色欲www
|
亚洲欧美日本国产专区一区
|
人人爽久久涩噜噜噜av
|
插插插色综合
|
羞羞影院午夜男女爽爽免费视频
|
久久精品国产精品国产精品污
|
欧美一区二区三区激情视频
|
向日葵视频在线播放
|
人人妻人人澡人人爽秒播
|
亚洲天堂三级
|
国产在线高清理伦片a
|
snis839痴汉明日花キララ
|
国产精品久久777777换脸
|
老女人伦理中文字幕
|
欧美精品久久久久久久久久丰满
|
精品成人免费视频
|
最新中文字幕2019
|
超碰人人干
|
性色av无码一区二区三区人妻
|
中文无码日韩欧免费视频
|
91国语
|
51国产黑色丝袜高跟鞋
|
国产精品久久久久久久久久软件
|
成人片在线播放
|
欧美激情一区二区三级高清视频
|
国产一级视频在线观看
|
欧美日韩视频在线
|
嫩模周妍希视频一区二区
|
波多野结衣在线视频免费观看
|
亚洲精品丝袜一区二区三区
|
狠狠色噜噜狼狼狼色综合久
|
无码区国产区在线播放
|
av在线专区
|
99久久国产露脸精品国产麻豆
|
www.欧美亚洲|
亚洲国产精品久久艾草纯爱
|
国产高清在线精品一区不卡
|
欧美精品乱码视频一二专区
|
亚洲国产成人精品无码区软件
|
欧美v在线
|
在线播放91灌醉迷j高跟美女
|
自拍偷区亚洲综合美利坚
|
欧美激情在线
|
嫩模写真一区二区三区三州
|
麻豆国产96在线 | 日韩
|
黑人巨大精品一区二区
|
97久久久久久久久久久久
|
日本极品在线
|
伊人狠狠干
|
亚洲欧美日韩视频一区
|
国产精品久久久久久久久久三级
|
伊人久久精品av一区二区
|
日本a级一区
|
亚洲亚洲精品av在线动态图
|
国产麻豆乱子伦午夜视频观看
|
国产免费无码一区二区三区
|
性欧美长视频免费观看不卡
|
国产成人尤物在线视频
|
放荡的美妇在线播放
|
狠狠操中文字幕
|
在线观看国产一区二区三区
|
亚洲成人av一区二区
|
孕妇怀孕高潮潮喷视频孕妇
|
欧美日韩在线精品视频二区
|
国产又粗又长又黄的视频
|
国产精彩视频一区
|
精品一区二区三区波多野结衣
|
噜噜色综合天天综合网mp3
|
国产一级免费在线观看
|
天天综合天天爱天天做
|
国产精品美女久久久久aⅴ国产馆
|
亚洲综合激情五月丁香六月
|
在线涩涩免费观看国产精品
|
性欧美videofree高清精品
|
99re久久精品国产首页
|
日本免费一区二区三区四区五六区
|
囯产精品一品二区三区
|
成人羞羞网站
|
亚洲 欧美 唯美 国产 伦 综合
|
亚洲aⅴ无码成人网站国产app
|
黑人巨大精品欧美一区二区桃花岛
|
久久婷婷五月综合色高清
|
国产极品粉嫩福利姬萌白酱
|
大香伊人中文字幕精品
|
国产麻豆乱码精品一区二区三区
|
在线无码va中文字幕无码
|
国产毛片久久久久久国产毛片
|
国产网友自拍
|
欧美va天堂va视频va在线
|
在线成人免费
|
国产97色在线 | 国
|
成人aaaa
|
天堂网91
|
伦理片免费完整片在线观看
|
国产91对白在线播放丿
|
末发育娇小性色xxxxx
|
91小宝寻花一区二区三区
|
久久夜色精品国产噜噜麻豆
|
国产欧美一区二区精品久久
|
成人免费8888在线视频
|
久久精品视频在线免费观看
|
中文字幕一区二区三区乱码在线
|
又色又爽又黄又免费的照片
|
日本美女交配
|
免费的毛片
|
精品成人免费一区二区在线播放
|
一久久久久
|
久久久久综合精品福利啪啪
|
黑人巨大精品欧美一区二区小视频
|
亚洲中久无码永久在线观看同
|
少妇爆乳无码专区av无码
|
日本一区二区三区在线观看
|
久久精品国产一区二区三区肥胖
|
超碰在线观看91
|
久久不见久久见免费视频6无删减
|
国产精品久久久久久久久久久久久久久久久
|
少妇被爽到高潮在线观看
|
黄色的网站在线免费观看
|
免费全部高h视频无码
|
成人国产一区二区精品小说
|
久久人人97超碰超国产
|
国产乱妇乱子在线播放视频
|
日本免费一区高清观看
|
福利在线免费
|
av色欲无码人妻中文字幕
|
少妇人妻丰满做爰xxx
|
av在线资源观看
|
国内最真实的xxxx人伦
|
涩涩涩涩爱网站
|
jizz成熟丰满日本少妇
|
久久996re热这里只有精品无码
|
久久香蕉网
|
高清国产在线拍揄自揄视频
|
中文字幕2区
|
激情视频久久
|
日日橹狠狠爱欧美视频
|
亚洲美女毛片
|
天天色综合6
|
蘑菇福利视频一区播放
|
久久影院综合精品
|
色综合色综合久久综合频道88
|
高清偷自拍第1页
|
制服丝袜国产在线
|
少妇内射高潮福利炮
|
国产伦视频
|
99国产视频
|
日日摸夜夜添狠狠添欧美
|
国产精品亚洲片夜色在线
|
人人揉人人捏人人添
|
成人午夜福利视频镇东影视
|
麻豆久久久9性大片
|
国产乱色精品成人免费视频
|
亚洲久热无码中文字幕人妖
|
国产亲子乱弄免费视频
|
国产精品爆乳在线播放不卡
|
九九视频免费精品视频
|
成人国产精品久久久按摩
|
欧美bbw另类xoxoxo
|
国产成人av国语在线观看
|
毛片免费视频肛交颜射免费视频
|
超清纯白嫩大学生无码网站
|
国产精品男人天堂
|
国产日韩精品视频一区二区三区
|
亚洲怡春院
|
免费看操片
|
色婷婷精品久久二区二区蜜臂av
|
成人h动漫精品一区二区器材
|
色五月激情五月
|
丰满肉嫩西川结衣av
|
97人人射
|
久久九九国产精品怡红院
|
亚洲一线在线观看
|
欧美色图88
|
40岁成熟女人牲交片20分钟
|
激情总合网
|
女色琪琪窝窝777777换脸
|
日韩欧美一中文字暮专区
|
www色播
|
国产精品久久久久久久久久久久午衣片
|
h网站在线播放
|
精品国产一区二区三区麻豆
|
大象传媒成人在线观看
|
国产精品天天av精麻传媒
|
国产高清在线精品一区app
|
国产视频一区二区三区在线观看
|
国产一大二大不卡专区
|
亚洲国产精品久久久久秋霞小
|
成在人线av无码免观看麻豆
|
一本色道久久加勒比88综合
|
久久久国产毛片
|
中国亚州女人69内射少妇
|
欧美特级黄色片
|
亚洲视频在线观看2018
|
国产不卡毛片
|
欧美另类图区清纯亚洲
|
a级黄色网址
|
久97蜜芽久热
|
天堂v亚洲国产ⅴ第一次
|
国产欧美va欧美va在线
|
人人干免费
|
日韩经典精品无码一区
|
少妇高潮毛片
|
成年在线网站免费观看无广告
|
二个男人躁我一个视频
|
国产情侣第一页
|
欧美射射射
|
全国男人天堂网
|
伊人精品一本久久综合
|
欧美日韩一区二区三区精品
|
国产在线观看无码的免费网站
|
国产精品人成
|
粉嫩虎白女毛片人体
|
精品久久毛片
|
久久精品卫校国产小美女
|
一本到在线
|
18禁无遮挡无码网站免费
|
久久久亚洲欧洲日产国码二区
|
亚洲色偷偷偷鲁精品
|
亚洲欧洲日产国码无码动漫
|
神马午夜嘿嘿
|
新呦u视频一区二区
|
国产专区在线
|
免费看黄色av
|
天天做天天爱天天综合网2021
|
五月婷婷伊人网
|
一区二区在线视频播放
|
毛片在线免费观看网址
|
成人三级无码视频在线观看
|
男女操操|
国产精品沙发午睡系列990531
|
一道久久爱综合久久爱
|
五月六月婷婷
|
风间由美一区
|
色婷婷久久久swag精品
|
国产精品久久免费视频
|
成人电线在线播放无码
|
国产精品久久久久9999小说
|
亚洲国产欧美一区点击进入
|
少妇久久久久久被弄到高潮
|
99re6热视频这里只精品首页
|
丰满少妇被猛烈进入试看
|
欧美另类图区清纯亚洲
|
亚洲精品国产精品乱码视色
|
亚洲女优视频
|
欧美乱淫视频
|
99久久免费看少妇高潮a片特黄
|
成人综合网亚洲伊人
|
亚洲国产日韩a在线播放
|
国产免费黄色
|
亚洲理论在线中文字幕观看
|
国产成人免费97在线
|
亚洲精品久久国产片400部
|
7777久久亚洲中文字幕
|
麻花传媒在线观看免费
|
在线观看免费视频污网站
|
黄色小视频免费看
|
日本欧美一级
|
免费看少妇作爱视频
|
二级黄色毛片
|
abp绝顶系列最猛的一部
|
粗大的内捧猛烈进出少妇
|
人妻耻辱中文字幕在线bd
|
成人91免费版
|
中文字幕无码肉感爆乳在线
|
av怡红院一区二区三区
|
91精品国产乱码麻豆白嫩
|
风韵犹存丰满大屁股熟妇
|
91福利在线观看视频
|
中文字幕无码乱人妻
|
www.av在线
|
99热在线免费观看
|
国产综合亚洲精品一区二
|
黄色小毛片
|
久99视频精品免费观看福利
|
婷婷丁香五月六月综合激情啪
|
亚洲а∨天堂男人色无码
|
天堂岛av|
精品综合久久久久
|
55夜色66夜色国产精品视频
|
国产精品无码日韩欧
|
色屁屁xxxxⅹ免费视频
|
欧美制服丝袜亚洲另类在线
|
亚洲一片
|
狼人伊人干
|
91精品国产99久久久久久久
|
亚洲中文无码人a∨在线
|
国产毛a片久久久久久无码
久久人人做人人爽人人av
|
日韩av高清无码
|
a毛片视频
|
亚洲中文字幕在线观看
|
久久综合99
|
国产中文字字幕乱码无限
|
日韩欧美精品在线
|
国产毛片精品一区二区
|
影音先锋中文字幕在线视频
|
亚洲国产三级在线观看
|
一本色道亚洲精品aⅴ
|
狂野欧美性猛xxxx乱大交
|
亚洲男女羞羞无遮挡久久丫
|
91精品国产91久久久久久最新
|
国产免费1卡二卡三卡四卡
亚洲视频免费在线播放
|
91成人入口
|
国产乱码精品一区二区
|
无码抽搐高潮喷水流白浆
|
成年人在线观看av
|
国产又黄又爽又刺激的软件
|
亚洲乱码1卡2卡3乱码在线芒果
|
www激情网
|
97青娱国产盛宴精品视频
|
国产黄网永久免费视频大全
|
亚洲色无码中文字幕手机在线
|
a在线视频
|
蘑菇福利视频一区播放
|
91精品国产777在线观看
|
亚洲r成人av久久人人爽澳门赌
|
一区二区精
|
九九久久视频
|
无码国产一区二区三区四区
|
91嫩草视频在线观看
|
国产无遮挡免费真人视频在线观看
|
一区二区三区日韩
|
精品精品国产自在97香蕉
|
日本一区不卡高清更新二区
|
久久久久国产精品人妻aⅴ网站
|
日韩女同在线二区三区
|
一级片毛片
|
国产欧美一区二区三区免费
|
日本三级韩国三级美三级91
|
精品国产乱码久久久久久口爆网站
|
成年人免费看黄色
|
亚洲中文字幕aⅴ天堂
|
成人午夜无码精品免费看
|
午夜视频色
|
91精品视频网
|
免费三级现频在线观看免费
|
国产理论高清一卡二卡三卡
|
久久精品国产亚洲5555
|
久久天天躁夜夜躁狠狠2018
|
国产激情з∠视频一区二区
|
超碰伊人久久
|
国产乱色精品成人免费视频
|
另类重口aaa
|
天天摸夜夜摸夜夜狠狠添
|
欧美精品二区三区四区免费看视频
|
牛鞭伸入女人下身的真视频
|
免费一级特黄特色的毛片
|
不戴套各种姿势啪啪高素质
|
欧洲丰满少妇a毛片
|
eeuss国产一区二区三区四区
|
国产av午夜精品一区二区入口
|
国产精品色呦呦
|
97在线国产
|
中国做受xxxxxaaaa|
第一福利蓝导航柠檬导航av
|
18深夜在线观看免费视频
|
少妇厨房愉情理9伦片视频
97视频在线免费观看
|
2021少妇久久久久久久久久
|
精品成人免费一区二区在线播放
|
日本做爰高潮片免费视频
|
国产美女永久免费无遮挡
|
超碰2022|
一区二区在线免费观看视频
|
成人午夜亚洲精品无码区毛片
|
国内精品国产三级国产在线专
|
国内精品自在自线视频
|
久久精品亚洲7777影院
|
欧洲精品99毛片免费高清观看
|
在线黄色大片
|
91在线视频导航
|
亚洲精品久久久蜜臀
|
一边摸一边做爽的视频17国产
|
18成人在线观看
|