一、连接WIFI

在进行时间同步之前,先连接WIFI

#include "wifi.h"

#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_wpa2.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_netif.h" static wifi_status_t wifi_status = WIFI_STATUS_DEINIT; // WIFI 默认为未初始化状态
static EventGroupHandle_t s_wifi_event_group; // WIFI 事件组
esp_event_handler_instance_t instance_any_id; // 注册事件处理程的标识
esp_event_handler_instance_t instance_got_ip; // /* 事件组允许有多个事件标志位 */
static const int WIFI_STATUS_INIT_BIT = BIT0; // WIFI 初始化状态
static const int WIFI_STATUS_START_BIT = BIT1; // WIFI 启动状态
static const int WIFI_STATUS_SCAN_BIT = BIT3; // WIFI 扫描状态
static const int WIFI_STATUS_CONNECTED_BIT = BIT4; // WIFI 连接状态 /* 需要连接的WIFI名称和密码 */
static wifi_sta_config_t cfg_sta = {
.ssid = "test",
.password = "test8888",
}; /* 互斥锁 */
SemaphoreHandle_t xWifiSemaphore; static const char *TAG = "WIFI"; /**
* @brief WIFI 事件
*
* @param arg
* @param event_base
* @param event_id
* @param event_data
*/
static void wifi_event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
/* WIFI事件 */
if (event_base == WIFI_EVENT)
{
switch (event_id)
{
/* WIFI 就绪 */
case WIFI_EVENT_WIFI_READY:
ESP_LOGI(TAG,"ESP32 WiFi ready");
break;
/* WIFI 扫描完成 */
case WIFI_EVENT_SCAN_DONE:
ESP_LOGI(TAG,"ESP32 finish scanning AP");
xEventGroupSetBits(s_wifi_event_group, WIFI_STATUS_SCAN_BIT); // 设置WIFI标志位为打开状态
break;
/* WIFI 启动 */
case WIFI_EVENT_STA_START:
ESP_LOGI(TAG,"ESP32 station start");
xEventGroupSetBits(s_wifi_event_group, WIFI_STATUS_START_BIT); // 设置WIFI标志位为打开状态
wifi_status = WIFI_STATUS_START; // 设置WIFI为打开状态
break;
/* WIFI 关闭 */
case WIFI_EVENT_STA_STOP:
ESP_LOGI(TAG,"ESP32 station stop");
xEventGroupClearBits(s_wifi_event_group, WIFI_STATUS_START_BIT); // 设置WIFI标志位为关闭状态
wifi_status = WIFI_STATUS_STOP; // 设置WIFI为关闭状态
break;
/* WIFI 连接成功 */
case WIFI_EVENT_STA_CONNECTED:
ESP_LOGI(TAG,"ESP32 station connected to AP");
xEventGroupSetBits(s_wifi_event_group, WIFI_STATUS_CONNECTED_BIT); // 设置WIFI标志位为关闭状态
wifi_status = WIFI_STATUS_CONNECTED; // 设置WIFI为关闭状态
break;
/* WIFI 断开连接 */
case WIFI_EVENT_STA_DISCONNECTED:
ESP_LOGI(TAG,"ESP32 station disconnected from AP");
xEventGroupClearBits(s_wifi_event_group, WIFI_STATUS_CONNECTED_BIT); // 设置WIFI标志位为关闭状态
wifi_status = WIFI_STATUS_DISCONNECTED; // 设置WIFI为关闭状态
break;
/* WIFI 接入点认证方式改变 */
case WIFI_EVENT_STA_AUTHMODE_CHANGE:
ESP_LOGI(TAG,"the auth mode of AP connected by ESP32 station changed");
break; default:
ESP_LOGI(TAG,"Other status");
break;
}
} if(event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));
}
} /**
* @brief WIFI 初始化
*
*/
void app_wifi_init(void)
{
// 初始化 NVS
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret); /* 初始化底层TCP/IP堆栈 */
ESP_ERROR_CHECK(esp_netif_init()); s_wifi_event_group = xEventGroupCreate(); // 创建新的事件组
ESP_ERROR_CHECK(esp_event_loop_create_default()); // 创建默认事件循环
esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta(); // 创建默认WIFI STA
assert(sta_netif); /* 使用默认参数初始化WIFI */
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_wifi_init(&cfg) ); /* 向默认循环注册事件处理程序 */
ESP_ERROR_CHECK( esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL, instance_any_id) );
ESP_ERROR_CHECK( esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL, instance_got_ip) ); ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); // 设置WIFI模式 xEventGroupSetBits(s_wifi_event_group, WIFI_STATUS_INIT_BIT); // 设置WIFI标志位为初始化状态
wifi_status = WIFI_STATUS_INIT; // 设置WIFI状态为初始化状态
xWifiSemaphore = xSemaphoreCreateMutex(); // 创建互斥锁
} void app_main(void)
{
app_wifi_init();
ESP_ERROR_CHECK( esp_wifi_start() ); // 启动WIFi /* 而直接将wifi_sta_config_t(或指针)转为wifi_config_t(或指针)是GCC的拓展语法,如下 */
esp_wifi_set_config(WIFI_IF_STA, (wifi_config_t *) &cfg_sta); esp_wifi_connect();
}

