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

資訊中心
資訊中心
基于樹莓派RP2040游戲機(jī)的簡易網(wǎng)絡(luò)氣象站
2022-09-06 169

一、設(shè)計目標(biāo)

1.RP2040 Game Kit板通過提供的ESP32-S2的WiFi模塊連接網(wǎng)絡(luò)。

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

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

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

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

二、準(zhǔn)備工作

1?硬件連接

Rp2040游戲機(jī)與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. 開發(fā)環(huán)境

(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開發(fā)環(huán)境,本項(xiàng)目參考了其中的http request,uart,wifi station 例程。具體可參考官方文檔ESP-IDF 編程指南。

(2)硬禾學(xué)堂2022寒假在家練:基于樹莓派RP2040的嵌入式系統(tǒng)學(xué)習(xí)平臺,相關(guān)內(nèi)容可參考https://www.eetree.cn/project/detail/698

4.源代碼目錄結(jié)構(gòu)

(1)Rp2040

-/
   -weather_main.py 主函數(shù)
   -draw.py 畫圖部分
   -http_deal.py http數(shù)據(jù)處理部分
   -location.py 鍵盤鍵位內(nèi)容
   -button.py 按鍵
   -board.py 引腳定義
   -vga2_8x8.py字體小
   -vga1_16x32.py字體大
   -vga1_8x16.py 字體中
   -weather_picture_small/ 天氣現(xiàn)象圖片(小)
   -weather_picture_big/ 天氣現(xiàn)象圖片(大)
   -index of living/ 生活指數(shù)插圖

(2)ESP32-S2

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

5.使用說明

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

6.注意事項(xiàng)

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

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

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

三、軟件流程圖

image.png

 

 

四、實(shí)現(xiàn)過程

1?網(wǎng)絡(luò)連接

(1)WiFi連接

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

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

 

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

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

/**********wifi初始化函數(shù)**************/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();  //連接成功,發(fā)送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");  //連接失敗,發(fā)送狀態(tài)告知pico
        
    } else {
        ESP_LOGE(TAG, "UNEXPECTED EVENT");
        sendData(TAG,"Connectfail"); //連接失敗,發(fā)送狀態(tài)告知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連接成功后就立即發(fā)送http請求,失敗則返回狀態(tài)給RP2040。

(2)http請求

這里參考了esp32idf的例程~Espressifframeworksesp-idf-v4.4.1examplesprotocolshttp_request,將其中的循環(huán)任務(wù)改成了單次調(diào)動并根據(jù)不同的請求內(nèi)容增加了參數(shù)判斷,就能根據(jù)需要進(jìn)行http請求,并在發(fā)生錯誤時發(fā)送狀態(tài)給RP2040,具體內(nèi)容在http_main.c中,如下。

//HTTP請求函數(shù)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 " ;  
    
    // 組合字段構(gòu)成http請求的發(fā)送內(nèi)容,根據(jù)不同的請求進(jìn)行不同的組合
    switch (arg){
       //實(shí)時天氣,例: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;
        //生活指數(shù),例: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;
        //天氣預(yù)報,例: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格式轉(zhuǎn)化 
                        cjson_to_struct_info(mid_buf,arg);


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

        }
        
    }    }

由于要請求的內(nèi)容有三項(xiàng)(天氣實(shí)況、生活指數(shù)、天氣預(yù)報),分別對應(yīng)三個不同的請求行:

