mirror of
				https://github.com/espressif/ESP8266_RTOS_SDK.git
				synced 2025-10-31 02:37:25 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			181 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* LwIP SNTP example
 | |
| 
 | |
|    This example code is in the Public Domain (or CC0 licensed, at your option.)
 | |
| 
 | |
|    Unless required by applicable law or agreed to in writing, this
 | |
|    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 | |
|    CONDITIONS OF ANY KIND, either express or implied.
 | |
| */
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <time.h>
 | |
| 
 | |
| #include "freertos/FreeRTOS.h"
 | |
| #include "freertos/task.h"
 | |
| #include "freertos/event_groups.h"
 | |
| 
 | |
| #include "esp_system.h"
 | |
| #include "esp_wifi.h"
 | |
| #include "esp_event_loop.h"
 | |
| #include "esp_log.h"
 | |
| 
 | |
| #include "nvs_flash.h"
 | |
| 
 | |
| #include "lwip/apps/sntp.h"
 | |
| 
 | |
| /* The examples use simple WiFi configuration that you can set via
 | |
|    'make menuconfig'.
 | |
| 
 | |
|    If you'd rather not, just change the below entries to strings with
 | |
|    the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
 | |
| */
 | |
| #define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID
 | |
| #define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD
 | |
| 
 | |
| /* FreeRTOS event group to signal when we are connected & ready to make a request */
 | |
| static EventGroupHandle_t wifi_event_group;
 | |
| 
 | |
| /* The event group allows multiple bits for each event,
 | |
|    but we only care about one event - are we connected
 | |
|    to the AP with an IP? */
 | |
| const int CONNECTED_BIT = BIT0;
 | |
| 
 | |
| static const char *TAG = "sntp_example";
 | |
| 
 | |
| static void initialize_sntp(void)
 | |
| {
 | |
|     ESP_LOGI(TAG, "Initializing SNTP");
 | |
|     sntp_setoperatingmode(SNTP_OPMODE_POLL);
 | |
|     sntp_setservername(0, "pool.ntp.org");
 | |
|     sntp_init();
 | |
| }
 | |
| 
 | |
| static void obtain_time(void)
 | |
| {
 | |
|     xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT,
 | |
|                         false, true, portMAX_DELAY);
 | |
|     initialize_sntp();
 | |
| 
 | |
|     // wait for time to be set
 | |
|     time_t now = 0;
 | |
|     struct tm timeinfo = { 0 };
 | |
|     int retry = 0;
 | |
|     const int retry_count = 10;
 | |
| 
 | |
|     while (timeinfo.tm_year < (2016 - 1900) && ++retry < retry_count) {
 | |
|         ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", retry, retry_count);
 | |
|         vTaskDelay(2000 / portTICK_PERIOD_MS);
 | |
|         time(&now);
 | |
|         localtime_r(&now, &timeinfo);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static esp_err_t event_handler(void *ctx, system_event_t *event)
 | |
| {
 | |
|     /* For accessing reason codes in case of disconnection */
 | |
|     system_event_info_t *info = &event->event_info;
 | |
| 
 | |
|     switch (event->event_id) {
 | |
|         case SYSTEM_EVENT_STA_START:
 | |
|             esp_wifi_connect();
 | |
|             break;
 | |
| 
 | |
|         case SYSTEM_EVENT_STA_GOT_IP:
 | |
|             xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
 | |
|             break;
 | |
| 
 | |
|         case SYSTEM_EVENT_STA_DISCONNECTED:
 | |
|             ESP_LOGE(TAG, "Disconnect reason : %d", info->disconnected.reason);
 | |
|             if (info->disconnected.reason == WIFI_REASON_BASIC_RATE_NOT_SUPPORT) {
 | |
|                 /*Switch to 802.11 bgn mode */
 | |
|                 esp_wifi_set_protocol(ESP_IF_WIFI_STA, WIFI_PROTOCAL_11B | WIFI_PROTOCAL_11G | WIFI_PROTOCAL_11N);
 | |
|             }
 | |
|             esp_wifi_connect();
 | |
|             xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
 | |
|             break;
 | |
| 
 | |
|         default:
 | |
|             break;
 | |
|     }
 | |
| 
 | |
|     return ESP_OK;
 | |
| }
 | |
| 
 | |
| static void sntp_example_task(void *arg)
 | |
| {
 | |
|     time_t now;
 | |
|     struct tm timeinfo;
 | |
|     char strftime_buf[64];
 | |
| 
 | |
|     time(&now);
 | |
|     localtime_r(&now, &timeinfo);
 | |
| 
 | |
|     // Is time set? If not, tm_year will be (1970 - 1900).
 | |
|     if (timeinfo.tm_year < (2016 - 1900)) {
 | |
|         ESP_LOGI(TAG, "Time is not set yet. Connecting to WiFi and getting time over NTP.");
 | |
|         obtain_time();
 | |
|     }
 | |
| 
 | |
|     // Set timezone to Eastern Standard Time and print local time
 | |
|     // setenv("TZ", "EST5EDT,M3.2.0/2,M11.1.0", 1);
 | |
|     // tzset();
 | |
| 
 | |
|     // Set timezone to China Standard Time
 | |
|     setenv("TZ", "CST-8", 1);
 | |
|     tzset();
 | |
| 
 | |
|     while (1) {
 | |
|         // update 'now' variable with current time
 | |
|         time(&now);
 | |
|         localtime_r(&now, &timeinfo);
 | |
| 
 | |
|         if (timeinfo.tm_year < (2016 - 1900)) {
 | |
|             ESP_LOGE(TAG, "The current date/time error");
 | |
|         } else {
 | |
|             strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
 | |
|             ESP_LOGI(TAG, "The current date/time in Shanghai is: %s", strftime_buf);
 | |
|         }
 | |
| 
 | |
|         ESP_LOGI(TAG, "Free heap size: %d\n", esp_get_free_heap_size());
 | |
|         vTaskDelay(1000 / portTICK_RATE_MS);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void initialise_wifi(void)
 | |
| {
 | |
|     tcpip_adapter_init();
 | |
|     wifi_event_group = xEventGroupCreate();
 | |
|     ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
 | |
|     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
 | |
|     ESP_ERROR_CHECK(esp_wifi_init(&cfg));
 | |
|     ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
 | |
|     wifi_config_t wifi_config = {
 | |
|         .sta = {
 | |
|             .ssid = EXAMPLE_WIFI_SSID,
 | |
|             .password = EXAMPLE_WIFI_PASS,
 | |
|         },
 | |
|     };
 | |
|     ESP_LOGI(TAG, "Setting WiFi configuration SSID %s...", wifi_config.sta.ssid);
 | |
|     ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
 | |
|     ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
 | |
|     ESP_ERROR_CHECK(esp_wifi_start());
 | |
| }
 | |
| 
 | |
| void app_main()
 | |
| {
 | |
|     //Initialize NVS
 | |
|     esp_err_t ret = nvs_flash_init();
 | |
| 
 | |
|     if (ret == ESP_ERR_NVS_NO_FREE_PAGES) {
 | |
|         ESP_ERROR_CHECK(nvs_flash_erase());
 | |
|         ret = nvs_flash_init();
 | |
|     }
 | |
| 
 | |
|     ESP_ERROR_CHECK(ret);
 | |
| 
 | |
|     initialise_wifi();
 | |
| 
 | |
|     // SNTP service uses LwIP, please allocate large stack space.
 | |
|     xTaskCreate(sntp_example_task, "sntp_example_task", 2048, NULL, 10, NULL);
 | |
| }
 | 
