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

主站蜘蛛池模板:
久久看片|
最新av片免费网站入口
|
美女脱了内裤张开腿让男人桶网站
|
最新亚洲卡一卡二卡三新区
|
自拍 另类 综合 欧美小说
|
日本精品免费视频
|
国产主播中文字幕
|
www国产亚洲精品久久久
|
日韩一卡2卡3卡4卡乱码网站导航
|
精品国产久
|
成人性色生活片免费看l
|
人禽伦免费交视频播放
|
青草热视频
|
欧美自拍三级
|
黄色在线播放
|
早川濑里奈av在线播放
|
天天爽天天爱
|
在线a亚洲老鸭窝天堂
|
男人的天堂久久
|
成人网免费
|
久久九九久久九九
|
一区二区三区在线 | 中国
|
午夜福利片手机在线播放
|
国产成人国产在线观看
|
免费一级做a爰片蜜桃
|
好吊妞国产欧美日韩免费观看网站
|
国产极品一区
|
亚洲激情视频网
|
免费国产乱理伦片在线观看
|
欧美色综合天天久久综合精品
|
亚洲中亚洲中文字幕无线乱码
|
欧洲美熟女乱又伦免费视频
|
男人添女人囗交做爰高潮
|
国产区视频
|
强迫大乳人妻中文字幕
|
久久久综合色
|
久久亚洲精品成人无码网站蜜桃
|
嫩草一二三|
国产福利姬精品福利资源网址
|
一区二区三区在线 | 欧洲
|
色一情一乱一伦视频
|
美女少妇翘臀啪啪呻吟网站
|
亚洲日韩v无码中文字幕
|
五月婷婷丁香激情
|
免费91看片
|
日本喷奶水中文字幕视频
|
国产精品推荐制服丝袜
|
91麻豆精品国产理伦片在线观看
|
青青青国产精品一区二区
|
色综合久久网
|
小明成人免费视频一区
|
成人性色生活片
|
动漫精品啪啪一区二区三区
|
97涩涩网
|
全国最大成人免费视频
|
国产精品无码一区二区三区
|
欧美 日韩 国产 成人 在线 91
|
精品福利一区二区三区免费视频
|
色av综合
|
暖暖 在线 日本 免费 中文
|
男男做性免费视频网
|
亚洲s码欧洲m码国产av
|
天天干视频在线观看
|
青草视频在线看
|
无码一区二区三区av免费
|
成人羞羞网站
|
巨大乳沟h晃动双性总受视频一区
|
日本熟妇japanese丰满
|
超碰人人人人人人人
|
亚洲中久无码永久在线观看同
|
www国产内插视频
|
国产精品高潮呻吟久久aⅴ码
|
天堂久久爱资源站www
|
性无码免费一区二区三区屯线
|
久久免费一区
|
手机看片精品国产福利
|
亚洲の无码国产の无码影院
|
国产精品免费久久久久软件
|
国产精品国产三级国产av′
|
色一欲一性一乱—区二区三区
|
亚洲大片av毛片免费
|
亚洲精品免费观看
|
久久久精品成人免费观看
|
美女久久久久久久久久
|
高h av
|
97视频国产
|
国内少妇高潮嗷嗷叫在线播放
|
中文字幕av无码免费久久
|
激情婷婷丁香
|
久久中文字幕亚洲精品最新
|
免费大片黄在线观看视频网站
|
国产精品综合久久久久久
|
lutube成人福利在线观看污
|
一区二区三区在线 | 日本
|
蜜月va乱码一区二区三区
|
亚洲精品nv久久久久久久久久
|
五月久久
|
婷久久|
中文在线а√天堂官网
|
日韩精品无码一本二本三本色
|
天天摸夜夜添狠狠添婷婷
|
亚洲精品福利视频
|
国产真实乱子伦清晰对白
|
国产精品网站视频
|
内谢老女人视频在线观看
|
加勒比综合在线888
亚洲va天堂va欧美ⅴa在线
|
淫少妇av
|
中文字幕在线无码一区二区三区
|
国产ts丝袜人妖系列视频
|
欧美激情中文字幕
|
人与人性恔配视频免费
|
亚洲αv久久久噜噜噜噜噜
雯雯在工地被灌满精在线视频播放
|
四虎5151久久欧美毛片
|
又黄又爽又色视频免费
|
青青青国产在线观看手机免费
|
日本污网站
|
在线你懂的视频
|
久久天天躁狠狠躁夜夜不卡
|
免费在线视频你懂的
|
亚洲爆乳成av人在线视水卜
|
成人性午夜免费视频网站
|
久久综合九色综合欧美亚洲
|
久草免费资源
|
五月天天色
|
国产黄色片视频
|
天天草比|
99精品视频免费在线观看
|
免费成人结看片
|
亚洲黄色一级大片
|
少妇性荡欲午夜性开放视频剧场
|
天堂8在线天堂资源bt
|
女人毛片a毛片久久人人
|
午夜激情黄色
|
一区二区三区四区五区视频
|
美女视频一二三区
|
中文字幕无码热在线视频
|
欧美日韩精品一区二区三区
|
又黄又爽的60分钟视频
|
狠狠激情
|
www在线观看免费视频
|
天堂中文字幕免费一区
|
色偷偷av老熟女
|
蜜桃精品视频在线观看
|
成人中文字幕在线观看
|
免费看毛片的网站
|
国产熟女乱子视频正在播放
|
99热偷拍
|
亚洲熟妇av日韩熟妇在线
|
91午夜少妇三级全黄
|
久草视频网
|
亚洲 春色 另类 小说
|
夜夜躁人人爽天天天天大学生
|
蜜臀av久久国产午夜福利软件
|
亚洲国产99精品国自产拍
|
亚洲第一视频在线
|
九九自拍视频
|
色中色成人导航
|
国产大片一区
|
亚洲精品1234|
亚洲三级国产
|
成人亚洲精品
|
国产成人精品午夜2022
|
亚欧洲乱码视频一二三区
|
另类中文字幕
|
久久久久久久久久亚洲
|
av看片在线
|
久久婷婷国产剧情内射白浆
|
美女人妻激情乱人伦
|
寡妇疯狂性猛交
|
国产视频二区三区
|
中文字幕在线乱
|
在线观看中文字幕亚洲
|
爽妇综合网
|
欧美精品xxx
|
国99精品无码一区二区三区
|
橘梨纱av一区二区三区在线观看
|
免费一级做a爰片性视频
|
亚洲国产精品无码久久电影
|
看成年女人午夜毛片免费
|
久久久久人妻精品区一
|
女人爽到高潮潮喷18禁网站
|
女人毛片视频
|
一本之道综合在线
|
999精品视频在线
|
欧美一级性视频
|
日韩人妻无码一区二区三区综合
|
好男人在线社区www在线观看视频
|
欧美人与禽z0zo牲伦交
|
国产精品99久久久
|
国精产品一品二品国在线
|
精品永久久福利一区二区
|
国产精品久久久久久久泡妞
|
玖玖资源站最稳定网址
|
jizz在线观看视频
|
亚洲另类无码专区国内精品
|
欧美日韩欧美
|
国产成人拍拍拍高潮尖叫
|
久久免费在线观看
|
久久国产色欲av38
|
亚洲精品无码一区二区三区久久久
|
午夜久久精品
|
亚洲一区综合图区
|
乱码国产丰满人妻www
|
精品无人乱码一区二区三区
|
av不卡国产在线观看
|
美国黄色一级视频
|
欧美激情黑人极品hd
|
国产成人a在线观看网站站
国产精品天天狠天天看
|
精品少妇无码av无码专区
|
国产一级淫片a
|
久草在线视频在线观看
|
免费日本黄色网址
|
欧美aaaaaa
|
成av人片在线观看www
|
国产精品性做久久久久久
|
狠狠躁日日躁夜夜躁老司机
|
无人码一区二区三区视频
|
18禁裸乳无遮挡自慰免费动漫
|
国产av国片精品
|
日韩一区二区三区无码a片
天天躁日日躁狠狠躁av麻豆男男
|
国产无遮挡又黄又爽在线观看
|
日韩黄色网
|
精品久久久中文字幕
|
国产福利一区二区三区
|
久久精品视频在线看4
|
国产波多野结衣
|
欧美v视频
|
成人免费淫片aa视频免费
|
男人的天堂中文字幕熟女人妻
|
国产精品免费久久久久影院仙踪林
|
我爱我色成人网
|
久久综合成人
|
亚洲女同在线
|
国产精品国色综合久久
|
香港三级日本三级韩国三级
|
国产边摸边吃奶边做爽视频
|
无码专区一ⅴa亚洲v天堂
|
亚洲国产精品成人久久久麻豆
|
一本大道久久久久精品嫩草
|
亚洲乱码日产精品bd在线
|
少妇又色又爽又刺激视频
|
日本大学生三级三少妇
|
国产成人亚洲综合精品
|
欧美性猛交xxxx乱大交游戏
|
2021亚洲va在线va天堂va国产
|
香蕉久久久
|
久久久免费看片
|
天堂成人
|
国产高清乱码爆乳女大生av
|
久久永久免费视频
|
欧美午夜精品一区二区蜜桃
|
av在线影视
|
久色国产sm重口调教在线观看
|
国产中文字字幕乱码无限
|
91免费国产|
成人va亚洲va欧美天堂
|
亚洲精品乱码久久久久久9色
|
欧美在线视频一区二区
|
性生交大片免费全片
|
国产乱人偷精品免费视频
|
亚洲日韩一区二区三区
|
少妇裸体淫交视频免费看
|
成年轻人网站色直接看
|
亚洲视频www
|
热久久久久久久
|
激情中文小说区图片区
|
男女性杂交内射妇女bbwxz
|
中文无线乱码二三四区
|
一道久在线无码加勒比
|
国产精品bbwbbwbbw在线
|
久久五月天婷婷
|
国产理伦天狼影院
|
91麻豆精品国产自产在线观看一区
|
国产伦精品一区三区视频
|
日韩精品无码二三区a片
|
日本妇人成熟免费视频
|
成人网6969conwww
|
国产xxx视频在线观看软件
|
毛片的视频
|
国产精品碰碰现在自在拍
|
欧美中文日韩
|
亚洲图片 欧美
|
久久色视频
|
亚洲综合图片区
|
久爱无码精品免费视频在线观看
|
国产福利专区
|
日韩中文字幕在线观看视频
|
日本网站免费
|
久久综合九色综合欧洲98
|
网红福利视频
|
国产传媒在线播放
|
亚洲人成人天堂h久久
|
亚洲综合网在线观看
|
国产精品久久久久久
|
国产网友愉拍精品视频手机
|
国产黄频
|
成人无码a∨电影免费
|
亚洲欧洲一区二区
|
黑人巨大白妞出浆
|
国产成人av在线婷婷不卡九色
|
中文字幕无码专区人妻制服
|
一区二区三区在线播放视频
|
国产在线播放av
|
久久香蕉国产线看观看亚洲小说
|
中文字幕日产无线码一区
|
影音先锋熟女少妇av资源
|
久久影音|
国产精品麻豆aⅴ人妻
|
欧美色图五月天
|
色香色香欲天天天影视综合网
|
国产好大好紧好爽好湿视频唱戏
|
在线观看免费视频一区
|
成人黄色三级
|
野花社区www高清视频
|
中国亚洲女人69内射少妇
|
日韩欧美精品有码在线
|
国产午夜精品视频在线播放
|
国内精品久久久久久中文字幕
|
美女黄色片子
|
日韩国产精品免费
|
日本电影一区二区三区
|
精品女同一区二区三区在线
|
成人在线不卡
|
播播激情网
|
国产一区啪啪
|
国模无码一区二区三区不卡
|
久久午夜福利电影
|
bb日韩美女预防毛片视频
|
丝袜熟女国偷自产中文字幕亚洲
|
久久精品影视免费观看
|
激情在线视频
|
少妇精品蜜桃偷拍高潮系列
|
国产精品女人呻吟在线观看
|
无遮挡十八禁污污网站免费
|
不卡中文字幕在线
|
国产精品久久久久久久久久妞妞
|
99ri国产精品
|
在线观看中文字幕一区
|
人摸人人人澡人人超碰97
|
午夜高清国产拍精品福利
|
亚洲免费一级视频
|
日韩国产第一页
|
麻豆日产精品卡2卡3卡4卡5卡
|
亚洲人禽杂交av片久久
|
狠狠狠狼鲁亚洲综合网
|
人成午夜大片免费视频77777
|
亚洲免费人成在线视频观看
|
老司机在线免费视频
|
av在线地址
|
1024国产视频
|
男人激烈吮乳吃奶视频片
|
精品熟女少妇a∨免费久久
久久2017国产视频
|
可以观看的av
|
亚洲欧美v国产一区二区
|
国产免费播放
|
午夜中文无码无删减
|
日韩a∨精品日韩在线观看
91丝袜国产在线播放
|
爽爽午夜影视窝窝看片
|
99午夜|
日本一区二区三区精品视频
|
精品国产va久久久久久久冰
|
激情av在线
|
少妇一级淫片免费看
|
国产精品国产av片国产
|
日韩精品网站在线观看
|
日韩国产欧美亚洲v片
|
亚洲精品无码不卡久久久久
|
一区三区不卡高清影视
|
精品 在线 视频 亚洲
|
人人揉揉揉香蕉大免费
|
亚洲精品久久久久中文第一幕
|
97超碰超碰久久福利超碰
|
亚洲.日韩.欧美另类
|
综合激情亚洲丁香社区
|
中文字幕理伦午夜福利片
|
男女午夜激情视频
|
丰满人妻精品国产99aⅴ
|
日韩色图视频
|
日批的视频
|
国模叶桐尿喷337p人体
|
丁香六月欧美
|
丰满少妇被猛烈进入试看
|
欧美日韩在线精品一区二区
|
张柏芝hd一区二区
|
国产福利短视频
|
国产又黄又大视频
|
亚洲成人免费视频
|
最新777第四色米奇影视
|
无套内谢丰满少妇中文字幕
|
国内自拍第一页
|
97国产自在现线免费视频
|
亚洲v日韩v综合v精品v
|
国产美女视频一区
|
99大香伊乱码一区二区
|
国产精品户外野外
|
三级中文字幕永久在线
|
久久久久久久久久99
|
熟女人妻高清一区二区三区
|
亚洲aⅴ无码国精品中文字慕
|
成人午夜在线视频
|
久久99精品久久久秒播
|
色欲综合久久躁天天躁蜜桃
|
免费看欧美一级片
|
性欧美老妇另类xxxx
|
亚洲深深色噜噜狠狠网站
|
风韵丰满熟妇啪啪区老熟熟女
|
久久久精品日本
|
色呦呦国产精品
|
精品一区二区三区四区外站
|
日本一区二区视频在线
|
久久久999精品视频
美女av免费看
|
制服丝袜亚洲中文欧美在线
|
www,av在线
|
亚洲在线播放
|
免费性网站
|
丰满熟妇被猛烈进入高清片
|
日本精品人妻无码77777
|
日本韩国在线
|
永久免费不卡在线观看黄网站
|
美女搞黄在线观看
|
久久精品a一国产成人免费网站
|
男女爽爽午夜18污污影院
|
亚色视频
|
高清不卡毛片
|
1000亚洲裸体人体
|
亚洲乱码日产精品bd在线看
|
久久人人爽爽爽人久久久
|
久久综合精品国产二区无码
|
天天爽天天色
|
91精品国产乱码久久久久
|
精品日产一卡2卡三卡4卡自拍
|
99国产精品99久久久久久娜娜
|
日韩亚洲欧美一区二区
|
国产精品青青在线观看爽
|
www国产精品com
|
在线黄av|
99久久一区
|
国产在线精品一区二区三区不卡
|
中文字幕在线国产
|
精品一区heyzo在线播放
|
国产97人人超碰caoprom三级
|
欧美视频二区
|
久久国产精品国产四虎90后
|
狠狠色噜噜狠狠狠
|
成年片在线观看
|
狠狠综合久久综合88亚洲爱文
|
越南女子杂交内射bbwxz
|
无限看片在线版免费视频大全
|
人人玩人人添人人澡
|
亚洲黄色a
|
一性一乱一乱一爱一频
|
日本性视频网站
|
国产无套粉嫩白浆内谢在线
|
射射射综合网
|
婷婷激情四射
|
狠狠躁夜夜躁人人爽天天69
|
亚洲三级影院
|
国产成人久久久
|
国产乱码精品一区二区三区爽爽爽
|
日韩av在线影视
|
日本一区二区精品视频
|
在线日本中文字幕
|
久热这里只有精品视频6
|
天天草天天爱
|
国产精品二区一区二区aⅴ
亚洲欧美日韩成人综合网
亚洲一区和二区
|
中国字幕一色哟哟
|
四虎亚洲精品成人a在线观看
|
国产亚洲日韩av在线播放不卡
|
饥渴的少妇和男按摩师
|
岳的好大精品一区二区三区
|
久久99精品国产.久久久久
|
两个人看的vvv在线高清
|
蜜乳av懂色av粉嫩av
|
精品久久国产
|
日本亚洲色大成网站www
|
亚洲精品久久久久久偷窥
|
日韩人妻无码精品-专区
|
日日摸天天添天天添破
|
少妇人妻偷人精品免费视频
|
26uuu亚洲电影最新地址
|
九九99无码精品视频在线观看
|
天天做天天爱
|
与子敌伦刺激对白播放
|
亚洲乱码精品
|
未满十八18禁止免费网站
|
日本少妇全身按摩做爰5
|
久久婷婷综合99啪69影院
|
国产亚洲精品合集久久久久
|
伊人91在线
|
男女搞网站
|
99欧美日本一区二区留学生
|
最新日本一道免费一区二区
|
五月婷婷激情综合网
|
福利姬液液酱喷水
|
亚洲国产成人aⅴ毛片大全密桃
|
不卡三区|
免费永久看黄神器无码软件
|
中文字幕 制服 亚洲 另类
|
麻豆网神马久久人鬼片
|
第一福利av|
羞羞视频在线免费
|
免费看黄网站在线
|
yy1111111少妇影院光屁股
|
免费人成视频在线观看不卡
|
天堂av日韩
|
嫩模啪啪|
九九热精品国产
|
国产福利第一视频在线播放
|
天堂√在线中文官网在线
|
久久国产精品大桥未久av
|
国产精品免费视频色拍拍
|
欧美日产亚洲国产精品
|
久久9久久
|
日本在线免费看
|
青青草成人在线
|
欧美亚洲日本国产黑白配
|
日本中文字幕乱码aa高清电影
|
国产在不卡免费一区二区三
|
九九久久99综合一区二区
|
91免费大片
|
成人入口
|
韩日av一区二区
|
国产av亚洲精品久久久久久小说
|
亚洲色婷六月丁香在线视频
|
午夜精品一区二区三区免费视频
|
女神呻吟娇喘高潮毛片
|
强行处破女系列中文字幕
|
亚洲国产精品激情在线观看
|
www91麻豆
|
日本久久综合久久鬼色
|
绯色av粉嫩av蜜臀av
|
精品国产一区二区三区性色av
|
亚洲国产成人片在线观看
|
亚洲免费黄色网址
|
麻豆激情视频
|
国产免费又色又爽又黄软件
|
欧美色图第一页
|
欧美一级不卡
|
免费视频www在线观看网站
|
啪啪啪毛片
|
亚洲欧美另类在线视频
|
精品国产一区二区三区久久久蜜月
|
亚洲精品久久久久久下一站
|
玩弄放荡人妻少妇系列视频
|
久久久久久精品成人鲁丝电影
|
国产麻豆 9l 精品三级站
|
中文字幕av免费观看
|
伊人久久大香线蕉av超碰演员
|
亚洲天堂av中文字幕
|
国产猛男猛女超爽免费视频网站
|
国产日韩综合一区在线观看
|
污漫在线观看
|
九九在线观看免费高清版
|
免费毛片网站在线观看
|
k8经典少妇在线观看
|
国产精品专区免费观看软件
|
99re免费视频国产在线播放
|
视频一区视频二区制服丝袜
|
久久久一本精品99久久精品66直播
|
理论片第一页
|
在线色网址
|
亚洲色偷拍区另类无码专区
|
攵女h高h1v1深与浅
|
窝窝午夜福利无码电影
|
无码日韩精品一区二区免费暖暖
|
色情无码www视频无码区小黄鸭
|
久久视频这里有精品33
|
国产免费人成网站x8x8
|
人妻中出无码一区二区三区
|
日本人妻伦在线中文字幕
|
亚洲综合精品一区二区三区
|
www久久久久|
亚洲www永久成人夜色
|
久久精品国产2020观看福利
|
中国洗澡偷拍在线播放
|
丰满少妇久久久久久久
|
国产裸体xxxx视频在线播放
|
一级做a爰片久久毛片潮喷
欧美乱人伦视频在线
|
四虎永久在线高清国产精品
|
亚洲色欲综合一区二区三区
|
最近2019中文字幕大全第二页
|
少妇一级淫片免费放
|
国色天香乱码
|
亚洲另类激情综合偷自拍图
|
给我免费的视频在线观看
|
欧州一区二区
|
亚洲成年网站青青草原
|
欧美内谢
|
久久久精品人妻无码专区不卡
|
国产一二三区在线
|
少妇真实被内射视频三四区
|
久久国产劲爆∧v内射-百度
|
a级a级高清免费美日a级大片
|
性做久久久久久久久久
|