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

主站蜘蛛池模板:
在线中文视频va
|
精品熟女少妇av久久免费软件
|
能在线观看的av
|
天堂va欧美va亚洲va老司机
|
国产精品嫩草影院桃色
|
18禁黄网站禁片无遮挡观看
|
永久免费观看美女裸体的网站
|
亚洲天天摸日日摸天天欢
|
欧美乱妇高清无乱码免费
|
日本精品久久久久中文字幕乱中年
|
亚洲精品久久av无码一区二区
|
夜夜做爰www
|
91亚洲国产成人精品一区二三
|
精品少妇人妻av久久久
|
国产精品一区在线免费观看
|
久久精品视频免费看
|
国产精品综合久久久久久
|
日日鲁夜夜视频热线播放
|
免费在线观看小视频
|
亚洲精品网站在线观看你懂的
|
91热热
|
各种少妇正面bbw撒尿
|
黄色不卡视频
|
成人性毛片
|
亚洲在线日韩
|
久久99久久99小草精品免视看
|
黑人操亚洲美女
|
少妇性xxxx性开放黄色
|
成熟丰满熟妇高潮xxxxx
|
国产小精品
|
国产日韩欧美一区二区东京热
|
性一交一伦一视一频
|
欧美老女人视频
|
国产精品久久久久久久影院
|
韩国黄色网
|
妺妺窝人体色www看人体
|
91蜜桃传媒精品久久久一区二区
|
国产亚洲精品久久久久秋霞不卡
|
jjzzjjzz欧美69巨大
|
久久中文字幕人妻熟av女蜜柚m
|
白丝乳交内射一二三区
|
亚 洲 视 频 高 清 无 码
|
成人做爰黄|
成人艳情一二三区
|
亚洲成av不卡无码无码不卡
|
香蕉综合网|
公天天吃我奶躁我的比视频
|
亚洲第一页中文字幕
|
国内精品一区二区三区
|
国产一级在线视频
|
大地资源在线播放观看mv
|
国产亚洲视频在线观看网址
|
香蕉久久人人97超碰caoproen
|
午夜福利18以下勿进免费
|
91麻豆精品91久久久久久清纯
|
麻豆av福利av久久av
|
天天干夜夜看
|
艳妇乳肉豪妇荡乳在线观看
|
国产精品色拉拉
|
国产草莓视频无码a在线观看
|
久一在线视频
|
日本丰满大乳乳液
|
日本不卡不码高清免费
|
夜爽8888视频在线观看
|
精品丰满人妻无套内射
|
天堂а√中文最新版在线
|
97国产高清
|
国产午夜免费福利
|
亚洲精品成人a在线观看
|
黄色免费在线观看视频
|
国产精品嫩草影院av
|
欧美视频中文在线看
|
人人搞人人干
|
69亚洲精品久久久蜜桃小说
|
youjizzcom欧美|
欧美精品网站在线观看
|
欧美成人h亚洲综合在线观看
|
中文字幕在线观看亚洲
|
日日热|
真人性囗交视频
|
亚洲ⅴ欧洲第一的日产av
|
日韩免费在线观看
|
永久免费毛片在线播放
|
久久久久夜
|
午夜成人性爽爽免费视频
|
又黄又爽又色成人免费体验
|
人人干干人人
|
亚洲国产人午在线一二区
|
狠狠干b|
一区二区亚洲视频
|
亚洲欧美日韩精品在线观看
|
99久久久无码国产精品免费砚床
|
男人让女人爽的免费视频
|
日本成片网
|
无码视频免费一区二三区
|
麻豆视频在线观看免费网站黄
|
啪视频网站
|
少妇高潮太爽了在线观看免费
|
在线观看中文字幕网站
|
久久综合五月丁香六月丁香
|
十八禁视频网站在线观看
|
99热久re这里只有精品小草
|
亚洲色大成网站www永久在线观看
|
美女裸体跪姿扒开屁股无内裤
|
中文字幕一二区
|
超碰免费在线
|
男人天堂色
|
日韩小视频在线观看
|
日韩精品无码一区二区三区不卡
|
四季av中文字幕一区
|
玩丰满熟妇xxxx视频
|
天天躁日日躁狠狠躁
|
aaa少妇高潮大片免费看088
|
看片网站在线观看
|
精品国际久久久久999波多野
|
黄色一级大片在线免费看产
|
国产午夜精品一区理论片飘花
|
黄色a在线观看
|
麻豆国产成人av高清在线
|
都市激情自拍
|
少妇大胆瓣开下部自慰
|
国产欧美日韩在线中文一区
|
国产午夜精品一区二区三区
|
无码专区亚洲综合另类
|
亚洲欧洲在线播放
|
国产精品成人久久电影
|
久久亚洲精品中文字幕冲田杏梨
|
伊人色综合网久久天天
|
国产无遮挡裸体美女视频
|
成人欧美在线视频
|
亚洲午夜成人精品无码色欲
|
成人区精品一区二区
|
漂亮人妻被中出中文字幕
|
91学生片黄
|
亚洲狠狠成人网
|
五月综合激情婷婷六月
|
国产乱人伦精品免费
|
国产又黄视频
|
特黄特色大片免费观看播放器
|
又黄又猛又爽大片免费
|
国产一级淫片免费放大片
|
女子spa高潮呻吟抽搐
|
国产精品无码av天天爽播放器
|
日韩内射激情视频在线播放免费
|
性xxxx视频播放免费
|
免费在线看污视频
|
精品无码成人片一区二区
|
亚精区在二线三线区别99
|
黄色一级大片在线免费看产
|
无码精品人妻一区二区三区av
|
日本边添边摸免费视频网站
|
亚洲男生自慰xnxx
|
无码av永久免费专区麻豆
|
嫩草一二三|
欧美成人免费一区二区三区视频
|
99久久久精品国产一区二区
|
国产人交视频xxxcom
|
色在线亚洲视频www
欧美视频一区二区三区
|
少妇交换做爰中文字幕
|
国内自拍欧美
|
亚洲色图视频在线
|
欧美精品久久久久久久久老牛影院
|
国产黑色丝袜高跟在线视频
|
久久久久中文字幕亚洲精品
|
日本高清在线观看视频
|
欲香欲色天天综合和网
|
国产午夜成人免费看片
|
在线观看国产精品普通话对白精品
|
被窝影院午夜无码国产
|
一本一道波多野结衣一区
|
香蕉大人久久国产成人av
|
超碰色偷偷
|
大奶一区
|
一本大道伊人av久久乱码
|
国产精品亚洲专区无码导航
|
亚洲人成网站免费播放
|
国产区一区二区三区
|
宅宅少妇无码
|
亚洲欧美高清在线
|
国产乱人对白
|
国产成人精品免费午夜app
|
亚洲精品在线视频观看
|
成人在线观看亚洲
|
丰满少妇被猛男猛烈进入久久
|
成人片在线免费看
|
国产女爽爽视频精品免费
|
夜夜春亚洲嫩草影院
|
激情小说视频在线
|
高清乱码毛片
|
成人欧美一区二区三区黑人孕妇
|
99久久精品免费视频
|
中文字幕十一区
|
青草青草久热精品视频在线播放
|
在线精品一区二区三区
|
国产九九|
一本一道av无码中文字幕麻豆
|
神马午夜国产
|
免费看大片a
|
91五月色国产在线观看
|
777色视频
|
亚洲三区在线观看无套内射
|
av在线网站观看
|
成人夜晚视频
|
免费观看性行为视频的网站
|
亚洲毛片在线观看
|
精品福利av导航
|
国产精品国产午夜免费看福利
|
精品伦一区二区三区免费视频
|
欧美日韩一级视频
|
午夜无码片在线观看影视
|
丁香狠狠色婷婷久久综合
|
国产熟女一区二区三区五月婷
|
麻豆视频网
|
97超碰超碰久久福利超碰
|
四虎精品永久在线
|
绯色av蜜臀vs少妇
|
无码视频免费一区二区三区
|
午夜第一页
|
少妇高潮伦
|
欧美又大又硬又粗bbbbb影院
|
人妻无码中文字幕
|
免费高清毛片
|
国产又粗又硬又爽的视频
|
久久精品99国产精
|
午夜精品成人一区二区视频
|
av免费视屏
|
乌克兰少妇xxxx做受野外
|
国产免费人做人爱午夜视频
|
超薄肉色丝袜一二三
|
欧美一区二区在线播放
|
男人女人午夜视频免费
|
欧美激情一区二区在线观看
|
女人被狂躁到高潮视频免费网站
|
日本爱爱网址
|
成人欧美在线
|
中文字幕av无码一区二区三区
|
色噜噜狠狠一区二区三区狼国成人
|
亚洲欧美国产成人综合不卡
|
91嫩草嫩草|
eeuss鲁片一区二区三区小说
|
日本大尺度激情做爰hd
|
国内精品久久久久影院薰衣草
|
亚洲三级黄色片
|
潘金莲激情呻吟欲求不满视频
|
亚洲一区二区三区在线观看视频
|
亚洲女人被黑人巨大进入
|
无码免费毛片手机在线
|
超碰按摩
|
国产午夜精品一区二区理论影院
|
欧美午夜成人片在线观看
|
影音先锋 成人
|
性疯狂做受xxxx高清视频
|
女仆裸体打屁屁羞羞免费
|
国产91勾搭技师精品
|
久久中文字幕人妻熟女少妇
|
一区二区三区欧美
|
欧美激情亚洲
|
亚洲爆乳成av人在线蜜芽
|
国内精品久久久久久久久久久
|
亚洲精品久久久久一区二区三区
|
国产成人精品免费视频app软件
|
插入综合网
|
欧美性猛交xxxx乱大交密桃
|
国产黄色大片视频
|
亚洲精品一区二区三区蜜臀
|
男人的天堂在线视频
|
四虎在线影院
|
欧美激情二区三区
|
日韩色在线
|
久久久久久久福利
|
国产一级视频免费播放
|
国产粉嫩嫩00在线正在播放
|
亚洲精品无码成人片
|
黄色一级免费大片
|
av电影在线观看
|
中文字幕日韩激情无码不卡码
|
狠狠撸在线
|
九九爱视频
|
永久免费的啪啪网站免费观看浪潮
|
美女视频一区二区三区
|
成人做爰100部片免费下载
|
欧美人牲交a欧美精区日韩
日韩精品一区二区三区在线观看视频网站
|
亚洲欧洲日产国码综合在线
|
国产精品色悠悠
|
欧美国产精品久久久乱码
|
欧美成人午夜在线观看视频
|
日本乱人伦aⅴ精品
|
嫩草影院ncyy入口
|
亚洲中文字幕无码天然素人
|
97超级碰碰人国产在线观看
|
丰满大乳伦理少妇
|
翔田千里一区二区
|
国产做爰全过程免费视频
|
呦女精品
|
欧美少妇网
|
日本欧美一级aaaaa毛片
|
亚洲日本网站
|
黄色的一级片
|
久久久无码精品亚洲日韩啪啪网站
|
久久精品国产99国产精品澳门
|
人人妻人人澡人人爽人人精品
|
精品视频在线观自拍自拍
|
在线国产一区
|
国产在线视频网
|
精精国产xxxx在线观看主放器
|
亚洲精品无码鲁网午夜
|
久久婷婷五月综合色高清
|
亚洲欧美日韩视频高清专区
|
国产97超碰人人做人人爱
|
亚洲一区二区三区四区五区不卡
|
无码国内精品人妻少妇
|
亚洲欧美日本国产mag
|
精品欧美h无遮挡在线看中文
|
黄色免费网站在线
|
国产欧美一区二区三区另类精品
|
av免费大全
|
亚洲图片另类图片激情动图
|
麻豆蜜桃九色在线视频
|
国产日本一级二级三级
|
国内精品视频一区二区三区八戒
|
丰满少妇毛茸茸做性极端
|
亚洲自偷自拍另类小说
|
亚洲欧美日韩在线码
|
性xxxx尼泊尔娇小视频
|
www亚洲欧美
|
中国女人内谢69xxxx
|
日韩精品无码一区二区三区不卡
|
久青青在线观看视频国产
|
亚洲综合一区二区三区葵つかさ
|
淫欲的代价k8经典网
|
亚洲国产精品无码久久一区二区
|
色久婷婷|
亚洲国产精品久久久久秋霞小说
|
欧美 日韩 国产 在线观看
|
亚洲精品国产乱码av在线观看
|
欧美肥老太牲交视频
|
亚洲欧美成人一区二区三区
|
国产成人av男人的天堂
|
日本道色综合久久影院
|
小泽玛莉亚一区二区视频在线
|
欧美性狂猛xxxxxbbbbb
|
人人草视频在线
|
av无码东京热亚洲男人的天堂
|
色羞羞|
亚洲日韩成人无码不卡网站
|
欧美自拍亚洲综合丝袜
|
777人体大胆中国人体哦哦
|
肉嫁高柳家在线看
|
成人免费淫片视频软件
|
国产精品中文字幕av
|
国产成人18黄网站
|
黄色小视频在线观看
|
少妇无码av无码一区
|
国产v在线在线观看视频免费
|
在线播放国产精品
|
真实偷拍激情啪啪对白
|
日本免费一二三区视频
|
免看一级片
|
欧美二区乱c黑人
|
人妻少妇精品中文字幕av
|
日韩经典在线
|
国产精品视频二区不卡
|
亚洲欧美在线综合图区
|
久久成人麻豆午夜电影
|
欧美激情图片
|
日本色婷婷
|
久久精品一区二区三区四区
|
胸大美女又黄的网站
|
成人免费看类便视频
|
亚洲国产精品久久久久
|
最新国内精品自在自线视频
|
亚瑟av在线
|
欧美三级一区
|
日韩欧美在线一区二区三区
|
国产色xx群视频射精
|
欧美成人免费网站
|
性插插视频
|
久久99精品久久久影院老司机
|
国产精品视频免费播放
|
欧美在线一级视频
|
亚洲国产欧美日韩图片在线人成
|
日日橹狠狠爱欧美超碰
|
欧美三区四区
|
无码人妻少妇精品无码专区漫画
|
久久精品国产自在天天线
|
天天干天天噜
|
欧美无乱码久久久免费午夜一区
|
国产精品久久久久7777
|
99视频精品全部免费免费观看
|
人妻精品动漫h无码专区
|
日本涩涩网站
|
成人综合婷婷国产精品久久蜜臀
|
国产精品理伦片
|
免费看爱爱视频
|
国产精品亚洲视频
|
久草青青视频
|
男女做爰猛烈啪啪吃奶动
|
亚洲伊人色综合www962
|
真人无遮挡18禁免费视频
|
亚洲精品国产熟女久久久
|
蜜桃国精产品二三三区视频
|
www黄色片com|
国产69精品久久久久久妇女迅雷
|
国产九一视频在线观看
|
香港日本三级亚洲三级
|
久久免费黄色
|
国产揉捏爆乳巨胸挤奶视频
|
精品高朝久久久久9999
|
青在线视频
|
天海翼一区二区三区高清在线
|
亚洲人成线无码7777
|
双腿高潮抽搐喷白浆视频
|
少妇高潮a视频
|
一级黄色的毛片
|
亚洲精品国产品国语在线
|
靠逼在线观看
|
人久久精品中文字幕无码小明47
|
小香蕉av
|
高潮毛片无遮挡高清视频播放
|
成人国产精品日本在线观看
|
成年午夜精品久久久精品
|
av在线天堂
|
全国男人天堂网
|
国产精品毛片在线完整版
|
青青草手机在线视频
|
网红主播大秀福利视频日韩精品
|
51福利国产在线观看午夜天堂
|
日本爽快片100色毛片视频
|
女性向av片在线观看免费
|
国产女人18毛片水真多1
|
国产xxx69麻豆国语对白
|
亚洲熟妇丰满多毛xxxx
|
91精品国产成人www
|
色欲久久九色一区二区三区
|
亚洲一区二区三区国产精华液
|
色资源av
|
开心激情五月网
|
少妇一晚三次一区二区三区
|
九九re6热在线视频精品66
|
国产成a人亚洲精v品无码性色
|
亚洲爆乳成av人在线蜜芽
|
波多野结衣在线免费视频
|
av剧情在线|
国产传媒麻豆剧精品av
|
成人污污视频在线观看
|
四十如虎的丰满熟妇啪啪
|
男女视频一区二区
|
久久av无码aⅴ高潮av喷吹
|
成人手机在线免费视频
|
日本不卡一区二区三区在线
|
亚洲国产成人va在线观看天堂
|
亚洲最大av一区二区三区
|
国产在线线精品宅男网址
|
狠狠色噜噜狠狠狠8888在
|
日韩欧美理论
|
性色在线视频
|
九九黄色
|
a级国产黄色片
|
久热爱精品视频在线9
|
人人狠狠综合久久88成人
|
色婷婷精品
|
国产毛片不卡野外视频
|
午夜性福利视频
|
69xx欧美|
午夜成人无码片在线观看影院
|
久久国产亚洲精品无码
|
少妇高潮喷水惨叫久久久久电影
|
99久久免费精品
|
国产成人av无码永久免费一线天
|
成人一区二区免费中文字幕视频
|
欧美人与拘性视交免费看
|
天堂av免费看
|
蜜桃视频一区二区在线观看
|
亚洲精品蜜桃久久久久久
|
黑人巨大videos极度另类
|
午夜性色一区二区三区不卡视频
|
无码欧精品亚洲日韩一区
|
另类在线视频
|
嫩草免费视频
|
亚洲乳大丰满中文字幕
|
男人边做边吃奶头视频
|
日韩爽爽视频
|
欧美福利视频
|
免费又黄又爽又猛的毛片
|
亚洲乱码尤物193yw
|
成人av图片
|
奴性白洁会所调教
|
国产又黄又大视频
|
欧美成人做爰大片免费看黄石
|
久精品视频
|
正在播放一区
|
深爱激情综合
|
青青青久久久
|
日韩精品一区二区三区亚洲综合
|
精品国产乱码久久久久久果冻传媒
|
99久久精品久久久久久清纯
|
97熟女毛毛多熟妇人妻aⅴ
|
毛片网止|
内射视频←www夜
|
999精品嫩草久久久久久99
|
午夜性无码专区
|
欧美精品黑人粗大视频
|
亚洲欧美日韩在线资源观看
|
韩国三级中文字幕hd久久精品
|
日日碰狠狠添天天爽超碰97久久
|
91精品无人成人www
|
亚洲精品毛片av
|
丁香婷婷激情国产高清秒播
|
丝袜理论片在线观看
|
成人性色生活片免费看l
|
亚洲精品无码久久久
|
精品国产乱码久久久久软件
|
先锋影音人妻啪啪va资源网站
|
激情午夜视频
|
18禁超污无遮挡无码免费动态图
|
久久久久国产精品人妻aⅴ毛片
|
无套内射chinesehd熟女
|
亚洲精品播放
|
2019国产品在线视频
|
丁香在线视频
|
国产精品视频观看裸模
|
狠狠干在线
|
欧美老人巨大xxxx做受视频
|
无码专区无码专区视频网站
|
看免费黄色毛片
|
婷婷久久综合九色综合97
|
黄在线看片免费人成视频
|
一区免费观看
|
亚洲国产一区二区波多野结衣
|
法国啄木系列成人av
|
色久婷婷
|
青草青草久热精品视频在线观看
|
狠狠色狠狠色狠狠五月
|
热久久久久久久久
|
精品一区二区国产在线观看
|
久久久久久欧美精品色一二三四
|
真实国产乱子伦精品视频
|
依依成人精品视频在线观看
|
成人免费无码精品国产电影
|
色无极影院亚洲
|
久久久精品999
|
日韩精品91亚洲二区在线观看
|
麻豆精品在线观看
|
午夜福利理论片在线观看播放
|
国产成人愉拍免费视频
|
欧美性猛片xxxxx多人伦交
|
欧美日韩亚洲精品瑜伽裤
|
日韩一级特黄
|
亚洲欧美日韩天堂
|
亚洲精品一区二区三区影院
|
亚洲中文字幕无码中文字
|
成在线人免费
|
宅男66lu国产在线观看
|
你懂的欧美
|
人妻aⅴ无码一区二区三区
www黄色av
|
国内偷窥一区二区三区视频
|
久久久精品视
|
国产精品人妻99一区二区
|
国产精品高潮呻吟久久影视a片
|
av网站大全免费
|
日本人妖xxxx
|
天天透天天干
|
成人在线看片
|
国产毛片91
|
无码一区二区三区亚洲人妻
|
欧美激情国产精品日韩
|
国产伦理一区二区三区
|
狠狠操狠狠色
|
久久久久国产精品无码免费看
|
精品国产aⅴ无码一区二区
97久久爽久久爽爽久久片
|
av黄色av|
日女人网站
|
精品国产日韩亚洲一区
|
国产性自爱拍偷在在线播放
|
伊人久久一区二区三区无码
|
亚洲一区二区三区四区在线
|
wwwyoujizzcom在线|
国产激情视频在线
|
久久男人av资源网站无码软件
|
蜜臀视频在线一区二区三区
|
国内av网站
|
国产旡码高清一区二区三区
|
人妻无码久久久久久久久久久
|
亚洲欧美日韩激情
|
少妇人妻邻居
|
国产视频在线观看网站
|
亚洲国产清纯
|
97精品尹人久久大香线蕉
|
乱人伦人妻中文字幕无码
|
91大神网址
|
寡妇av|
国产91成人
|
成人男女做爰免费视频网老司机
|
久久999视频
|