国产精品不卡视频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] == '

主站蜘蛛池模板:
亚洲国产制服丝袜先锋
|
思思99思思久久最新精品
|
麻豆国产一区二区三区四区
|
少妇玉梅抽搐呻吟
|
日本丰满熟妇乱子伦
|
国产91精品一区二区
|
国产成人综合亚洲亚洲国产第一页
|
天天摸天天碰天天添
|
免费看国产精品
|
国产精品99久久免费观看
|
中文字幕肉感巨大的乳专区
|
国产精品激情在线观看
|
久久久亚洲精品一区二区三区
|
免看一级a毛片一片成人不卡
|
亚洲午夜精品a片久久www慈禧
|
少妇精品久久久一区二区三区
|
美妇av|
eeuss国产一区二区三区四区
|
99久久人妻无码精品系列蜜桃
|
色狠狠成人综合网
|
国产99久久亚洲综合精品
|
人人曰
|
日本妞xxxxxxxxx68
|
精品国产一区二区三区四区动漫a
|
欧美又大又黄又粗又长a片
国产香蕉在线
|
成人久久|
天干天干天啪啪夜爽爽av网站
|
噜啦噜色姑娘综合网
|
天堂av片
|
婷婷丁香在线
|
暖暖视频 免费 日本社区
|
亚洲不卡在线播放
|
国产强被迫伦姧在线观看无码
|
jizz免费|
少妇人妻无码专区视频免费
|
亚洲射射|
992人人草|
日韩精品一区二区三区在线观看视频网站
|
国产情侣出租屋露脸实拍
|
欧美精品在线一区
|
特级丰满少妇一级aaaa爱毛片
|
波多野结衣高清视频
|
和岳每晚弄的高潮嗷嗷叫视频
|
国产精品国产自线拍免费软件
|
精品成人毛片一区二区
|
日本三级香港三级乳网址
|
亚洲精品无线乱码一区
|
色综合天天综合网天天看片
|
亚洲成在人线免费视频
|
强开小受嫩苞第一次免费视频
|
日韩精品无码一区二区三区不卡
|
欧美性猛交xxxxx按摩欧美
|
三八激情网|
中文字幕丰满人孑伦
|
108种啪姿势大全动态图
|
无码男男做受g片在线观看视频
|
欧美久久一区二区
|
看全色黄大色大片60岁
|
精品国产乱码久久久久久移动网络
|
天天操中文字幕
|
久久视频国产
|
韩国三级做爰视频
|
一个人看的www免费视频中文
|
亚洲精品伦理熟女国产一区二区
|
cao我|
狠狠亚洲色一日本高清色
|
国产精品美女久久
|
我的邻居在线观看
|
人人妻在人人
|
天天撸日日夜夜
|
少妇人妻大乳在线视频不卡
|
欧美做受视频播放
|
丰满少妇女人a毛片视频
|
一区二区三区高清日本vr
|
国产免费又色又爽又黄软件
|
波多野结衣在线观看一区二区
|
波多野结衣在线观看一码
|
无码人妻一区二区三区免费视频
|
日本老熟欧美老熟妇
|
精品久久久久久无码专区不卡
|
9久久9毛片又大又硬又粗
|
少妇坐莲好爽91
|
六月婷婷av|
youjizz麻豆|
一级特黄aaa毛片在线视频
|
亚洲一区黄色
|
入侵人妻反抗中文字幕
|
欧美成人一区二免费视频软件
|
私人毛片免费高清影视院
|
白石茉莉奈一区二区av
|
人人妻人人做人人爽夜欢视频
|
日本无码人妻一区二区色欲
|
2015www永久免费观看播放
|
动漫精品视频一区二区三区
|
午夜国产精品入口
|
丁香六月色
|
日本性插视频
|
少妇高潮zzzzzzzyⅹ一
|
中文字幕人妻少妇引诱隔壁
|
国产3p在线播放
|
亚洲永久精品ww47
|
国产无套内射久久久国产
|
欧美三級片黃色三級片黃色
|
99啪啪|
国产人妻一区二区三区久
|
国产一区二区不卡老阿姨
|
欧美桃色视频
|
国模国产精品嫩模大尺度视频
|
67194熟妇在线永久免费观看
|
亚洲精品大全
|
欧美成人va免费大片视频
|
亚洲精品国产精品色诱一区
|
成人欧美视频在线观看
|
亚洲视频欧美视频
|
色婷婷免费
|
波多野结衣高潮av在线播放
|
亚洲高清一区二区三区电影
|
日产精品久久久一区二区
|
国产亚洲日韩欧美一区二区三区
|
天天舔天天干
|
av免费观看网址
|
在线观看亚洲成人
|
中文成人无码精品久久久动漫
|
国内精品少妇在线播放98
|
久久亚洲精品无码aⅴ大香
久久久久久久久女人体
|
日日操日日干
|
最新精品香蕉在线
|
成人免费影片在线观看
|
亚洲丁香五月天缴情综合
|
亚洲第一男人天堂
|
欧美黄色一区二区三区
|
亚洲国产欧美视频
|
一本色道久久综合亚洲精品不
|
国产精品呻吟久久av凹凸
|
国产黄色大片在线观看
|
日本videos多次高潮
|
999精品嫩草久久久久久99
|
中国老妇xxxx性开放
|
99精品国产在热久久无毒
|
国产另类ts人妖一区二区
|
人妻无码一区二区三区欧美熟妇
|
少妇精xxxxx
精品成人毛片一区二区
|
97色伦2视频在线观看
|
在线精品自偷自拍无码
|
国产偷国产偷亚洲高清日韩
|
国产免费黄色
|
亚洲综合精品香蕉久久网
|
国产91精品久久久
|
日韩久久高清
|
熟女少妇丰满一区二区
|
国产精品夜夜爱
|
精品综合久久久久久97超人
|
ass亚洲熟妇毛耸耸pics
|
人妻被按摩到潮喷中文不卡
|
一区二区三区在线 | 日
|
色综合久久婷婷88
|
国产精品美女久久久久图片
|
日本少妇喂奶视频
|
最近中文字幕mv在线资源
|
国产日韩在线观看不卡顿
|
在线免费小视频
|
暴力调教一区二区三区
|
色乱码一区二区三区麻豆
|
亚洲一级av毛片
|
亚洲中文字幕久久精品蜜桃
|
欧美日韩高清在线播放
|
波多野结衣在线播放
|
一本一本久久a久久精品综合小说
|
欧美日韩一区二区三区不卡
|
国产农村黄aaaaa特黄av毛片
|
色哟哟网站
|
手机看片久久国产永久免费
|
欧美入口|
欧美做受高潮1
|
欧美肥婆姓交大片
|
国产精品卡一卡2卡3卡4
|
偷偷操av|
中日av乱码一区二区三区乱码
|
亚洲精品视频观看
|
毛片高清|
国产又色又爽又刺激在线观看
|
亚洲国产av无码精品色午夜
|
国产在线看片免费人成视频
|
欧美无马
|
亚洲va在线观看
|
亚洲精品www久久久
国产00高中生在线无套进入
|
久久精品欧美一区二区三区麻豆
|
日韩中文字幕成人免费视频
|
天天上天天添天天爱少妇
|
国产理论精品
|
欧美在线观看免费专区
|
桃花岛亚洲成在人线av
|
日本乱亲伦视频中文字幕
|
日产成品片a直接观看
|
亚洲乱码av一区二区
|
91国产丝袜在线
|
精品久久久久久国产潘金莲
|
亚洲人成人77777网站
|
久久久久久久香蕉
|
毛片小视频
|
91精品啪在线观看国产81旧版
|
日本欧美www|
五月天天爽天天狠久久久综合
|
国产a国产
|
av无码国产在线看岛国
|
午夜寂寞少妇
|
一区二区三区日韩视频在线观看
|
果冻传媒剧国产剧情mv在线
|
四虎精品国产永久在线观看
|
日日狠狠久久偷偷色
|
亚洲国产精品热久久
|
国产成人a在线观看网站站
国产精品天天狠天天看
|
日本在线网站
|
中文字幕亚洲区
|
国产免费丝袜调教视频免费的
|
91色啪
|
五月天婷婷色
|
国产a级黄色片
|
人人妻人人澡人人爽人人精品97
|
色综合久久久久无码专区
|
亚洲国产www
|
性激烈的欧美三级视频
|
成人欧美视频
|
欧美精品久久久久久久
|
无码少妇一区二区性色av
|
精品乱
|
96精品高清视频在线观看软件
|
国产视频一区二区三区在线
|
亚洲婷婷六月的婷婷
|
久亚洲一线产区二线产区三线产区
|
日本边添边摸免费视频网站
|
一级免费片
|
裸体性做爰免费视频网站
|
激情综合婷婷丁香五月俺来也
|
久久天天躁夜夜躁狠狠综合
|
97国精产品无人区一码二码
|
日本一区免费视频
|
麻豆av在线免费观看
|
亚洲欧美一区二
|
国产91在线播放精品91
|
国产情侣草莓视频在线
|
国产美女被遭强高潮网站不再
|
男人的天堂伊人
|
国产精品成人观看视频国产奇米
|
高清在线一区二区
|
国产伦精品一区二区三区视频新
|
久久久久久人妻精品一区二区三区
|
亚洲精品自拍
|
精品久久久三级丝袜
|
麻豆国产免费
|
亚洲精品无码人妻无码
|
国产精品无码dvd在线观看
|
精品视频一区二区三区四区
|
av在线免
|
亚洲愉拍自拍欧美精品app
|
日韩在线一二
|
浪潮av激情高潮国产精品
|
男人解开女人乳罩吃奶
|
久久亚洲男人第一av网站
|
精品一区二区三区无码免费视频
|
免费黡色av
|
日韩精品一区国产偷窥在线
|
啪视频免费
|
中年国产丰满熟女乱子正在播放
|
久久久精品中文字幕乱码18
|
国产亚洲精品久久网站
|
亚洲亚洲精品av在线动态图
|
成在人线av无码免费高潮水老板
|
国产男女做爰免费网站
|
黄色性网站
|
国产精品福利一区二区久久
|
秋霞国产午夜伦午夜福利片
|
少妇久久人人爽人人爽人人片欧美
|
一区二区三区国
|
久久成人精品
|
中文无码久久精品
|
国产真实乱对白精彩久久
|
日本三级欧美三级
|
国产视频手机在线播放
|
欧美成人中文字幕
|
亚洲国产精品综合久久2007
|
女人被爽到高潮视频免费国产
|
a在线视频v视频
|
亚洲欧美日韩一区二区
|
亚洲视屏一区
|
性欧美激情
|
亚洲性色成人av
|
日本在线视频一区二区
|
一级全黄少妇性色生活片
|
欧美巨波霸乳影院
|
2022亚洲无砖无线码天媒
|
亚洲最大黄色
|
无码国产玉足脚交极品播放
|
青青青在线播放视频国产
|
91精品91久久久中77777
|
日日骚视频|
天天爽天天干
|
成人国产精品入口
|
少妇二级淫片免费放
|
国产精品3
|
人妻有码av中文字幕久久琪
|
特一级黄色
|
久久精品国产乱子伦
|
www,久久久
|
操亚洲美女
|
亚洲中文字幕成人无码
|
青青草成人在线观看
|
五月天国产成人av免费观看
|
日韩69av|
激情av无码后入
|
欧美a天堂|
忘忧草在线社区www中国中文
|
中文 在线 日韩 亚洲 欧美
|
欧美成人黄色网
|
日韩三级视频在线
|
国产一区二区在线视频观看
|
v一区无码内射国产
|
国产亚洲第一页
|
国产一区二区三区精品在线
|
亚洲精品欧美综合四区
|
亚洲精品第一国产综合野草社区
|
亚洲综合色婷婷七月丁香
|
欧美牲交a欧美在线
|
成人免费黄色网址
|
火车卧铺高h肉辣文虐
|
久久r精品
|
亚洲精品美女久久久久网站
|
日本太爽了受不了xxx
|
免费欧美一区
|
国产成人亚洲综合色婷婷秒播
|
自拍偷拍欧美日韩
|
中日韩精品视频在线观看
|
爱情岛亚洲首页论坛小巨
|
国产伦精品一区二区三区视频孕妇
|
亚洲麻豆91传媒
|
日韩av一区二区三区在线
|
国产v亚洲v天堂无码
|
亚欧洲精品在线视频免费观看
|
精品国产乱码一区二
|
18禁又污又黄又爽的网站不卡
|
日韩人妻无码精品专区
|
精品视频91|
日韩精品无码一区二区
|
夜色资源网
|
在线观看无码av网站永久免费
|
少妇厨房愉情理伦片bd在线观看
|
日本成人动漫在线观看
|
日韩国产三级
|
黄色性网站|
91成人精品|
久久综合九色欧美综合狠狠
|
亚洲精品一区二区五月天
|
久久精品一区二区三区av
|
韩日三级视频
|
丰满少妇被猛男猛烈进入久久
|
久久资源365|
日韩一级片一区二区三区
|
999久久久免费精品国产
|
日本黄页视频
|
精品国产91久久久
|
强奷人妻日本中文字幕
|
91理论片午午伦夜理片久久
|
嫩草国产在线
|
国产一级视频免费看
|
猎艳山村丰满少妇
|
欧美巨波霸乳影院
|
色爱视频
|
美女露出粉嫩小奶头在视频18禁
|
亚洲精品一区二区三区影院
|
色视频免费观看
|
亚洲免费精品视频
|
欧美国产高清
|
美国一级大黄一片免费的网站
|
成人免费视频网址
|
邻居少妇张开双腿让我爽一夜图片
|
亚洲和欧洲一码二码区别7777
|
在线观看国产h成人网站
|
少妇精品久久久久久久久久
|
国产精品自在线拍国产
|
全部孕妇毛片
|
精品区一区二区
|
久久精品亚洲精品国产欧美kt∨
|
特级毛片aaa|
国产熟女精品视频大全
|
伊人久久亚洲
|
嫩草视频在线播放
|
国产一级特黄aaa大片评分
|
色婷婷在线精品国自产拍
|
久久久久久久久久久久久久久久久
|
欧美激情日韩精品久久久
|
九色porny丨国产首页注册
|
久久综合给久久狠狠97色
|
亚洲欧洲无码av电影在线观看
|
亚洲国产精品无码专区成人
|
免费无遮挡十八禁污污国产
|
亚洲色素色无码专区
|
69做爰视频在线观看
|
色老头在线一区二区三区
|
久久亚洲国产成人精品无码区
|
欧美人妻精品一区二区三区
|
国产做a爰片久久毛片a片美国
|
绿帽刺激高潮对白
|
色资源在线
|
又爽又黄无遮挡高潮视频网站
|
91精品国产高清91久久久久久
|
国产欧美日韩一区二区搜索
|
午夜视频精品
|
69堂成人精品视频在线观看
|
99久久国产露脸精品
|
日欧视频
|
色天天综合久久久久综合片
|
夜趣导航av国产
|
www色五月com
|
少妇精品久久久久www
|
永久免费观看美女裸体视频的网站
|
亚洲男人最新版本天堂
|
中文在线www|
亚洲成人av一区二区三区
|
久久久中文网
|
免费精品人在线二线三线
|
免费看日产一区二区三区
|
日韩精品中文字幕一区
|
亚洲区久久
|
97在线观看免费观看高清
|
国产精品98
|
精品九九人人做人人爱
|
国产精品免费视频一区二区三区
|
2017亚洲天堂最新地址
|
国产gv在线观看受被做哭
|
2023亚洲精品国偷拍自产在线
|
亚洲精品一二区
|
欧美亚洲国产一区二区三区
|
美女视频黄a视频免费全程软件
|
成熟丰满熟妇高潮xxxxx
|
中文字幕人妻熟女人妻a片
国产在线精品一区二区在线观看
|
中国少妇×xxxx性裸交
|
国产69精品久久久久乱码韩国
|
波多野结衣初尝黑人
|
亚洲中文字幕在线乱码
|
午夜福利理论片高清在线观看
|
黑人性生活视频
|
欧美xxxx精品另类
|
午夜暗香一3视频丨vk
|
国产成人最新三级在线视频
|
国产真实一区二区三区
|
久久久久久久久嫩草精品乱码
|
日韩av三级在线观看
|
少妇人妻无码永久免费视频
|
国产免费午夜a无码v视频
|
亚洲阿v天堂网2019无码
|
精品视频免费观看
|
一本色道久久99精品综合蜜臀
|
av自拍一区
|
99蜜桃在线观看免费视频网站
|
啪啪免费网
|
欧美日韩中文国产
|
国内精品视频一区二区三区
|
天天天狠天天碰天天爱
|
免费av网址在线观看
|
亚洲最新无码中文字幕久久
|
日本一卡2卡3卡4卡免费精品
|
成年女人午夜毛片免费视频
|
4色av|
国产精品久久久久9999鸭
|
亚洲国产成人在人网站天堂
|
美女在线不卡
|
午夜1000集|
99视频热|
内射无码专区久久亚洲
|
国产调教打屁股xxxx网站
|
国产乱人伦精品一区二区三区
|
亚洲一码二码三码精华液
|
天堂网男人
|
九一精品视频
|
伊人久久五月
|
黄色一级大片在线免费看国产一
|
国产色综合视频
|
国产一卡2卡3卡四卡精品免费
|
69做爰高潮全过程免
|
91久久国产自产拍夜夜嗨
|
亚洲人吸女人奶水
|
亚洲精品乱码久久久久久日本麻豆
|
av少妇
|
毛片视频免费播放
|
亚洲gv天堂无码男同在线观看
|
国产精品一区二区三区在线看
|
视频二区精品中文字幕
|
18性夜影院午夜寂寞影院免费
|
日韩精品视频一区二区在线观看
|
久久中文字幕伊人小说小说
|
久久久国产亚洲精品
|
成人免费在线视频观看
|
久久丫亚洲一区二区
|
日本在线视频www鲁啊鲁
|
视频在线观看一区二区三区
|
亚洲人成电影在线观看影院
|
97综合网
|
极品无码国模国产在线观看
|
特黄色毛片
|
欧美另类精品xxxx人妖
|
久草一区二区
|
国产视频日本
|
法国伦理少妇愉情
|
爱情岛论坛线路一区二区
|
无套内射蜜桃小视频
|
亚洲天堂最新
|
不卡的中文字幕
|
911久久香蕉国产线看观看
|
第九色|
国产成人亚洲精品无码车a
国产在线视频www色
|
337p人体 欧洲人体 亚洲
|
国产一级一级一级
|
av资源在线播放
|
日韩人妻熟女中文字幕
|
欧美在线日韩
|
热99re久久精品这里都是精品免费
|
日本少妇喂奶视频
|
69色视频
|
人妖另类巨茎双性人欧美视频
|
99精品视频在线
|
无码av无码一区二区
|
内射视频←www夜
|
亚洲一区欧美二区
|
日本嫩草影院
|
亚洲毛片一区二区三区
|
亚洲性无码av在线dvd
|
综合久久国产九一剧情麻豆
|
国产精品88久久久久久妇女
|
亚洲欧美另类成人综合图片
|
色综合色欲色综合色综合色综合r
|
丝袜一级片
|
国产精品嫩草影院桃色
|
久久天天躁狠狠躁夜夜不卡
|
成人片免费视频
|
99精品偷拍在线中文字幕
|
亚洲色啦啦狠狠网站
|
国产麻豆精品sm调教视频网站
|
欧美成人一区二区三区
|
黄色国产在线观看
|
青青青在线
|
国产精品一区二区三区视频免费
|
日韩一区二区在线视频
|
亚洲国产成人手机在线观看
|
高清无码午夜福利在线观看
|
久久久久久一级
|
四季av综合网站
|
日韩国产欧美视频
|
亚洲日本在线观看
|
欧美色图19p
|
av资源首页
|
亚洲人成无码网站久久99热国产
|
热久久精品免费视频
|
亚洲精品视频在线观看免费视频
|
国产又粗又黄又爽又硬的免费视频
|
国产精品无码一区二区在线看
|
国产九九在线观看
|
国产伦理精品一区二区三区观看体验
|
精品无码午夜福利电影片
|
欧美精品亚洲精品日韩传电影
|
性欧美牲交xxxxx视频欧美
|
成人性欧美丨区二区三区
|
在线看h网站
|
亚洲伊人久久大香线蕉av
|
日本婷婷免费久久毛片
|
国产日产欧洲无码视频无遮挡
|
玩弄丰满熟妇xxxxx性视频
|
免费看毛片在线观看
|
男同志毛片特黄毛片
|
中文字幕人妻中文av不卡专区
|
国产美女包臀裙一区二区
|
久久久久黑人强伦姧人妻
|
91亚洲成a人片在线观看www
|
欧美一区二区三区免费播放视频了
|
好吊色免费视频
|
亚州视频一区二区三区
|
国产麻豆精品一区二区三区v视界
|
5060国产午夜无码专区
|
水蜜桃亚洲精品一区二区
|
午夜小视频在线播放
|
a视频在线观看
|
伊人久久精品无码麻豆一区
|
色欲av无码一区二区三区
|
一区二区国产高清视频在线
|
嫩草影院在线观看视频
|
性欧美xxxx精品xxxxrb
|
久久爱www人成狠狠爱综合网
|
91一区二区在线观看
|
红杏亚洲影院一区二区三区
|
久久99精品免费一区二区
|
国产精品18久久久久久vr
|
亚洲精品午夜精品
|
国产精品久久福利
|
а天堂中文在线官网在线
|
欧美高清免费
|