国产精品不卡视频I91av中文I在线视频 亚洲I亚洲一级影院I日韩资源在线播放I深夜成人avI一区二区精品I黄色片网站I欧女人精69xxxxxxI在线播放 亚洲

行業應用
行業應用
基于樹莓派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] == '

主站蜘蛛池模板:
成人合集|
亚洲人成网址在线播放小说
|
非洲黑人性xxxx精品
|
人妻出差精油按摩被中出
|
欧美三级欧美成人高清www
|
人与善性猛交xxxx视频
|
a级高清免费毛片av播放
|
乱码一卡2卡3卡4卡精品
|
亚洲色图激情小说
|
综合狠狠
|
日韩人妻精品无码一区二区三区
|
台湾无码一区二区
|
国产亚洲欧洲av综合一区二区三区
|
国产麻豆剧果冻传媒兄妹蕉谈
|
美日韩在线视频一区二区三区
|
越南性xxxx精品hd
|
久久这里只有精品国产免费10
|
欧美与黑人午夜性猛交久久久
|
欧美性生活视频免费看
|
69堂成人精品视频在线观看
|
国产影视一区二区
|
欧美黑人又粗又硬xxxxx喷水
|
性少妇中国内射xxxx狠干
|
国产女人精品视频
|
国产精品爽爽ⅴa在线观看
亚洲一区二区精品视频
|
久久观看最新视频
|
国产刚发育娇小性色xxxxx
|
亚洲欧美日韩久久精品
|
a级老太婆毛片老太婆毛片
国产久热精品无码激情
|
久久国产尿小便嘘嘘97
|
色婷婷国产精品免费网站
|
麻豆成人久久精品二区三区小说
|
国产精品亚洲专区无码老司国
|
伊大人香蕉综合8在线视
|
国产av毛片亚洲含羞草社
|
天天天欲色欲色www免费
|
和三个男人4p爽爆了
|
天天干天天日
|
爱逼av|
午夜男女爽爽影院免费视频下载
|
www视频在线
|
91看片就是不一样
|
国产成人免费永久播放视频平台
|
欧美性色xxxx
|
狼友网精品视频在线观看
|
亚洲人视频在线观看
|
国产国产人免费人成免费
|
美女翘臀少妇啪啪呻吟流水
|
丰满少妇大力进入av亚洲葵司
|
精品国产乱码久久久久久免费
|
男女无遮挡猛进猛出免费视频国产
|
动漫啪啪高清区一区二网站
|
香蕉在线网
|
日韩成人片
|
女女女女bbbb日韩毛片
|
色播在线观看
|
成人在线视频网站
|
免费看成人午夜福利专区
|
福利一区二区三区视频在线观看
|
国偷自产av一区二区三区小尤奈
|
色欲久久久天天天综合网精品
|
五十路毛片
|
国产一卡2卡三卡4卡 在线观看
|
久久美女性网
|
日本少妇毛耸耸毛多水多
|
久久人人97超碰caoporen
|
国产日韩欧美高清
|
久久国产精品亚洲
|
日本精品视频一区
|
农村老熟妇乱子伦视频
|
亚洲综合激情五月丁香六月
|
xnxx女第一次
|
伊人网免费视频
|
欧美激情综合色综合啪啪五月
|
藏春阁福利视频
|
色偷偷亚洲女人的天堂
|
久国产精品
|
成人美女黄网站色大免费的88
|
日本十八少妇毛片视频
|
国语自产精品视频在线看
|
午夜美女裸体福利视频
|
成人理伦片免费
|
国产免费av一区
|
99无码熟妇丰满人妻啪啪
|
久久中文字幕免费
|
天天做天天爱夭大综合网
|
男人的天堂在线播放
|
久久久久久艹
|
天天综合91|
国产一区二区三区精品在线
|
国产视频123区|
免费精品国产自产拍在线观看图片
|
无码国产精品一区二区免费虚拟vr
|
精品国产精品久久一区免费式
|
99色图|
一本丁香综合久久久久不卡网站
|
超黄网站在线观看
|
狂野欧美性猛交xxxx
|
韩日在线视频观看
|
少妇饥渴偷公乱第95
|
欧美a v在线播放
|
尤物永久网站
|
亚洲国产精品久久久久久女王
|
欧美亚洲国产精品久久高清
|
91抖音在线观看
|
中文无码精品a∨在线
|
国产精品无码无片在线观看
|
国产91成人欧美精品另类动态
|
一本大道久久香蕉成人网
|
在线a亚洲视频播放在线观看
|
无码熟妇人妻av在线影片最多
|
亚洲人成精品久久久久桥本
|
国产精品自在拍首页视频
|
国产精品sm捆绑调教视频
|
a天堂在线|
天天插伊人
|
日本阿v片在线播放免费
|
国精产品一区二区三区黑人免费看
|
任你躁x7x7x7x7在线观看
|
国产又粗又硬又猛的免费视频
|
www.男人天堂
|
成人无码潮喷在线观看
|
一道本不卡视频
|
国产精品jk白丝av网站
|
亚洲国产精品尤物yw在线观看
|
狠狠干2022|
国产白嫩漂亮美女在线观看
|
人妻熟女αⅴ一区二区三区
|
国产三级精品一区二区三区视频
|
久久久久久久精
|
偷拍区清纯另类丝袜美腿
|
国产乱码精品一区二区
|
麻豆国产成人av在线播放欲色
|
国产人妻无码一区二区三区18
|
亚洲精品欧美二区三区中文字幕
|
亚洲欧洲国产视频
|
久久免费视频1
|
神马一区二区三区
|
另类重口aaa
|
波多野结衣 久久
|
18禁裸体动漫美女无遮挡网站
|
国产成人无码精品久久久性色
|
欧美日韩综合一区
|
在线最全导航精品福利av
|
黄色的网站免费看
|
在线观看特色大片免费视频
|
中本亚洲欧美国产日韩
|
一本大道一卡2卡三卡4卡国产
|
中文字幕一区二区三区四区欧美
|
18成人在线观看
|
欧美性jizz18性欧美肥胖脸
|
成人免费观看在线视频
|
国产又粗又猛又大爽老大爷
|
久久不雅视频
|
91国内在线观看
|
在火车千女人毛片看看
|
精品女同一区二区
|
亚洲不乱码卡一卡二卡4卡5卡
|
性生活在线视频
|
国产色欲色欱www在线
|
青青草视频网站
|
日韩在线观看你懂的
|
99国产成人综合久久精品77
|
成人孕妇专区做爰高潮
|
97se色综合一区二区二区
|
日韩、欧美、亚洲综合在线
|
欧美精品色图
|
东京热无码人妻系列综合网站
|
国产最新av在线播放不卡
|
视频区图片区小说区
|
欧美亚洲日本国产
|
97国产超薄黑色肉色丝袜
|
日韩欧美一区二区三
|
成人免费视频在线观看
|
99re6在线|
久久超碰97人人做人人爱
|
亚洲丰满熟女一区二区v
|
日韩av无码成人无码免费
|
国产午夜福利院757视频
|
67194少妇|
天堂网www
|
一级片久久久久
|
午夜精品福利视频
|
欧美jizzhd精品欧美喷水
|
把少妇弄高潮了www麻豆
|
特级黄一级播放
|
国产成人无码国产亚洲
|
国产精品不卡在线
|
成人涩涩视频
|
啪啪69xxⅹ偷拍
|
午夜a级片
|
免费成年人高清视频
|
欧美日韩一区二区三区四区
|
91av视频播放
|
动漫av网站免费观看
|
四虎影视精品永久在线观看
|
韩日综合成人中文字幕
|
日韩一区二区免费播放
|
国产人成高清在线视频99最全资源
|
久久久久久免费看
|
天堂a免费视频在线观看
|
对白脏话肉麻粗话av
|
国产精品天天在线午夜更新
|
天天爱天天草
|
国产成人综合亚洲
|
日韩资源网
|
夜夜操网
|
国产精品_国产精品_k频道
|
少女高清影视在线观看动漫
|
国产做爰xxxⅹ高潮视频在线
|
免费一级做a爰片蜜桃
|
99久久精品免费看国产免费粉嫩
|
国产69精品久久久久孕妇大杂乱
|
136fldh导航福利视频
|
国产中文欧美日韩在线
|
无码人妻一区二区三区在线视频
|
欧美69精品久久久久久不卡
|
少妇高潮一区二区三区
|
亚洲成品网站源码中国有限公司
|
男女视频一区
|
日本国产一区
|
国产成人精品日本亚洲
|
男女插孔视频
|
亚洲丶国产丶欧美一区二区三区
|
国产精品一区二区av片
|
91久久精品视频
|
亚洲成av人片乱码色午夜
|
熟妇的奶头又大又粗视频
|
青青草伊人网
|
天天上天天添天天爱少妇
|
久久五月网
|
精品噜噜噜噜久久久久久久久
|
黄色av网站在线看
|
丝袜性爱视频
|
国产乱理伦片在线观看
|
中文在线а√在线天堂中文
|
久久久久久人妻一区二区三区
|
色噜噜狠狠色综合中文字幕
|
wwwyoujizzcom久久
伊人激情av一区二区三区
|
成人啪精品视频网站午夜
|
国产精品久久人妻无码
|
日韩欧美网址
|
校园春色 亚洲色图
|
成人影片网址
|
久久无码字幕中文久久无码
|
久久综合91|
久久久久一区二区三区
|
毛片网站网址
|
老女人性视频
|
日本高清免费观看
|
永久免费观看国产裸体美女
|
亚洲丁香婷婷久久一区二区
|
13小箩利洗澡无码视频网站
|
91们嫩草伦理
|
爱情岛亚洲论坛福利站
|
一级片免费在线
|
亚洲黄色成人
|
久久成年人
|
国产福利不卡
|
欧美日韩亚洲在线
|
六月婷婷久香在线视频
|
91麻豆影院
|
久久久麻豆
|
亚洲成a∨人片在线观看不卡
|
精国产品一区二区三区四季综
|
国产11一12周岁女毛片
|
老汉av网站|
成人免费网站在线观看
|
91黄色免费
|
久久影视|
2021最新在线精品国自产拍视频
|
久久久久中文字幕
|
免费永久看黄在线观看
|
久久国产精品免费视频
|
91插插插影库永久免费
|
伊人久久综合精品无码av专区
|
国模和精品嫩模私拍视频
|
一区二区三区四区在线 | 网站
|
天天在线免费视频
|
国产精品成熟老女人视频
|
亚洲色图视频在线观看
|
波多野结衣av一区二区三区中文
|
丁香五月综合久久激情
|
精品国产露脸久久av
|
av噜噜色
|
成年人黄色片网站
|
国产精品久久久久久妇女
|
eeuss鲁片一区二区三区69
|
日韩精品首页
|
亚洲午夜无码久久久久
|
亚洲大胆视频
|
欧美一级鲁丝片
|
正在播放酒店约少妇高潮
|
69视频网站
|
日本三级午夜理伦三级三
|
色欲久久久中文字幕综合网
|
亚洲成人91
|
国产精品久久久久久久久久了
|
av无码精品一区二区三区四区
|
日韩美女黄色
|
国产高清在线观看
|
国产精品18久久久久久vr
|
美女啪啪网址
|
欧美人吸奶水吃奶水
|
欧美性猛交xxxx黑人猛交
|
五十路熟女一区二区三区
|
69午夜
|
精品久久人妻av中文字幕
|
精品偷拍一区二区三区在线看
|
亚洲成aⅴ人在线视频
|
视色视频在线观看
|
9 9久热re在线精品视频
|
av手机免费在线观看
|
国产精品yy
|
日本黑人一区二区免费视频
|
宅宅午夜无码一区二区三区
|
成人欧美一区二区三区黑人免费
|
亚洲国产成人精品av区按摩
|
欧美大屁股xxxx高潮喷水
|
免费无码av一区二区
|
日本色中色
|
亚洲中文字幕日产乱码在线
|
在线视频这里只有精品
|
国产对白国语对白
|
国产免费黄色av
|
国产欧美va欧美va在线
|
欧美亚洲一级片
|
内射中出日韩无国产剧情
|
亚洲精品一区二区三区樱花
|
99这里有精品视频
|
色综合久久88色综合天天免费
|
九九视频在线观看视频6
|
午夜女色国产在线观看
|
亚洲精品国产美女久久久
|
伊人伊成久久人综合网
|
色女人综合
|
狼人伊人久久
|
欧美专区视频
|
99re6这里只有精品
|
国语精品自产拍在线观看网站
|
黄网站免费在线观看
|
一边啪啪一边呻吟av夜夜嗨
|
久久久久高清
|
欧美黄绝喷潮片
|
偷窥自拍999
|
91久久国产
|
精品人妻无码区在线视频
|
亚洲香蕉中文网
|
国产自啪精品视频网站丝袜
|
亚洲精品18
|
亚洲欧洲国产十
|
久久精品国产欧美日韩
|
国自产拍偷拍精品啪啪av
|
亚洲精品国产精品国
|
50岁熟妇大白屁股真爽
|
午夜在线视频免费观看
|
超碰女优|
中文字幕在线播放一区
|
精品国产91久久久
|
中文字幕乱偷无码av先锋蜜桃
|
亚洲天堂首页
|
8mav直接进入|
欧美 亚洲 动漫 激情 自拍
|
91中文字幕网
|
天天影视涩香欲综合网
|
日本三级欧美三级人妇视频
|
少妇熟女久久综合网色欲
|
亚洲成av人片在线观看无下载
|
久久久www成人免费毛片女
|
色网站在线看
|
国产果冻豆传媒麻婆
|
精品久久久久久中文墓无码
|
91丝袜一区在线观看
|
日韩成人性视频
|
国产在线观看无码不卡
|
高清日韩av|
国产精品久久久爽爽爽麻豆色哟哟
|
久久视频在线播放
|
色婷婷av777
亚洲成av人片在线观看下载
|
少妇人妻在线无码天堂视频网
|
天天夜夜啦啦啦
|
奇米影视777四色狠狠
|
日本特黄高清免费大片
|
国产欧美日韩中文久久
|
亚洲偷精品国产五月丁香麻豆
|
中文字幕 视频一区
|
国产无遮挡一区二区三区毛片日本
|
久久精品麻豆日日躁夜夜躁妓女
|
精品久久久久中文字幕加勒比
|
亚洲成亚洲乱码一二三四区软件
|
三级全黄做爰龚玥菲在线
|
久久三级中文欧大战字幕
|
julia乱码中文一二三区
|
秋霞av无码一区二区三区试看
|
aa一级片
|
欧美一道本
|
免费在线观看成人
|
亚洲精品久久午夜无码一区二区
|
免费不卡的av
|
国产男女猛烈无遮挡免费视频网站
|
国产精品一区二区免费
|
强伦人妻一区二区三区视频18
|
丰满人妻跪趴高撅肥臀
|
国产精品福利一区二区久久
|
欧美综合一区
|
精品在线免费观看视频
|
国产婷婷在线精品综合
|
天堂在线亚洲
|
日韩视频一区在线
|
人人妻人人爽人人澡欧美一区
|
久久国产精品波多野结衣
|
色涩涩|
青青青在线免费
|
最近中文字幕免费mv在线
|
国产又黄又猛又粗又爽的a片动漫
|
台湾性色hd性色av
|
久久天堂av综合色无码专区
|
久久久亚洲欧洲日产国码606
|
欧美性猛交xxxx黑人猛交
|
国产麻豆9l精品三级站
|
69久久久久久
|
久久久久久久一区
|
樱花草在线社区www中国中文
|
精品无码日韩一区二区三区不卡
|
性色av一区二区
|
中文字幕少妇高潮喷潮
|
国产九九久久
|
国产盗摄夫妻原创视频在线观看
|
国产一区二区三区影院
|
亚洲欧洲一区二区三区四区
|
国产精品一区二区久久精品爱微奶
|
无码人妻精品一区二区三区66
|
亚洲日本乱码一区二区三区
|
国产露脸150部国语对白
|
韩日av网站|
日本啊v在线|
日本一区二区视频在线
|
欧洲女人牲交视频免费
|
久久久久97国产精华液
|
亚洲性片
|
91丨porny丨在线
|
国产精品美女久久久久久久网站
|
日本va欧美va欧美va精品
|
99热网址
|
伊人久久综合狼伊人久久
|
大香伊蕉在人线国产最新75
|
国产福利第一视频在线播放
|
婷婷嫩草国产精品一区二区三区
|
国产98在线传媒麻豆有限公司
|
成人 黄 色 免费播放
|
亚洲成人美女xvideos
|
欧美一级特黄aaaaaaa什
|
很黄很色60分钟在线观看
|
91麻豆蜜桃一区二区三区
|
av免费无码天堂在线
|
天堂在线www中文
|
国产乱子伦60女人的皮视频
|
国产精品日本
|
欧美成人精品三级在线观看
|
黄色小视频链接
|
国产亚洲人成无码网在线观看
|
精品人妻潮喷久久久又裸又黄
|
口爆吞精一区二区久久
|
国产又黄又硬又粗
|
蜜桃视频一区二区三区
|
欧美性猛烈
|
日日热|
天码av无码一区二区三区四区
|
97精品国产一区二区三区
|
亚洲熟女综合色一区二区三区
|
国产一区二区久久
|
欧美日韩在线观看成人
|
亚洲国产影院av久久久久
|
国产欧美日韩综合精品一区二区
|
在线观看的av免费网站
|
在线观看黄色片
|
狂野欧美性猛交免费视频
|
古装三级做爰在线观看
|
久久观看|
99riav欧美丰满少妇视频
|
youjizz.com在线观看
|
国内精品久久久久久久日韩
|
夜夜嗨av一区二区三区免费区
|
四色最新网址
|
丁香花完整视频小说
|
激情综合亚洲
|
日韩精品一区二区三区中文
|
亚洲欧美日韩国产精品
|
亚洲精品久久蜜桃站
|
国产免费一区二区三区网站免费
|
国产在线精品一区二区夜色
|
亚洲中字慕日产2020
|
色婷婷五|
久久久久久人妻精品一区二区三区
|
精品av天堂毛片久久久
|
亚洲日韩亚洲另类
|
国产亚洲精品久久久久久国
|
日本特黄特色大片免费视频老年人
|
在线免费日本
|
免费国精产品自偷自偷免费看
|
色婷婷国产精品视频
|
日本黄h兄妹h动漫一区二区三区
|
欧美性猛交xxxx免费视频软件
|
国产色综合视频
|
日日天日日夜日日摸
|
天堂av免费
|
天天综合亚洲综合网天天αⅴ
|
狠狠综合
|
天天摸天天看天天做天天爽
|
国产精品一区二区在线蜜芽tv
|
亚洲综合色噜噜狠狠网站超清
|
久久99精品久久久久久秒播
|
免费精品国偷自产在线在线
|
久久精品79国产精品
|
国产精品操
|
91pro国产福利网站www
|
中文字幕乱码亚洲精品一区
|
亚洲av毛片基地
|
亚洲国产高清在线一区二区三区
|
久久精品人人做人人爽
|
久久成人啪啪性教育
|
国产免费女女脚奴视频网
|
中文字幕乱码人妻一区二区三区
|
果冻传媒18禁免费视频
|
亚洲中文字幕无码久久2020
|
性爱免费在线视频
|
久久久www免费人成黑人精品
|
538任你躁精品视频网免费
|
久热国产vs视频在线观看
|
成人在线视频一区二区
|
日韩中文字幕一区二区三区
|
国产精品午夜福利麻豆
|
91精品福利|
2022一本久道久久综合狂躁
|
一个人看的毛片
|
成人午夜在线观看视频
|
久久国产v综合v亚洲欧美蜜臀
|
一区二区视频观看
|
国产精品影音先锋
|
国产传媒一级片
|
欧美一级免费视频
|
中文字幕热久久久久久久
|
色视频免费观看
|
中文天堂在线www
|
国产迷姦播放在线观看
|
中日韩精品无码一区二区三区
|
免费理伦片在线播放网站
|
亚洲精品中文字幕乱码三区91
|
www天堂avcom|
91狠狠爱
|
四虎视频在线观看
|
久久婷婷狠狠综合激情
|
久久久欧美国产精品人妻噜噜
|
国产美女午夜福利视频
|
亚洲中文字幕无码一区二区三区
|
久久99国产综合精品免费
|
在线性视频
|
黄色大片视频
|
欧美性猛交ⅹxxx乱大交3
|
成人永久免费网站在线观看
|
午夜影皖精品av在线播放
|
国产美女无遮挡免费软件
|
操在线视频
|
日韩国产综合
|
国产91网站在线观看
|
日韩大片免费在线观看
|
九九综合九九
|
精品欧洲av无码一区二区三区
|
中文字幕乱码日本亚洲一区二区
|
亚洲性色av日韩在线观看
|
成年网站在线在免费线播放欧美
|
99热在
|
67194熟妇人妻欧美日韩
|
麻豆人人妻人人妻人人片av
|
精品国产乱码久久久久久蜜柚
|
国产91在线免费
|
亚洲美女网站
|
日批免费观看视频
|
精品久久久久久久久久久下田
|
免费极品av一视觉盛宴
|
熟女毛多熟妇人妻在线视频
|
中文字幕av一区
|
国产成人免费97在线
|
欧美高清一区三区在线专区
|
日韩视频中文
|
欧美 亚洲 另类 制服 自拍
|
欧美综合区自拍亚洲综合图
|
永久免费的av在线网无码
|
久久综合久久久久88
|
蜜桃精品在线
|
亚洲欧美日韩视频高清专区
|
白白色2012年最新视频
|
精品国产va久久久久久久
|
少妇公车张开腿迎合巨大视频
|