void http_get_task(void){
    memset(send_data_quene,0,sizeof(send_data_quene));
    http_get(WEATHER_CURRENT); //天氣實(shí)況
    vTaskDelay(1000 / portTICK_PERIOD_MS);  //適當(dāng)延時
    http_get(WEATHER_FORECAST); //天氣預(yù)報
    vTaskDelay(1000 / portTICK_PERIOD_MS);
    http_get(WEATHER_LIFE);     //生活指數(shù)
    vTaskDelay(1000 / portTICK_PERIOD_MS);
    ESP_LOGI(TAG,"send_data:%s",send_data_quene);
    sendData(TAG,send_data_quene);//整合發(fā)送}
實(shí)時天氣,例:http://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=beijing&language=en&unit=c
生活指數(shù),例:http://api.seniverse.com/v3/life/suggestion.json?key=SzOM2PDJp7crLA0Ug&location=haikou&language=en
天氣預(yù)報,例:http://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&days=5
所以在函數(shù)在加入判斷到底發(fā)送哪一個,相應(yīng)的請求行要進(jìn)行不同組合,在http_get()函數(shù)中做判斷,具體內(nèi)容在http.h中,如下。
#define WEB_SERVER "api.seniverse.com"#define WEB_PORT "80"#define reqUserKey "SzOM2PDJp7crLA0Ug"// #define reqLocation "Shenzhen"#define reqUnit "c"//天氣實(shí)況#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//生活指數(shù)#define WEATHER_LIFE 'L'#define WEB_PATH_LIFE_1 "/v3/life/suggestion.json?key=" reqUserKey "&location="  #define WEB_PATH_LIFE_2 "&language=en"//天氣預(yù)報#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函數(shù)進(jìn)行組合,組合好后就可以發(fā)送完整的請求行了。

而接收到的數(shù)據(jù)都是json格式,這里調(diào)用了cjson庫來進(jìn)行解碼,針對不同的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)
    {
        /*******************天氣實(shí)況**********/
        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);  //拼接發(fā)送字符串
                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請求失敗
            }
        
        }

        /*****************天氣預(yù)報*************************/
        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請求失敗
            }

        }
        
         /**************************生活指數(shù)****************************************/
        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] == '

