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

主站蜘蛛池模板:
日韩在线高清
|
97se亚洲|
国产女人爽到高潮免费视频
|
亚洲美女视频高清在线看
|
成人免费mmmmm视频
|
亚洲色欧美在线影院
|
中国美女牲交视频
|
视色av|
中文字幕1
|
97成人精品
|
成人视频在线观看
|
无码丰满少妇2在线观看
|
可以免费观看av
|
爆乳护士一区二区三区在线播放
|
久久久久99精品成人片三人毛片
|
中文字幕色网
|
91超碰在线播放
|
日本xxxxxⅹxxxx69
|
欧美 日韩 国产 精品
|
国产精品99久久久久久久久
|
欧美日韩午夜爽爽
|
国产高清不卡免费视频
|
黑人与饥渴少妇在线
|
三级视频在线
|
二级黄色毛片
|
中文字幕丰满孑伦无码专区
|
伊人888|
三级网站|
西西人体大胆www44he七
|
久久无码av一区二区三区
|
久久精品视频在线看99
|
久久不雅视频
|
日韩中文字幕在线免费观看
|
国产欧美日本亚洲精品一5区
|
国产成人精品无码免费看
|
蜜桃av噜噜一区二区三区麻豆
|
亚洲精品久久婷婷丁香51
|
久热99|
久久av免费观看
|
国产免费看又黄又粗又硬
|
人乳喂奶hd播放
|
无码h黄肉3d动漫在线观看
|
伊人成人在线视频
|
国产成人精品日本亚洲直接
|
曰本女人牲交全视频播放
|
天堂a视频|
好吊妞无缓冲视频观看
|
特级毛片全部免费播放器
|
中文国产|
免费国产裸体美女视频全黄
|
亚洲欧美在线制服丝袜国产
|
天天干天天干天天操
|
久久久精品视
|
亚洲欧洲美色一区二区三区
|
日本一级理论片在线大全
|
国产成人精品一区二区秒播
|
国产精品情侣
|
欧美日韩一区二区在线观看
|
精品视频在线观看免费
|
夜色影院在线观看
|
欧美一级一级
|
中国极品少妇xxxxx
|
午夜秋霞影院
|
99国产精品入口
|
婷婷色爱区综合五月激情韩国
|
成年片色大黄全免费网站久久高潮
|
精品亚洲aⅴ在线观看
|
2022国产成人精品视频人
|
一二三精品
|
香蕉视频国产精品
|
欧美日韩精品亚洲精品
|
午夜在线视频观看
|
日韩高清片
|
一级黄色毛片视频
|
亚洲三级高清免费
|
51调教丨国产调教视频
|
青青草在线视频网站
|
99热网址|
2021年国产精品专区丝袜
|
亚洲h视频在线
|
国产69精品久久久久孕妇大杂乱
|
欧美成人黑人猛交
|
九九热精品视频在线播放
|
wwwav成人
|
在线观看国产日韩
|
青青青国产在线观看手机免费
|
精品99久久
|
在线不卡日本
|
成人性生交大片免费4
|
亚洲成a人片在线观看天堂无码不卡
|
九九久久99综合一区二区
|
国产精品久久久久久无码
|
青青草av国产精品
|
成年视频在线观看
|
特级一级黄色片
|
激情偷拍av
|
无码精品不卡一区二区三区
|
国产猛男猛女超爽免费视频网站
|
又湿又紧又大又爽a视频国产
|
在线欧美 精品 第1页
|
国产精品三级三级三级
|
久草在线中文888
|
亚洲国产成人精品激情姿源
|
夜夜夜夜猛噜噜噜噜噜
|
婷婷丁香五月缴情视频
|
亚洲中文字幕高清有码在线
|
国产精品亚洲a
|
在线天堂资源www在线中文
|
av无码国产精品色午夜
|
精品视频99
|
日本精品视频在线播放
|
成年美女黄网站色大免费全看
|
精品一卡二卡三卡四卡网站
|
五月激激激综合网色播
|
成人高潮视频在线观看
|
国产免费一区二区三区在线能观看
|
免费黄色av网站
|
国产高潮流白浆视频
|
a视频在线|
久久久久久久久艹
|
毛片在线网址
|
在线观看av日韩
|
亚洲综合伊人久久大杳蕉
|
人人妻人人妻人人妻碰碰
|
亚洲国产精品久久精品成人网站
|
国产成人a视频高清在线观看
|
亚洲欧洲日韩av在线观看
|
国产69精品久久久久孕妇大杂乱
|
中文字幕精品久久一二三区红杏
|
欧美性tv|
特黄 大片做受又粗又硬又大
|
毛片网在线观看
|
国产色a∨在线看免费
|
亚洲精品一二三区久久伦理中文
|
国产成人在线观看网站
|
亚洲人成网站在线播放影院在线
|
人人超碰人人爱超碰国产
|
国产在线视精品在一区二区
|
国产乱子伦精品免费视频
|
加勒比一本heyzo高清视频
|
15p亚洲
|
欧洲亚洲一区二区三区四区五区
|
男人的天堂黄色
|
亚洲成a人v电影在线观看
|
啪啪69xxⅹ偷拍
|
亚洲a区在线观看
|
国产又黄又猛
|
成熟丰满熟妇高潮xxxxx视频
|
色就是色亚洲色图
|
伊人久久爱
|
国产少妇高潮在线观看
|
日韩精品人妻无码久久影院
|
久久精品国产一区二区电影
|
国产口爆吞精在线视频
|
手机av免费观看
|
处破大全欧美破苞二十三
|
天天狠天天狠天天鲁
|
日韩精品无码人妻一区二区三区
|
一本一道久久a久久精品蜜桃
|
黄色国产一级
|
国产乱淫av片免费看
|
日韩大陆欧美高清视频区
|
天堂网avav|
久久久久久人妻无码
|
饭岛爱av片在线播放
|
熟女人妇交换俱乐部
|
丝袜视频一区
|
无码专区视频精品老司机
|
东京久久久
|
国产va|
中国老妇淫片bbb
|
久久久91精品
|
一本一道vs无码中文字幕
|
97免费公开在线视频
|
亚洲一区在线免费观看
|
99精品人妻无码专区在线视频区
|
久久麻豆成人精品av
|
亚洲丝袜一区二区
|
曰韩精品无码一区二区三区
|
11月流出美女撒尿偷拍在线播放
|
中文字幕在线播放不卡
|
国产综合亚洲精品一区二
|
欧美熟妇性xxx交潮喷
|
国产放荡对白视频一区二区
|
香港三日本三级少妇三级2021
|
国产精品资源网
|
很黄很黄让你高潮视频
|
深夜福利在线观看视频
|
丝袜视频在线
|
a黄色毛片|
国产国产人免费视频成69
|
久久伊人精品一区二区三区
|
在线精品一区二区三区
|
国产精品超清白人精品av
|
27美女少妇洗澡偷拍
|
国内高清a自拍视频
|
人妻三级日本香港三级极
|
满春阁精品a∨在线观看
|
精品少妇ay一区二区三区
|
日韩人妻中文无码一区二区
|
亚洲人人夜夜澡人人爽
|
无码精品久久一区二区三区
|
久久免费视频观看
|
欧美成人家庭影院
|
亚洲精品国产乱码av在线观看
|
色爱五月天
|
一区二区视频日韩免费
|
国产免费无遮挡吸乳视频app
|
久久久久久自慰出白浆
|
欧美乱人免费视频观看
|
av网址网站
|
亚洲国产视频一区二区三区
|
色综合久久久久久久久五月
|
国产极品美女高潮无套小趴菜
|
二个男人躁我疯狂吃奶视频
|
亚洲国产制服丝袜先锋
|
www.久草.com
|
亚洲午夜国产精品无码老牛影视
|
午夜av亚洲翘臀国产精网
|
天天看黄色
|
狠狠av|
亚洲 欧美 综合
|
官场艳妇疯狂性关系
|
久久久黄色片
|
不卡av片|
丰满少妇高潮在线观看
|
久久精品国产亚洲7777
|
丰满的少妇被猛烈进入白浆
|
久久色在线观看
|
欧美天堂色
|
99re视频这里只有精品
|
无码av天堂一区二区三区
|
污污视频网站在线
|
黑人精品xxx一区一二区
|
日本精品中文字幕
|
国产欧美黑寡妇久久久
|
国产成人综合日韩精品无码不卡
|
最新色视频
|
黄色理伦
|
国产成人精品微拍视频网址
|
国产精品成人国产乱
|
精品乱码一区二区三区
|
国产老熟女狂叫对白
|
日本精品一区二区三区在线视频
|
日韩免费一二三区
|
国产成人亚洲综合网色欲网久下载
|
久久无码av一区二区三区电影网
|
国产精品久久久久无码av
|
久久99亚洲精品久久频
|
美女隐私黄www网站免费
|
黄色资源网站
|
久久大香萑太香蕉av
|
成人av毛片无码免费网站
|
精品国产露脸久久av
|
热逼视频
|
久久久午夜精品理论片中文字幕
|
2020天堂在线亚洲精品专区
|
国产99久久久国产精品免费高清
|
亚洲综合av在线在线播放
|
亚洲午夜精品久久久久久
|
久久精品国产再热青青青
|
人人妻人人妻人人妻碰碰
|
91色啪
|
欧美激情视频在线观看
|
日本三线免费视频观看
|
亚洲综合第一区
|
国产精品喷浆
|
伊人久久久大香线蕉综合直播
|
日本草逼视频
|
97成人在线观看
|
老司机一区二区三区
|
久99久无码精品视频免费播放
|
青青草国产精品一区二区
|
黄色免费网站视频
|
亚洲色偷偷色噜噜狠狠99网
|
18国产免费视频
|
麻豆av一区二区三区久久
|
国产精品视频一区二区三区无码
|
小小拗女性bbwxxxx国产
|
一本色道久久综合一
|
国产成人亚洲综合二区
|
www.亚洲天堂
|
日韩欧美卡一卡二卡新区
|
91另类|
一级一片免播放
|
久章草国语自产拍在线观看
|
日日噜噜夜夜狠狠
|
夜色影院在线观看
|
亚洲国产成人在人网站天堂
|
高跟鞋av
|
人人超碰人人爱超碰国产
|
深夜福利av无码一区二区
|
日本欧美亚洲中文在线观看
|
亚洲qvod激情经典在线观看
|
免费的av在线
|
亚洲天堂精品久久
|
成人高潮片免费软件69视频
|
伊人久久大香线蕉av不变影院
|
色欲老女人人妻综合网
|
在线观看无码av网站永久免费
|
久久理伦片琪琪电影院
|
五月婷婷激情网
|
亚洲精品国产品国语在线观看
|
国产成人麻豆精品午夜在线
|
在线免费看黄视频
|
欧美黄色aaa
|
无码被窝影院午夜看片爽爽jk
|
国产欧美激情视频
|
成人美女视频
|
日韩午夜免费
|
国产亚洲一区二区三区四区
|
黄频视频在线观看
|
性高朝久久久久久久齐齐
|
成年美女黄网站色大免费全看
|
亚洲25p
|
免费国产一区二区三区四区
|
中文字幕无码日韩中文字幕
|
免费人成在线观看网站
|
亚洲日韩亚洲另类激情文学
|
91麻豆精产国品一二三产区区
|
亚洲精品无码mⅴ在线观看
男人一边吃奶一边做爰网站
|
精品国产第一国产综合精品
|
柠檬福利视频导航
|
日韩精品人妻av一区二区三区
|
夜色影院在线观看
|
久久久久无码精品国产h动漫
|
国产精品一区不卡
|
国产精品天天av精麻传媒
|
日产精品久久久一区二区福利
|
国产在线精品一区二区不卡顿
|
日韩精品无码一区二区三区免费
|
无码少妇一区二区性色av
|
日本男人天堂
|
91成人动漫
|
69视频在线观看
|
色一情一交一乱一区二区三区
|
高清国产亚洲欧洲av综合一区
|
激情欧美成人小说在线视频
|
久久香蕉国产线看观看猫咪av
|
一女三黑人理论片在线
|
狂野欧美性猛交xxxx777
|
天堂av无码大芭蕉伊人av孕妇
|
国产精品免费久久久
|
亚洲a∨无码精品色午夜
|
安野由美中文一区二区
|
日韩av在线观看免费
|
日韩视频中文字幕精品偷拍
|
国产精品美女毛片真酒店
|
男女插插插视频
|
成人一级片网站
|
色猫咪av在线网址
|
亚洲人成无码网www电影榴莲
|
国产在线麻豆精品入口
|
欧洲亚洲色一区二区色99
|
91九色丨porny最新地址
|
91亚洲国产成人精品性色
|
在线精品国产成人综合
|
蜜臀av无码一区二区三区
|
青青爽无码视频在线观看
|
老色69久久九九精品高潮
|
精品国产乱码久久久久久夜深人妻
|
国产女人抽搐喷浆视频
|
无码国产精品一区二区免费i6
|
亚洲日韩av一区二区三区四区
|
亚洲人成电影在线观看青青
|
国产青青草
|
国产真实交换配乱吟91
|
一本大道在线无码一区
|
色一情一乱一伦一区二区三区
|
无码毛片视频一区二区本码
|
91成年版
|
久久曰视频
|
不卡视频一区二区三区
|
天堂中文在线最新版地址
|
攵女h文1v1
|
欧美高清大屁股xxxxx
|
特级a欧美做爰片黑人
|
亚洲伊人成综合网2222
|
亚洲成av人无码中文字幕
|
深夜福利麻豆
|
裸体丰满少妇淫交
|
五月婷婷丁香综合
|
国产清纯白嫩初高生在线观看性色
|
日韩免费久久
|
伴郎粗大的内捧猛烈进出视频观看
|
4438xx亚洲最大五色丁香软件
|
国产在线视频91
|
国产露脸911
|
欧美在线观看免费做受视频
|
欧美视频在线观看一区二区
|
欧美成人午夜免费全部完
|
人妻加勒比系列无码专区
|
网曝91综合精品门事件在线
|
国产精品成人网站
|
91精品国产美女在线观看
|
免费国产成版人视频app
|
国模一区二区三区白浆
|
香蕉一区二区
|
98色精品视频在线
|
日本精品一区二区三区在线观看
|
亚洲最大在线视频
|
亚洲色成人网站www永久下载
|
国产欧美日韩中文字幕
|
无码成人片在线播放
|
亚洲大成色www永久网站动图
|
国产精品对白刺激久久久
|
又粗又猛又黄又爽无遮挡
|
55久久|
美女黄18以下禁止观看
|
国产精品久久久久久久久免费丝袜
|
www.亚色|
成年午夜无码av片在线观看
|
久久精品国产精品亚洲色婷婷
|
欧美激情999
|
国产亚洲精品aa片在线爽
|
欧美一区二区三区黄色
|
动漫高h纯肉无码视频在线观看
|
欧美成人另类
|
偷国产乱人伦偷精品视频
|
国产区123|
久久天天躁狠狠躁夜夜avapp
|
国产露脸国语对白在线
|
亚洲综合电影小说图片区
|
熟女乱色一区二区三区
|
久久伊人热热精品中文字幕
|
日韩欧美一区视频
|
婷婷久久综合九色综合88
|
久久精品4
|
人人妻人人爽人人爽
|
中文字幕在线播
|
亚洲精品国产精品无码国模
|
午夜在线观看网站
|
97自拍网
|
亚洲综合色一区
|
www91亚洲|
四虎免费久久
|
欧美精品一区二区在线播放
|
天堂√最新版中文在线天堂
|
亚洲午夜久久久久久噜噜噜
|
伊人天天操
|
日韩久久免费视频
|
欧美丰满一区二区免费视频
|
色综合久久久久久久久五月
|
性欧美13处14破xxx极品
|
欧美另类精品xxxx人妖
|
99视频国产精品免费观看
|
最新中文字幕在线视频
|
亚洲天堂小视频
|
91久久在线
|
国产亚洲视频免费播放
|
欧美 日韩版国产在线播放
成人免费mmmmm视频
|
欧美丰满熟妇xxxx性ppx人
|
国语对白刺激在线视频国产网红
|
午夜福利无码一区二区
|
国产伦子伦对白在线播放观看
|
成人无码特黄特黄av片在线
|
中文字幕av一区二区三区
|
高清国产一区二区三区在线
|
久久久久久中文字幕有精品
|
国产精品人人爽人人做我的可爱
|
激情午夜av
|
九色蝌蚪9l视频蝌蚪9l视频开放
|
国产九九精品视频
|
国产无线乱码一区二三区
|
精品成人免费国产片
|
国产人妻精品无码av在线
|
情侣呻吟对白精品av
|
а√8天堂中文官网资源
|
欧美亚洲另类丝袜综合网
|
日本一区二区视频在线播放
|
丁香六月婷婷综合
|
色肉色伦交国产69精品
|
免费成人91|
欧美激情一区二区三区p站
亚洲五月综合缴情在线观看
|
99久久免费看精品国产
|
99精品国产福利在线观看
|
免费体验区试看120秒
|
成人在线一区二区
|
中文人妻av久久人妻18
|
国产亚洲熟妇综合视频
|
日本激情在线
|
中国成人毛片
|
色一情一乱一伦麻豆
|
怡红院av亚洲一区二区三区h
|
国产清纯在线一区二区vr
|
一级做a爱片久久毛片a高清
|
最新国产av无码专区亚洲
|
天天躁人人躁人人躁狂躁
|
视频免费1区二区三区
|
亚洲va韩国va欧美va精四季
|
国内揄拍国内精品
|
毛片无码高潮喷液视频
|
亚洲国产成人精品女人久久久
|
中文字幕永久视频
|
久艾草在线精品视频在线观看
|
日本黄色免费网址
|
国产内射老熟女aaaa
|
亚洲色一区二区三区四区
|
日韩激情综合
|
免费jizzjizz在线播放
|
国产又黄又爽又猛免费视频网站
|
午夜综合网
|
国产精品一区二区欧美
|
亚洲美女性视频
|
国产精品爱久久久久久久电影蜜臀
|
9久精品
|
国产成人精品亚洲777
|
亚洲视频一区二区三区
|
宅男噜噜噜66在线观看
|
国产av在线www污污污十八禁
|
国产精品视频麻豆
|
天堂网www中文在线
国产在线拍揄自揄拍无码视频
|
春色影视|
亚洲男同网|
亚洲成aⅴ人在线观看
|
中文 在线 日韩 亚洲 欧美
|
在线观看国产精品va
|
少妇高潮水多太爽了动态图
|
一本色道久久综合无码人妻
|
婷婷六月丁香缴 清
|
亚洲免费视频观看
|
天天躁日日躁狠狠躁性色av
|
欧美伊人色综合久久天天
|
亚洲欧美精品综合在线观看
|
搡少妇在线视频中文字幕
|
亚洲人在线观看
|
好男人www社区
|
国产区精品
|
不卡视频一区二区
|
久久精品成人免费国产片小草
|
96精品视频在线观看
|
国产伦子xxx视频沙发
|
久久视频这里只精品
|
特黄做受又硬又粗又大视频小说
|
四虎成人欧美精品在永久在线
|
青青国产在线视频
|
亚洲欧美日韩在线观看一区二区三区
|
亚洲国产成人精品女人久久久
|
国产精品伦一区二区三区在线观看
|
91久久精品国产91久久
|
www日韩一区|
国产精品亚洲色图
|
激情文学小说区另类小说同性
|
久久高潮视频
|
亚洲国产人成自久久国产
|
久久女人天堂
|
亚洲不卡av一区二区无码不卡
|
在线欧美中文字幕农村电影
|
日本久久综合久久鬼色
|
亚洲精选av|
制服丝袜亚洲中文综合懂色
|
2020无码专区人妻系列日韩
|
国产成人中文字幕
|
国产免费爽爽视频在线观看
|
国产成人无码a区在线观看视频
|
偷偷色噜狠狠狠狠的777米奇
|
免费黄网在线观看
|
亚洲国产不卡久久久久久
|
美女露出粉嫩小奶头在视频18禁
|
亚洲中文字幕无码一区无广告
|
国产成人精品视频国产
|
日日噜噜噜噜夜夜爽亚洲精品
|
久久久久久久久影院
|
国产福利永久在线视频无毒不卡
|
成人在线观看国产
|
日本午夜三级
|
亚洲图片另类小说
|
青青草一区二区三区
|
无码国产精品高潮久久9
|
伊人久操
|
亚洲影院丰满少妇中文字幕无码
|
国产一级做a爰片在线看免费
|
国产又粗又猛又黄又爽性视频
|
美日韩中文字幕
|
久久久久久久艹
|
真人插b免费视频播放
|
精品国产综合色在线
|
男女啪啪激烈高潮喷出gif免费
|
痉挛高潮喷水av无码免费
|
麻豆文化传媒精品一区
|
欧美激情亚洲一区
|
丝袜足控一区二区三区
|
亚洲爆乳中文字幕无码专区网站
|
成人无码a片一区二区三区免
|
国产一级啪啪
|
国产精品第69页
|
欧美日韩国产激情
|
国产黄色在线
|
亚洲综合色在线视频www
|
午夜精品久久久久久99热明星
|
色噜噜狠狠一区二区三区果冻av
|
精品亚洲国产成人av网站
|
爱色精品视频一区二区
|
亚洲图片自拍偷图区
|