二、时间同步

/**
* @brief 同步时间完成后的回调函数
*
* @param tv
*/
void time_update_callback(struct timeval* tv)
{
/* 设置时区 */
setenv("TZ", "CST-8", 1);
tzset();
} /**
* @brief 在联网的情况下获取网络时间
*
*/
static void get_network_time(void)
{
/* 等待 WIFI 连接*/
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, WIFI_STATUS_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY); /* SNTP校时 */
sntp_setoperatingmode(SNTP_OPMODE_POLL);
sntp_setservername(0, "ntp.aliyun.com");
sntp_set_time_sync_notification_cb(time_update_callback);
sntp_init(); // 启动校时
}

注意:不使用sntp_set_time_sync_notification_cb()注册同步成功回调时,也可以使用sntp_get_sync_status()轮询检测同步是否完毕

三、获取系统时间

static struct tm timeinfo = {0};           // 时间寄存器
time_t now = 0; time(&now);
localtime_r(&now, &timeinfo); /* 打印获取到的时间 */
char str[64];
strftime(str, sizeof(str), "%c", &timeinfo);
ESP_LOGI(TAG, "time updated: %s", str); ESP_LOGI(TAG, "%d%d:%d%d", timeinfo.tm_hour / 10, timeinfo.tm_hour % 10, timeinfo.tm_min / 10, timeinfo.tm_min % 10);
ESP_LOGI(TAG, "%d-%d-%d", timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday); switch (timeinfo.tm_wday)
{
case 0:
ESP_LOGI(TAG, "星期日");
break;
case 1:
ESP_LOGI(TAG, "星期一");
break;
case 2:
ESP_LOGI(TAG, "星期二");
break;
case 3:
ESP_LOGI(TAG, "星期三");
break;
case 4:
ESP_LOGI(TAG, "星期四");
break;
case 5:
ESP_LOGI(TAG, "星期五");
break;
case 6:
ESP_LOGI(TAG, "星期六");
break;
default:
break;
}

参考文献

ESP32 之 ESP-IDF 教学(二十)—— SNTP校时:<https://blog.csdn.net/m0_50064262/article/details/126690030

