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

資訊中心
資訊中心
基于樹莓派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] == '

主站蜘蛛池模板:
日韩精品一区二区三区中文不卡
|
99er6免费热在线观看精品
|
麻豆国产精品va在线观看不卡
|
欧亚在线视频
|
国产中文字幕一区
|
国产免费无遮挡吸乳视频在线观看
|
波多野结衣一区二区三区
|
中文字幕天天躁日日躁狠狠躁
|
亚洲色图欧美在线
|
成人免费视频免费观看
|
中文字幕在线二区
|
国产av丝袜一区二区三区
|
亚洲欧美日韩精品成人
|
久久精品亚洲精品国产欧美kt∨
|
久久亚洲精品ab无码播放
|
日本在线网址
|
久久婷婷五月综合色俺也想去
|
麻豆三级在线观看
|
中文字幕无码中文字幕有码a
|
一本久道久久
|
国产精品久久一区
|
久久精品国产99国产精品
|
久久久久久国产精品无码超碰
|
日韩高清亚洲日韩精品一区二区三区
|
亚欧洲乱码视频一二三区
|
久久精品导航
|
大香大香伊人在钱线久久
|
国产成人av无码永久免费一线天
|
不卡av中文字幕手机看
|
久久91精品国产91久久跳
|
春色校园亚洲愉拍自拍
|
在线永久看片免费的视频
|
欧美日韩精品一区二区三区不卡
|
亚洲手机看片
|
亚洲欧美91|
中文字幕久久熟女人妻av免费
|
一边添奶一边添p好爽视频
国产真实乱对白精彩久久
欧美激情偷拍
|
岬奈奈美女教师中文字幕
|
国产又粗又猛又爽的视频a片
|
色爱综合激情五月激情
|
在厨房拨开内裤进入在线视频
|
婷婷久久久
|
性开放少妇xxxxⅹ视频蜜桃
|
亚洲一区二区免费在线观看
|
岳的好大精品一区二区三区
|
国产欧美在线播放
|
久久久久国产精品人妻aⅴ毛片
|
免费99精品国产自在现线
|
手机在线免费看av
|
成人网18免费网站
|
日韩中文无
|
日本人毛片
|
亚洲男人天堂网
|
日本一区二区在线免费
|
国产毛a片久久久久无码
|
不戴套各种姿势啪啪高素质
|
97国产色伦在色在线播放
|
九九色精品|
两个黑人大战嫩白金发美女
|
亚洲aⅴ男人的天堂在线观看
|
欧美久久久久久久久久久久
|
一个人看的www免费视频在线观看
|
五月婷婷,六月丁香
|
高清av网址
|
被窝的午夜无码福利专区
|
激情久久婷婷
|
国产欧美一级二级三级在线视频
|
日本老头xxxx视频
|
久久久精品中文字幕
|
麻豆tv在线观看
|
成人无码av片在线观看蜜桃
|
午夜天堂
|
日韩国产二区
|
夜夜爽夜夜叫夜夜高潮漏水
|
亚洲国产另类精品
|
国产乱码人妻一区二区三区四区
|
成人国产精品蜜柚视频
|
天堂中文最新版在线中文
|
热久久国产欧美一区二区精品
|
久久亚洲精品无码爱剪辑
|
国产亚洲精品无码成人
|
超碰97人人做人人爱亚洲
|
亚洲最大av网站在线观看
|
国产又粗又猛又爽又黄的
|
97久久综合亚洲色hezyo
|
美国一级黄色毛片
|
一区二区视频日韩免费
|
人妖和双性人xxxxx
|
亚洲免费av一区二区
|
国产九区
|
久久尤物免费一区二区三区
|
国产精品免费一区二区三区四区
|
一本一本久久a久久精品牛牛影视
|
中文日韩av
|
亚洲成av人片在线观看麦芽
|
国产成人精品a视频一区
|
久久久久影院色老大2020
|
免费av网站在线
|
国产精品久久久爽爽爽麻豆色哟哟
|
毛片手机在线
|
岛国不卡
|
国产精品亚洲日韩欧美色窝窝色欲
|
日本又黄又爽又无遮挡的视频
|
一本一久本久a久久精品综合
|
国产寡妇亲子伦一区二区三区
|
91色在线视频
|
欧美亚洲综合网
|
中日韩av亚洲aⅴ高潮无码
|
av永久
|
视频在线一区二区三区
|
97精品人妻一区二区三区香蕉
|
国产午夜夜伦鲁鲁片
|
成人夜夜
|
91亚洲国产精品
|
美女视频黄a视频全免费观看
|
韩国三级l中文字幕无码
|
手机看片福利永久
|
国产黑丝啪啪
|
免费看欧美中韩毛片影院
|
久久久久久久久久久小说
|
国产bbbbbxxxxx精品
|
亚洲 欧洲 日韩 综合 第一页
|
久久亚洲sm情趣捆绑调教
|
久久精彩免费视频
|
久久精品国产中国久久
|
日本免费更新一二三区不卡
|
av网站的免费观看
|
九九热视频在线观看
|
国产精品久久久久久不卡盗摄
|
免费国产成人午夜福利电影
|
精品一区二区不卡
|
亚洲欧美韩国
|
久久va|
日韩人妻无码中文字幕一区
|
久久久中日ab精品综合
|
精品中文字幕一区
|
日本高清视频免费观看
|
av在线影视
|
日本黄h兄妹h动漫一区二区三区
|
麻豆网神马久久人鬼片
|
黄色视网站
|
超碰在线观看免费
|
人妻无码视频一区二区三区
|
久久久久xxxx
|
杨思敏全身裸体毛片看
|
亚洲欧美国产双大乳头
|
成人99一区二区激情免费看
|
久久老司机
|
一夲道无码人妻精品一区二区
|
国产资源在线免费观看
|
日韩精品中文字幕久久臀
|
最新国自产拍av
|
亚洲老熟女性亚洲
|
亚洲成人网页
|
深夜福利网站
|
人妻一本久道久久综合久久鬼色
|
青青草原综合网
|
免费观看一区二区三区视频
|
69式囗交免费视频
|
国产极品美女高潮无套小趴菜
|
亚洲欧美丝袜精品久久
|
少妇aaaa
|
狼人青草久久网伊人
|
亚洲伊人成无码综合影院
|
欧美日韩中文在线视频
|
天天插美女
|
精品国产中文字幕在线视频
|
日本一卡2卡三卡4卡免费网站
|
亚洲精品无码专区久久
|
亚洲精品熟女国产
|
91视频免费网站
|
做爰xxxⅹ高潮69网站
|
亚洲春色av无码专区在线播放
|
可播放的亚洲男同网站
|
狠狠狠狼鲁亚洲综合网
|
亚洲第一无码精品一区
|
欧美精品在线视频
|
国产 欧美 日韩 在线
|
久久996re热这里有精品
|
成人1啪啪
|
中文字幕有码无码人妻在线
|
粉嫩av一区二区在线播
|
婚后日日高h文孕
|
免费一区区三区四区
|
吃奶呻吟张开双腿做受在线播放
|
四川少妇大战4黑人
|
毛片在线免费观看网址
|
麻豆影视在线免费观看
|
女职员的丝袜 中文字幕
|
国产欧美a
|
国产中文区二幕区2021
|
久久综合亚洲鲁鲁五月久久
|
色亚洲视频
|
制服丝袜中文字幕在线
|
天天影视涩香欲综合网
|
色偷偷888欧美精品久久久
|
夜夜精品视频一区二区
|
免费少妇荡乳情欲视频
|
国产又大又黄又猛
|
韩国亚洲精品a在线无码
|
亚洲免费网站在线观看
|
国产高清不卡无码视频
|
大地资源网第二页免费观看
|
97国产情侣爱久久免费观看
|
成人欧美一区在线视频
|
国产精品51
|
性饥渴艳妇性色生活片在线播放
|
亚洲性xx
|
久久午夜福利电影
|
日韩中文字幕第一页
|
与子敌伦刺激对白播放
|
四虎成人精品永久免费av九九
|
欧美放荡性医生videos
|
欧美丰满老熟妇乱叫
|
亚洲精品乱码久久久久久动图
|
国产精品中文久久久久久久
|
久在线观看福利视频69
|
五月天综合激情
|
国产精品久久久一区二区三区网站
|
久久黄色片视频
|
99热在线观看精品
|
欧美日韩国产高清视频
|
久久伊人蜜桃av一区二区
|
无码国产精品一区二区免费i6
|
粉嫩av一区二区在线播放免费
|
dy888亚洲精品一区二区三区
|
亚洲一区二区三区av激情
|
国产精品久久久久久99人妻精品
|
国产自产才c区
|
亚洲国产成人无码专区
|
97国产超碰
|
亚洲精品乱码久久久久久蜜桃图片
|
久久久999视频
|
日本亲子乱子伦xxxx50路
|
国产色精品vr一区二区
|
久久一区二区三区四区五区
|
久久综合综合久久av在钱
|
伊人久久精品一区二区三区
|
挺进朋友人妻雪白的身体韩国电影
|
韩国成人在线视频
|
亚洲男人av天堂午夜在
|
国产精品免费看久久久无码
|
2021自拍偷在线精品自拍偷
|
五月在线
|
一级特黄色大片
|
洗澡被公强奷30分钟视频
|
国产精品jizz在线观看美国
|
337p大尺度啪啪人体午夜
|
午夜精品久久久久久久99热额
|
国产成人乱码一二三区18
|
首尔之春在线看
|
亚洲熟妇丰满xxxxx小品
|
高清同性男毛片
|
色婷婷久久一区二区三区麻豆
|
国产精品无码一区二区三区免费
|
日本黄页网站免费大全
|
久久久无码精品国产一区
|
在线理论片
|
中国极品少妇xxxxx
|
熟女人妇 成熟妇女系列视频
|
xxxx日本少妇
|
性欧美在线视频观看
|
91亚洲国产成人精品一区二三
|
一级欧美视频
|
国产色在线 | 国产
超碰在线人
|
xxx精品
|
欧美成人三级
|
日韩综合色
|
亚洲永久免费
|
911国产在线观看
|
国产精品白浆精子像水合集
|
人妻少妇乱子伦精品
|
国产乱淫av片杨贵妃
|
在线免费观看黄
|
少妇一级淫片免费
|
伊人网视频在线
|
51成人网|
国产成人一区二区啪在线观看
|
欧美成人午夜免费影院手机在线看
|
国产一区二区日本
|
久久精品麻豆日日躁夜夜躁
|
精品精品国产毛片在线看
|
老司机精品成人无码av
|
婷婷久久综合九色综合97
|
引诱农村少妇性事
|
三级做a全过程在线观看
|
亚洲成人一
|
18禁网站免费无遮挡无码中文
|
日韩在线视频一区二区三区
|
av无码精品一区二区三区宅噜噜
|
欧美综合在线激情专区
|
精品国产乱子伦
|
人人妻人人爽人人澡人人
|
91免费在线视频
|
99热最新在线
|
国产精品久久久久久久竹霞
|
果冻传媒2021精品一区
|
五月婷婷丁香六月
|
日本老熟欧美老熟妇
|
亚洲免费av一区二区
|
日韩精品在线免费看
|
亚洲乱码一二三四区
|
国产精品奇米一区二区三区小说
|
欧美成在线观看
|
欧美亚洲亚洲日韩在线影院
|
国产福利片无码区在线观看
|
又色又爽又黄的视频日本
|
日本熟妇色熟妇在线视频播放
|
欧美一区二区三区视频在线观看
|
又黄又爽又色无遮挡免费软件国外
|
蜜乳av一区二区
|
国产一区二区内射最近更新
|
凸偷窥中国女人洗澡
|
亚洲天堂久久
|
男女www视频|
日本xx视频免费观看
|
人妻 偷拍 无码 中文字幕
|
欧美精品久久久久久久久老牛影院
|
久久大胆视频
|
黄色av网址在线
|
粉嫩少妇内射浓精videos
|
国产黄色片免费看
|
色综合色综合久久综合频道88
|
欧美成在线
|
苍井空浴缸大战猛男120分钟
|
欧美黑人巨大videos在线
|
久久久久久伊人
|
色综合久久88色综合天天提莫
|
日韩欧美手机在线
|
99riav视频
|
www.黄色免费
|
欧美国产亚洲日韩在线二区
|
aaaa黄色片|
国产成人av无码精品
|
日韩无套内射视频6
|
天天撸在线视频
|
人人妻人人澡人人爽秒播
|
色欲综合视频天天天
|
天天综合入口
|
国产午夜精品一区理论片飘花
|
人妖ts福利视频一二三区
|
黄久久久
|
不卡视频国产
|
亚洲精品久久久久久久久毛片直播
|
麻豆影视在线播放
|
亚洲成av人片在一线观看
|
91av国产在线
|
一道本一区二区
|
欧美肥老太牲交
|
亚洲人成网线在线播放va
|
精品成人一区二区三区四区
|
一本到高清
|
国产成人精品免费视频大全最热
|
亚洲无线一二三四区手机
|
国产黄av
|
337p人体 欧洲人体 亚洲
|
国产明星精品无码av换脸
|
老美黑人狂躁亚洲女
|
自拍 高清 日韩 欧美 另类
|
国产少妇自拍
|
亚洲美女一级片
|
亚洲欧美精品
|
狠狠躁天天躁夜夜躁婷婷
|
欧美丰满熟妇bbbbbb百度
|
日本大片在线看黄a∨免费
日韩在线第一
|
视频区国产亚洲.欧美
|
欧美人与禽2o2o性论交
|
一级片在线
|
精品国产迷系列在线观看
|
免费人成视频在线播放视频
|
国产成人麻豆精品午夜福利在线
|
女女同性女同一区二区三区91
|
日本一级大全
|
69激情网|
国产-第1页-浮力影院
|
丝袜足控一区二区三区
|
欧美视频免费
|
欧美国产影院
|
爱情岛亚洲论坛av入
|
国内精品免费视频
|
69精品人人
|
亚洲a∨精品一区二区三区下载
|
黄片毛片一级
|
久爱www成人网免费视频
|
国产女18毛片多18精品
|
日本欧美www视频网站
|
成人性视频欧美一区二区三区
|
免费网站看av片
|
国产曰肥老太婆无遮挡
|
色av吧|
国产一卡2卡3卡四卡精品
|
99热国产在线观看
|
37pao强力打造高清视频
|
青青草在久久免费久久免费
|
欧美日韩国产成人精品
|
国产对白在线
|
伊人热热久久原色播放www
|
免费国精产品自偷自偷免费看
|
av无码天一区二区一三区
|
国产经典盗摄91区x99av
|
欧美图片在线观看
|
国模小黎自慰gogo人体
|
免费男人和女人牲交视频全黄
|
97影院理论片手机在线观看
|
国产美女被遭强高潮免费一视频
|
天天综合入口
|
vr成人片在线播放网站
|
亚洲日本在线在线看片
|
少妇白浆高潮无码免费区
|
热99re久久精品这里都是精品免费
|
一区二区三区视频在线
|
国产精品极品在线视频
|
色综合久久无码中文字幕
|
欧美一级大片免费
|
国产成人无码午夜视频在线播放
|
国产成人精品一区二区视频
|
国产丰满精品伦一区二区三级视频
|
亚洲午夜av久久乱码
|
国产成人亚洲精品另类动态图
|
日日躁夜夜躁狠狠躁超碰97
|
精品97国产免费人成视频
|
一本大道久久香蕉成人网
|
99爱视频在线观看
|
国精品午夜福利视频
|
黑人巨大av|
天天鲁啊鲁在线看
|
中字幕一区二区三区乱码
|
成人爽a毛片免费啪啪
|
无码三级av电影在线观看
|
在线播放91
|
大乳美女a级三级三级
|
欧美粗暴jizz性欧美20
|
欧美久久久久久久久久久久久久
|
精品视频在线一区二区
|
欧美激情综合五月色丁香小说
|
午夜亚洲国产理论片中文
|
欧美日韩在线精品一区二区
|
嫩草精品
|
国产精品久久久久久久久潘金莲
|
免费无码h肉动漫在线观看
99久久国产综合精品swag
|
va精品
|
日韩欧美在线观看
|
国产成人精彩在线视频
|
国产精品久久久一区二区
|
亚洲欧美日韩国产另类电影
|
99无码熟妇丰满人妻啪啪
|
天天爽夜夜爽夜夜爽精品视频
|
国产精品乱码一区二区三区四川人
|
毛茸茸亚洲孕妇孕交片
|
都市激情av
|
a级黄色网
|
少妇又色又爽又刺激视频
|
国产精品久久久久久熟妇吹潮软件
|
中文字幕无码久久精品
|
无码成人免费全部观看
|
日韩午夜在线视频
|
亚洲а∨天堂2019无码
|
精品国产露脸久久av
|
av有码在线
|
亚洲区中文字幕
|
91麻豆精产国品一二三产区区
|
一本色道久久综合亚洲二区三区
|
国产日产欧产精品浪潮安卓版特色
|
精品免费在线视频
|
亚洲 日本 欧美 中文幕
|
思思久久精品一本到99热
|
亚洲成a人片77777群色
|
四虎网站在线播放
|
久久综合网丁香五月
|
免费看色网站
|
欧美日韩精品
|
精品亚洲国产成人av在线时间短的
|
国产在线拍揄自揄视频菠萝
|
亚洲成人看片
|
美女久久久久久
|
男人和女人黄 色大片
|
在线免费看黄视频
|
免费人成视频在线观看播放网站
|
欧美日韩一区视频
|
国产在线观看码高清视频
|
久久亚洲中文无码咪咪爱
|
黄色一级小视频
|
亚洲一区二区三区 无码
|
成人永久免费福利视频免费
|
a天堂中文在线
|
国内老熟妇对白hdxxxx
|
国产亚洲精品a在线无码
|
性av网站
|
华人在线亚洲欧美精品
|
成人国产精品入口免费视频
|
天堂www天堂在线资源
|
国产色系视频在线观看
|
欧美阿姨
|
九九九在线
|
国产亚洲综合欧美视频
|
五月av|
女同激情久久av久久
|
国产成在线观看免费视频密
|
欧美成人www免费全部网站
|
在线视频一区二区三区四区
|
免费观看黄色
|
色欲久久综合亚洲精品蜜桃
|
好男人www在线影视社区
|
天堂va视频一区二区
|
亚洲激情视频一区
|
亚洲色图欧美
|
国产狂喷潮在线观看
|
天堂…在线最新版在线
|
熟睡中被义子侵犯在线播放
|
国产a一级片|
国产成人精品午夜福利不卡
|
强制憋尿play黄文尿奴
|
久久精彩
|
亚洲成人av影片
|
久草在线免费资源
|
免费黄片毛片
|
欧美视频综合
|
www.99视频|
国产卡一卡二卡三无线乱码新区
|
欧美日韩中文国产一区
|
国内毛片毛片毛片毛片毛片
|
欧美大片xxx
|
人人澡人人澡人人看添av
|
亚洲成在人线av中文字幕喷水
|
中文字幕永久在线观看
|
最新国产精品拍自在线观看
|
精品国产精品国产偷麻豆
|
色老99久久精品偷偷鲁
|
日本国产忘忧草一区在线
|
日韩少妇内射免费播放18禁裸乳
|
嫩草影院永久入口
|
黄色免费一级视频
|
国产麻豆精品一区
|
四季av中文字幕一区
|
国产精品国产三级国产aⅴ9色
|
亚州av|
夜夜揉揉日日人人青青
|
欧美精品中文字幕亚洲专区
|
欧美三级在线
|
正在播放国产真实哭都没用
|
亚洲一区二区三区影院
|
日本强伦姧人妻69影院
|
成人网站色52色在线观看
|
精品久久久久久天美传媒
|
亚洲欧美综合在线中文
|
一本色道久久综合无码人妻
|
国产激情无码视频在线播放性色
|
ktv疯狂做爰视频
|
国产做爰xxxⅹ久久久小说
|
国产成人精品电影在线观看
|
麻豆专区
|
久久免费片
|
av无码免费一区二区三区
|
黄网站色视频免费国产
|
动漫av在线看男男
|
强开小嫩苞一区二区三区图片
|
国产亚洲欧美一区二区
|
青青青草国产费观看
|
中文字幕亚洲综合久久
|
日韩一区二区a片免费观看
青青国产精品视频
|
51av视频|
99国产精品久久久久久久成人热
|
91资源在线播放
|
欧美色就是色
|
亚洲人毛耸耸少妇xxx
|
国产乱人偷精品人妻a片
|
免费国产污网站在线观看
|
亚洲制服丝袜中文字幕在线
|
成人精品在线视频
|
香蕉视频免费在线看
|
夜夜免费视频
|
国产精品久久久久久久免费软件
|
婷婷综合少妇啪啪喷水动态小说
|
九色porny视频
|
小明天天看|
国产日韩欧美成人
|
av色欲无码人妻中文字幕
|
久久亚洲色www成人男男
|
国产女人与zoxxxx另类
|
国产欧美亚洲精品第1页青草
|
成人精品一区日本无码网站
|
成人在线污
|
亚洲aⅴ无码专区在线观看q
|
九九av在线
|
久久公开视频
|
成人性生交大片免费
|
99久久国产综合精品女同图片
|
少妇哺乳期在线喷奶
|
免费观看欧美一级
|
国内精品久久久久久久影视红豆
|
亚洲区小说区图片区
|
国产黄色片免费在线观看
|
欧美成人精品手机在线
|
又色又爽又黄又无遮挡网站
|