主站蜘蛛池模板:
黄色工厂这里只有精品
|
亚洲美女激情视频
|
成人无码精品一区二区三区亚洲区
|
尤物蜜芽国产成人精品区
|
粉嫩粉嫩一区二区三区在线播放
|
少妇厨房愉情理9伦片视频
97视频在线免费观看
|
亚洲国产999|
青青草91久久久久久久久
|
爱情岛论坛亚洲品质自拍视频
|
精品久久久噜噜噜久久
|
亚洲一页|
日韩在线视频免费观看
|
日本捏奶吃奶的视频
|
久久久精品视频在线观看
|
97se狼狼狼狼狼亚洲网
|
欧美人与性动交α欧美精品图片
|
久久天堂av综合色无码专区
|
亚洲精品久久久久午夜福禁果tⅴ
|
无码精品a∨在线观看十八禁软件
|
亚洲欧美洲成人一区二区
|
天天摸天天做天天爽水多
|
国产午夜手机精彩视频
|
亚洲色素色无码专区
|
精品无码三级在线观看视频
|
91av资源在线
|
99精品一级欧美片免费播放
|
亚洲午夜伦理
|
欧美日韩在线亚洲综合国产人
|
国产成年免费视频
|
歪歪爽蜜臀av久久精品人人
|
免费成人在线网站
|
动漫av在线免费观看
|
黄色毛片视频免费
|
亚洲 欧美 国产 制服 动漫
|
国产 欧美 亚洲 中文字幕
|
玩弄中年熟妇正在播放
|
午夜窝窝
|
鲁丝久久久精品av论理电影网
|
日韩乱码人妻无码中文视频
|
无码h肉在线观看免费一区
特黄色一级片
|
黄网站欧美内射
|
精品人妻无码一区二区三区蜜桃一
|
成人h猎奇视频网站
|
xxxxx欧美妇科医生检查
|
欧美大屁股熟妇bbbbbb
|
av潮喷大喷水系列无码
|
色欲av无码一区二区人妻
|
一区二区精品视频
|
91超碰caoporm国产香蕉
|
国产免费1卡二卡三卡四卡
亚洲视频免费在线播放
|
女总裁呻吟双腿大开sm视频
|
国产欧美第一页
|
国产精品亚洲а∨天堂2021
|
精品国产免费观看
|
国产吞精囗交免费视频
|
av三级网站
|
在线视频导航
|
色综合影视
|
欧美成人看片一区二区三区尤物
|
成人黄色免费网站
|
91桃色视频|
国内高清久久久久久
|
在线观看成人高清
|
91嫩草视频在线观看
|
成人在线免费av
|
又大又长粗又爽又黄少妇毛片
|
日韩欧美一二三
|
国产精品国产三级国产aⅴ入口
|
亚洲第一视频在线观看
|
黄色毛片毛茸茸
|
国产 | 欧洲野花视频天堂视频p
|
欧美饥渴少妇xxxxx性
|
久久久噜噜噜久久久精品
|
中文字幕免费观看视频
|
国产精品自在在线午夜出白浆
|
日韩少妇精品av一区二区
|
99视频在线
|
日韩欧美亚洲精品
|
色偷偷色噜噜狠狠网站年轻人
|
国产95在线 | 亚洲
|
亚洲自拍偷拍综合
|
亚洲人成人7777在线播放
|
五月婷婷丁香花
|
亚洲国产人午在线一二区
|
性瘾荡乳h古代
|
国产成人99久久亚洲综合精品
|
男人吃奶视频
|
欧美阿v高清资源在线
|
好吊射视频988gaocom
|
久久不见久久见www电影免费
|
国产视频一区在线播放
|
国产成人不卡
|
久久综合九色综合欧美98
|
99re久久资源最新地址
|
女人裸体特黄做爰的视频
|
丰满的少妇被猛烈进入白浆
|
第一福利av
|
少妇富婆高级按摩出水高潮
|
91在线精品观看
|
忘忧草社区在线资源www
|
鲁丝片一区二区三区
|
成人免费影片
|
国产美女特级嫩嫩嫩bbb片
|
99色网站|
亚洲成av人综合在线观看
|
777一区二区
|
欧美一区二区三区久久
|
色婷婷在线精品国自产拍
|
成人喂奶露着大乳
|
国产精品视频分类精品
|
日韩国产人妻一区二区三区
|
国产精品天天看
|
久久老子午夜精品无码
|
奇米影视奇米色777欧美
|
免费观看日韩毛片
|
嫩草影院中文字幕
|
久久天天躁狠狠躁夜夜网站
|
一本大道久久
|
亚洲狼人社区
|
国产成人综合自拍
|
亚洲欧洲日产喷水无码
|
双性受惨叫扩张调教虐宫h
少妇视频一区
|
任你躁久久精品6
|
麻豆chinese新婚xxx
|
欧美一区二区三区久久综
|
关之琳三级做爰
|
国产性×xxx盗摄xxxx
|
青青青在线观看视频
|
手机午夜电影神马久久
|
精品国产国语对白久久免费
|
亚洲国产精品无码久久网速快
|
久久精品欧美一区二区三区麻豆
|
骚女人干起来舒服视频在线
|
天天躁人人躁人人躁狂躁
|
久久精品99av高久久精品
|
亚洲aⅴ在线无码播放毛片一线天
|
精品欧美小视频在线观看
|
久久被窝亚洲精品爽爽爽
|
边啃奶头边躁狠狠躁3p
|
亚洲美女性生活
|
成人午夜视频网站
|
成人av一区二区三区
|
日韩免费人妻av无码专区蜜桃
|
香蕉成人臿臿在线观看
|
60岁欧美乱子伦xxxx
|
一本色道久久综合亚洲精品不
|
国产精品美女一区二区
|
欧美日批
|
最大胆裸体人体牲交免费
|
在线观看91精品国产入口
|
污网站免费在线观看
|
熟女啪啪白浆嗷嗷叫
|
四影虎影免费在线观看
|
日韩精品在线观看一区
|
亚洲中文波霸中文字幕
|
色综合久久久久综合体桃花网
|
毛片你懂的|
国语高潮无遮挡无码免费看
|
亚洲国产成人福利精品
|
九九精品视频在线观看
|
熟女少妇a性色生活片毛片
成人免费毛片高清视频
|
97涩国一产精品久久久久久久
|
手机看片福利永久
|
九九在线免费视频
|
久久久久久在线观看
|
天天看夜夜爽
|
亚洲成网
|
成人免费大片黄在线观看com
|
国产亚洲精品久久久久婷婷图片
|
亚洲精品伦理熟女国产一区二区
|
日韩国产精品人妻无码久久久
|
婷婷综合缴情亚洲狠狠
|
www.猫咪av
|
欧美视频一区二区在线观看
|
日韩欧美黄色
|
免费av网址大全
|
中文av在线天堂
|
亚洲精品中文字幕无码av
|
狠狠色噜噜狠狠狠狠黑人
|
精品一区二区三区无码免费直播
|
91精品日产一二三区乱码
|
无码国产精品一区二区高潮
|
欧美色图在线视频
|
日韩av网站在线播放
|
夜夜躁狠狠躁日日躁202
|
久久人人爽天天玩人人妻精品
|
无码毛片视频一区二区本码
|
国产成人av一区二区三区
|
日韩激情视频一区二区
|
国产精品久久久久久av福利
|
欧美拍拍视频免费大全
|
国产欧美视频一区二区
|
九九爱国产
|
久久青青草原国产精品最新片
|
亚洲激情五月
|
九久久|
日本黄漫动漫在线观看视频
|
无码人妻精品一二三区免费
|
狠狠色狠色综合曰曰
|
国产91一区二区三区
|
97久久超碰国产精品旧版
|
成人精品毛片国产亚洲av十九禁
|
精品日韩欧美一区二区在线播放
|
国产无遮挡又黄又爽奶头
|
欧美人动与zoxxxx乱
|
太粗太深了太紧太爽了动态图
|
麻豆国产av穿旗袍强迫女佣人
|
国产精品看高国产精品不卡
|
中文字幕人妻无码系列第三区
|
中文字幕免费在线观看视频
|
欧州一区二区
|
a在线看|
超碰在线综合
|
美州a亚洲一视本频v色道
|
欧美激情在线一区二区三区
|
国内精品久久久久久久影院
|
av在线播放网
|
国产国拍精品av在线观看
|
亚洲第一成肉网
|
国产精品久久久久久久竹霞
|
亚洲人交配视频
|
乌克兰极品少妇xxxx做受小说
|
国产无遮挡a片又黄又爽
|
性生生活又硬又黄又爽
|
亚洲色欲色欲www在线观看
|
欧美一区二区三区影院
|
日本网站免费
|
暖暖视频在线观看免费观看高清中文
|
国产私拍福利精品视频
|
亚州中文字幕午夜福利电影
|
国产女女精品视频久热视频
|
被公侵犯中文字幕在线观看
|
性色av 一区二区三区
|
熟妇激情内射com
|
日韩精品久久久久久久的张开腿让
|
亚洲欧美在线成人
|
丝袜一级片
|
国产911情侣拍拍在线播放
|
女人久久久久
|
亚洲专区路线一路线二高质量
|
欧美资源|
丰满人妻精品国产99aⅴ
|
97久久人人超碰超碰窝窝
|
西西人体444www高清大胆
|
h视频国产
|
成年人国产
|
亚洲影视精品
|
国产精品调教视频一区
|
久久18禁高潮出水呻吟娇喘
|
国产91小视频
|
永久免费精品精品永久-夜色
|
亚洲美女在线播放
|
狠狠综合久久av一区二区
|
亚洲综合色吧
|
a一区二区三区乱码在线 | 欧洲
|
深夜成人在线观看
|
三级黄色图片
|
夜夜夜影院
|
亚洲高清国产拍精品动图
|
国语自产少妇精品视频蜜桃
|
亚洲伊人精品酒店
|
日本无遮挡边做边爱边摸
|
最新中文字幕在线视频
|
免费一级做a爰片久久毛片潮
|
国产精品99久久久久久久久
|
精品日韩一区二区三区
|
夜夜躁狠狠躁日日躁
|
天天干夜操
|
av生活片
|
国产精品内射视频免费
|
制服丝袜av无码专区完整版
|
国产巨大爆乳在线观看
|
91大神视频在线播放
|
欧美日韩国产成人在线观看
|
97久久超碰成人精品网页
|
日本欧美一区二区三区高清
|
国产精品色网
|
国产午夜福利100集发布
|
成人黄色网址在线观看
|
亚洲成av人片在线观看无下载
|
国产三级精品视频
|
小明www永久免费播放平台
|
成人三级在线视频
|
在线观看av毛片
|
国产成人福利在线视频播放下载
|
欧美激情一区二区
|
国产午夜精品福利视频
|
欧美成人精品手机在线
|
潮喷大喷水系列无码久久精品
|
日韩和的一区二区
|
久久久久9
|
4399午夜理伦免费播放大全
|
欧美人与动牲猛交a欧美精品
|
国产欧美日韩中文字幕
|
精品一区二区在线观看视频
|
亚洲精品无码永久中文字幕
|
欧美骚少妇
|
香蕉久久a毛片
|
亚洲人成电影综合网站色www
|
亚洲精品狼友在线播放
|
欧美人与禽猛交狂配
|
99热精品在线观看
|
国产精品办公室沙发
|
免费无码高h视频在线观看
天天草天天爱
|
欧美图片一区二区
|
精品h动漫无遮挡在线看中文
|
久久国产乱子伦精品免费乳及
|
人妻少妇乱子伦精品无码专区电影
|
国产精品熟女人妻
|
97人人爱
|
先锋影音亚洲
|
av动漫网站
|
伊人蕉久影院
|
亚洲国产无线乱码在线观看
|
综合无码成人aⅴ视频免费
久久久性高潮
|
无码专区 丝袜美腿 制服师生
|
成人片黄网站色大片免费观看
|
日韩免费一二三区
|
国产亚洲精品aaaa片小说
|
久久久精品人妻一区二区三区
|
jiz亚洲
|
视频一区 中文字幕
|
国产一区二区亚洲
|
国产乱人伦精品一区二区在线观看
|
日韩经典午夜福利发布
|
久久论理
|
少妇无码av无码去区钱
|
18禁超污无遮挡无码网址极速
|
欧日韩在线
|
欧洲亚洲精品久久久久
|
狠狠干网站
|
8x8ⅹ在线永久免费入口
|
国产精品毛片久久久久久久
|
国产精品国产三级国产专区51区
|
欧美一级淫片免费视频魅影视频
|
深爱激情av
|
亚洲伊人久久大香线蕉av
|
97人人模人人爽人人喊网
|
国产精品_国产精品_k频道w
|
91插插插视频
|
97在线成人国产在线视频
|
无码人妻一区二区三区在线视频
|
免费又黄又爽又色的视频
|
国产成人亚洲精品狼色在线
|
日韩人妻中文无码一区二区七区
|
美女赤身免费网站
|
久久网伊人
|
丰满人妻一区二区三区无码av
|
久久99精品久久久秒播
|
夹得好湿真拔不出来了动态图
|
国产美女自卫慰水免费视频
|
亚洲天堂久久精品
|
强伦人妻一区二区三区视频18
|
精品一区二区三区自拍图片区
|
国产偷窥熟妇高潮呻吟
|
欧美猛交xxx
|
欧美资源在线
|
欧美性做爰片免费视频看
|
久久久久青草线蕉亚洲
|
日韩人妻无码一区二区三区俄罗斯
|
国产二区一区
|
日韩少妇乱码一区二区三区免费
|
日韩毛片网站
|
无码专区天天躁天天躁在线
|
无码中文字幕av免费放
|
亚欧洲乱码视频
|
久草在线资源网
|
无码人妻精品一区二区三区在线
|
亚洲爆乳无码精品aaa片蜜桃
|
91嫩草嫩草
|
亚洲涩涩在线
|
欧美成在线
|
日韩人妻中文无码一区二区七区
|
亚洲中文字幕久久精品无码喷水
|
www久久久久久久
|
久久精品国语
|
丰满岳乱妇在线观看中字无码
|
狠狠躁天天躁中文字幕
|
国产毛片毛片毛片毛片毛片毛片
|
夜鲁夜鲁很鲁在线视频 视频
|
国产色播av在线观看
|
日韩精品一卡2卡3卡4卡新区视频
|
果冻国产精品麻豆成人av电影
|
国产精品人妻一码二码
|
粉嫩欧美一区二区三区高清影视
|
久久亚洲一区二区三区明星换脸
|
欧洲色视频|
九九三级
|
亚洲日本乱码中文在线电影
|
啪啪激情婷婷久久婷婷色五月
|
爆乳熟妇一区二区三区
|
国产区视频|
久久99精品国产.久久久久
|
中文日产无乱码av在线观
|
太深太粗太爽太猛了视频免费观看
|
天啪
|
久久久人人人婷婷色东京热
|
野外性史欧美k8播放
|
亚洲精品无码不卡在线播放he
|
国产成人在线观看免费网站
|
日韩精品无码成人专区
|
日韩大片在线永久免费观看网站
|
日剧再来一次第十集
|
国产91观看
|
人妻内射一区二区在线视频
|
国产精品一区波多野结衣
|
成年人免费av
|
日韩欧美二区
|
国产成人精选在线观看不卡
|
中文字幕一区二区三区在线播放
|
国产精品国产精品国产专区蜜臀ah
|
农村少妇无套内谢粗又长
|
国产三级精品三级男人的天堂
|
wwwxxxx国产|
第四色影音先锋
|
两男一前一后cao一女
|
狠狠操伊人
|
在线观看高清av
|
午夜福利毛片
|
午夜福利无遮挡十八禁视频
|
国产精品69久久久
|
熟女人妻aⅴ一区二区三区60路
|
av中文字幕无码免费看
|
人妻系列无码专区久久五月天
|
色亚洲视频
|
国产产无码乱码精品久久鸭
|
亚洲第一香蕉网
|
久久成人成狠狠爱综合网
|
六十路熟妇乱子伦
|
www亚洲视频
|
国产精品丝袜一区二区三区
|
嫩草国产在线
|
中文字幕免费高清
|
成人午夜大片
|
午夜男女无遮挡拍拍视频
|
国内精品免费视频自在线拍
|
欧美性猛交久久久乱大交小说
|
亚洲欧美18v中文字幕高清
|
欧美大黑帍在线播放
|
欧美国产在线看
|
黄色av免费看
|
欧美黄色一区二区三区
|
欧美激情午夜
|
免费看成人欧美片爱潮app
|
国产精品久久久久毛片
|
激情在线网站
|
亚洲精品成人网久久久久久
|
中国黄色毛片
|
免费啪视频在线观看视频网页
|
高清不卡视频
|
yellow免费在线观看
|
国产欧美一区二区精品性
|
五十高熟中文
|
午夜av一区二区三区
|
男人扒开女人腿做爽爽视频
|
最新国产精品好看的精品
|
天天色天天干天天色
|
狠色狠狠色狠狠狠色综合久久
|
国产精品久久久久久久午夜片
|
www.亚洲精品
|
免费在线日本
|
精久国产一区二区三区四区
|
亚洲一区国产
|
国产精品亚洲二区在线看
|
欧美高潮喷水大叫
|
漂亮人妻被中出中文字幕
|
亚洲精品午夜久久久伊人
|
国产精品白浆在线观看无码专区
|
精品国产乱码久久久久久久
|
一本一道a∨波多野极衣
|
成人网站免费看黄a站视频
91亚色视频在线观看
|
√在线新版天堂资源
|
欧美性视频在线播放
|
中文字幕网址在线
|
久久午夜羞羞影院免费观看
|
av免费高清
|
成年人爱爱视频
|
亚洲最大成人网4388xx
|
真实国产乱子伦对白视频不卡
|
黄色一级大片在线免费看产
|
日韩精品毛片
|
天天射一射
|
黑人强伦姧人妻久久
|
成人动漫久久
|
777777av|
精品一卡2卡三卡4卡乱码理论
|
亚洲成色在线综合网站免费
|
猫咪av成人永久网站在线观看
|
亚洲中文字幕一二三四区苍井空
|
国产中年夫妇交换高潮呻吟
|
亚洲欧美伊人久久综合一区二区
|
蜜桃av少妇久久久久久高潮不断
|
国产 精品 丝袜
|
天堂在线一区二区
|
亚洲乱亚洲乱妇无码麻豆
|
巨肉高h文从头做到尾肉短文
|
欧美日比视频
|
又色又爽又黄的美女裸体网站
|
国产日韩制服丝袜第一页
|
美女内射毛片在线看
|
白嫩初高中害羞小美女
|
老熟仑妇乱一区二区
|
少妇被粗大的猛烈进出69影院一
|
亚洲精品乱码久久久久久蜜桃欧美
|
aaaaa国产欧美一区二区
|
国产福利视频一区二区在线
|
一区精品在线
|
国产熟妇精品高潮一区二区三区
|
欲妇荡岳丰满少妇岳
|
色噜噜狠狠色综合久
|
国产成人精品国内自产拍免费看
|
18未满禁止免费69影院
|
日韩成人av网址
|
www久久com|
热热色原网址
|
麻豆av在线看
|
亚洲欧美大片
|
蜜臀久久99精品久久久久久做爰
|
色噜噜一区二区三区
|
性欧美18一19性猛交
|
风流老熟女一区二区三区
|
又粗又硬又黄又爽的视频永久
|
国产一区二区在线精品
|
久久精品国产精品国产精品污
|
欧美成人黑人xx视频免费观看
|
欧美伊人久久大香线蕉综合
|
亚洲专区路线一路线二高质量
|
日本sm/羞辱/调教/捆绑视频
|
九九久久久久
|
成年18网站免费进入夜色
|
天天噜夜夜噜
|
久久亚洲色www成人网址
|
瑟瑟综合
|
国产一级片免费在线观看
|
中文字幕一区二区三区中文字幕
|
国产欧美一区二区三区国产幕精品
|
亚洲精选91
|
亚洲免费在线视频观看
|
天天色天天操天天
|
国内精品人妻无码久久久影院蜜桃
|
日韩中文字幕一区二区
|
亚洲日韩国产一区二区三区
|
欧美卡一卡二
|
日韩精品成人av在线观看
|
99精品久久久久中文字幕
|
大波大胸video巨乳日本
|
久久激情网站
|
国产精品亚洲第一区焦香味
|
国产一级美女
|
www.色com|
18禁美女裸体无遮挡免费观看国产
|
国产精品久久久久久久久果冻传媒
|
国产xxxx裸体xxx免费
|
国产高清不卡无码视频
|
亚洲人av高清无码
|
最新国产精品久久精品
|
国色天香婷婷综合网
|
免费观看一级视频
|
偷拍久久久|
国产偷窥熟女精品视频
|
一线毛片|
少妇又色又紧又爽又高潮
|
久久伊人一区
|
漂亮人妻被黑人久久精品
|
一区影视|
曰本丰满熟妇xxxx性
|
亚洲欧美日韩视频高清专区
|
69久久夜色精品国产69乱青草
|
无人区乱码一区二区三区
|
男女做爰猛烈啪啪吃奶图片
|
毛片网站视频
|
亚洲国产精品久久久久爰
|
美女翘臀少妇啪啪呻吟流水
|
国产精品av免费观看
|
第一亚洲中文久久精品无码
|
午夜一区二区亚洲福利vr
|
韩国黄色片网站
|
久久www免费人成_看片中文
|
欧美日本免费一区二区三区
|
午夜男人天堂
|
嫩草一区二区三区
|
亚洲加勒比久久88色综合
|
国产精品原创巨作av女教师
|
精品国产乱码久久久久久竹菊影视
|
久久不射网站
|
亚洲 欧美 制服 综合 另类
|
亚洲欧美午夜理论电影在线观看
|
西西人体自慰扒开下部93
|
国产成年人视频
|
五月婷婷丁香六月
|
在线激情小视频
|
国产女主播喷水视频在线观看
|
精品一卡2卡三卡4卡乱码精品视频
|
亚洲精品乱码久久久久红杏
|