ESP32 SNTP校时的更多相关文章

  1. GPS时钟装置,北斗卫星授时,ntp校时服务器,网络时间服务器

    GPS时钟装置,北斗卫星授时,ntp校时服务器,网络时间服务器 一.GPS时钟装置产品特点:技术交流-岳峰 15901092122:Q522508213 GPS时钟装置是针对计算机.自动化装置等进行校 ...

  2. NTP校时设置

    一.Windows Server 2008 – Time Server 前言: 国家时间与频率标准实验室  && NTP服务器 也可以忽略1~6 直接跳7 如果已改过机码请使用 1   ...

  3. 记一个有想法却没能力实现的硬件产品——mp3校时闹钟

    枕头旁的闹钟,我想大家都用过,很便宜.用一节干电池供电.但其最大的缺点就是不太准,不能校时. 电池啥事用光,也不知道.钟是走的很慢,没按时闹,搞的自己迟了到. 于是就有了我的漫长思考过程... 先说手 ...

  4. Linux NTP校时

    1.安装客户端(root权限运行) apt-get install ntpdate 2.修改配置文件:“/etc/default/ntpdate”,     NTPSERVERS="ntp. ...

  5. 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器

    北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 论述当下网络时间同步 ...

  6. GPS校时器,GPS时钟装置,NTP网络时间服务器

    GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间 ...

  7. 网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器

    网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器 网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器 论述当下网络时间同步的重要性   北京华人开创科技发展有限公 ...

  8. 实现基于NTP协议的网络校时功能

    无论PC端还是移动端系统都自带时间同步功能,基于的都是NTP协议,这里使用C#来实现基于NTP协议的网络校时功能(也就是实现时间同步). 1.NTP原理 NTP[Network Time Protoc ...

  9. c# 系统校时工具类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace HuaT ...

  10. GPS北斗NTP校时服务器原理及功能介绍

    在科技的发展下GPS北斗NTP校时服务器也得到了广泛应用,比如工业.科研.航空航天.公共场所等领域都用到了GPS北斗NTP校时服务器,该时间服务器以卫星时间为基准授时准确,替代了传统钟表授时的单一和时 ...

随机推荐

  1. 阿里二面:谈谈ThreadLocal的内存泄漏问题?问麻了。。。。

    引言 ThreadLocal在Java多线程编程中扮演着重要的角色,它提供了一种线程局部存储机制,允许每个线程拥有独立的变量副本,从而有效地避免了线程间的数据共享冲突.ThreadLocal的主要用途 ...

  2. 大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望—打造AI应用新篇章

    大模型落地实战指南:从选择到训练,深度解析显卡选型.模型训练技.模型选择巧及AI未来展望---打造AI应用新篇章 0.前言大模型发展史 早期阶段(1950s~1980s) 在1950年代初期,人们开始 ...

  3. QT数据库学习笔记

    简介 QT通过模块化管理,对于某种模块需要添加对应的模块实现.QT SQL也是需要增加对应的模块来实现.QT数据库的层次关系为: 驱动层:数据库到SQL语言之间的桥梁 SQL API层: SQL语句的 ...

  4. javascript雪花算法ID生成库simple-flakeid

    开源地址:https://github.com/zhupengfeivip/simple-flakeId ​ 核心算法版权属于 yitter](https://github.com/yitter)) ...

  5. std::thread 二:互斥量(lock_guard())

    *:使用 lock_guard 后,就不可以使用 lock() 和 unlock() *:lock_guard 和智能指针一样,会自动解锁   #include <iostream> #i ...

  6. jemter做参数化的几种方法

    第一种:使用用户参数:添加--前置处理器--用户参数

  7. 最新CAMX-python融合技术应用与大气污染来源解析方法

    大气污染问题既是局部.当地的,也是区域的,甚至是全球的.本地的污染物排放除了对当地造成严重影响外,同时还会在动力输送作用下,极大地影响下风向地区的大气环境状况.数值模式模拟是分析大气污染物时空分布和成 ...

  8. Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载

    有时候在系统中需要一次性下载多个文件,但逐个下载文件比较麻烦.这时候,最好的解决办法是将所有文件打包成一个压缩文件,然后下载这个压缩文件,这样就可以一次性获取所有所需的文件了. 下面是一个名为Comp ...

  9. Stage模型深入解读

     原文链接:https://mp.weixin.qq.com/s/4Mb5BMw1IgKvqE0Ff9Ts-w,点击链接查看更多技术内容:   HarmonyOS 3.1版本(API 9)推出了全新应 ...

  10. 演示webuploader和cropperjs图片裁剪上传

    最近有个项目要在浏览器端裁剪并上传图片.由于缺乏人力,只能我上阵杀敌.通过参考各种文章,最后决定用cropperjs进行图片裁剪,用webuploader上传文件.本文涉及到的知识至少有Java基础. ...