ESP8266调用NTP服务器进行时间校准

简介: NTP服务器通常连接到具有高度精确时间源的设备,例如:GPS接收器或原子钟,以确保提供准确如一的时间。网络上的计算机可以通过连接到NTP服务器来同步其时间,并确保它们在同一时刻进行操作。

一、背景知识

【1】什么是NTP服务器?

NTP是网络时间协议(Network Time Protocol,简称NTP),是一种用于同步计算机时间的协议。NTP服务器指的是提供NTP服务的计算机或设备。NTP服务器的主要功能是保证网络上的所有设备的时间同步,以确保各个设备相互之间的时间协调一致。NTP服务器通常连接到具有高度精确时间源的设备,例如:GPS接收器或原子钟,以确保提供准确如一的时间。网络上的计算机可以通过连接到NTP服务器来同步其时间,并确保它们在同一时刻进行操作。

目前有许多可以使用的NTP服务器,以下是一些常用的NTP服务器列表:

1. cn.ntp.org.cn
2. ntp.sjtu.edu.cn
3. ntp.linux.org.cn
4. time.nist.gov.cn
5. ntp.aliyun.com
6. ntp.api.bz
7. ntp1.aliyun.com
8. time1.cloud.tencent.com
9. pool.ntp.org.cn

【2】RTC实时时钟是什么?

RTC (Real-Time Clock)实时时钟,是指一种专门用于记忆日期、时间的计时芯片或模块。一般包括一个时钟芯片、一块石英晶体、一块温度补偿电路、电源管理电路等组成。RTC可以精确地记录日期和时间,即使是在断电等异常情况下,也能保持记录的时间长达数年。常常用于嵌入式系统、数据采集设备等领域,是一种至关重要的设备。在某些系统应用中,RTC也会成为其他设备的时钟源,如单片机或微控制器单位等。

RTC的时间精度通常为ppm 级别,即每百万分之一,能够满足大多数实时应用场景的要求。为了提高RTC的稳定度和精度,许多RTC都带有自动校正功能,可以自动从外部时钟源或NTP服务器中获取准确的时间,并进行校正。同时,许多RTC还会集成电源管理功能,支持低功耗模式以延长电池寿命。

二、ESP8266获取网络时间

要通过ESP8266联网并获取网络时间,需要执行以下步骤:

  1. 在STM32F103ZET6上配置UART串口以与ESP8266进行通信。
  2. 使用AT指令将ESP8266连接到Wi-Fi网络。可以使用以下指令:
AT+CWJAP="SSID","password"

其中,替换 "SSID" 为自己的Wi-Fi网络名称,"password" 是Wi-Fi密码。

使用AT指令连接到NTP服务器并获取时间。可以使用以下指令:

AT+CIPSNTPCFG=0,1,"pool.ntp.org"
AT+CIPSNTPTIME?

这将连接到ntp服务器并检索当前的UTC时间。

  1. 将ESP8266返回的UTC时间转换为本地时间。需要知道当前所在的时区,并对UTC进行适当的调整。
  2. 将本地时间设置为STM32F103ZET6上的RTC实时时钟。

下面是实现的代码:

#include <stdio.h>
#include "stm32f10x.h"

// UART配置
void uart_init() {
   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);

    USART_Cmd(USART1, ENABLE);
}

// 发送AT指令并等待响应
int send_at_command(char* command, char* response, uint32_t timeout) {
   
  // 发送命令
  USART_SendData(USART1, (uint8_t*)command, strlen(command));

  // 等待响应
  uint32_t start_time = HAL_GetTick();
  while ((HAL_GetTick() - start_time) < timeout) {
   
    if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
   
      char c = USART_ReceiveData(USART1);

      // 检查是否收到了预期的响应
      if (strstr(response, c) != NULL) {
   
        return 0; // 成功
      }
    }
  }

  return -1; // 超时或没有收到预期的响应
}

// 连接ESP8266到Wi-Fi
void connect_to_wifi() {
   
  char command[50];
  char response[100];

  // 设置Wi-Fi SSID和密码
  sprintf(command, "AT+CWJAP=\"%s\",\"%s\"\r\n", "YourSSID", "YourPassword");
  send_at_command(command, "OK", 5000);
}

// 连接到NTP服务器并获取时间
int get_ntp_time(uint32_t* time) {
   
  char response[100];

  // 配置SNTP客户端
  send_at_command("AT+CIPSNTPCFG=0,1,\"pool.ntp.org\"\r\n", "OK", 5000);

  // 获取时间
  send_at_command("AT+CIPSNTPTIME?\r\n", response, 5000);

  // 解析响应并提取时间戳
  char* token = strtok(response, ",");
  uint32_t timestamp = atoi(token);
  *time = timestamp - 2208988800UL; // 转换为Unix时间戳

  return 0;
}

// 将时间设置到RTC
void set_rtc_time(uint32_t time) {
   
  // 启用PWR和BKP外设时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  // 解锁备份寄存器区域
  PWR_BackupAccessCmd(ENABLE);

  // 配置RTC
  RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128); // RTC时钟源为HSE/128
  RCC_RTCCLKCmd(ENABLE); // 启用RTC时钟

  RTC_InitTypeDef RTC_InitStructure;
  // 配置RTC时钟 
    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_InitStructure.RTC_AsynchPrediv = 127; 
    RTC_InitStructure.RTC_SynchPrediv = 255; 
    RTC_Init(&RTC_InitStructure);

// 设置RTC时间 
    RTC_TimeTypeDef RTC_TimeStruct; 
    RTC_DateTypeDef RTC_DateStruct;

// 将Unix时间戳转换为RTC时间和日期 
  uint32_t days = time / 86400; 
    uint32_t seconds = time % 86400; 
    uint32_t hours = seconds / 3600; 
    uint32_t minutes = (seconds % 3600) / 60; 
    uint32_t secs = (seconds % 3600) % 60; 
    uint32_t year = 1970; 
    uint32_t month = 1; 
    while (days > 365) {
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
    days -= 366; } else {
    days -= 365; } year++; } 
    while (days > 0) {
    if (month == 2) 
    {
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
    if (days > 29) {
    days -= 29; } else {
    break; } } else {
    if (days > 28) {
    days -= 28; } else {
    break; } } } else if (month == 4 || month == 6 || month == 9 || month == 11) {
    if (days > 30) {
    days -= 30; } else {
    break; } } else {
    if (days > 31) {
    days -= 31; } else {
    break; } } month++; if (month > 12) {
    month = 1; year++; } }

RTC_TimeStruct.RTC_Hours = hours; RTC_TimeStruct.RTC_Minutes = minutes; RTC_TimeStruct.RTC_Seconds = secs; RTC_DateStruct.RTC_Date = days; RTC_DateStruct.RTC_Month = month; RTC_DateStruct.RTC_Year = year - 2000;

// 设置RTC时间和日期 
    RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct); 
    RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct); }

int main() 
{
    
    // 初始化UART串口 
    uart_init();

   // 连接ESP8266到Wi-Fi
    connect_to_wifi();

// 获取NTP时间 
    uint32_t ntp_time; get_ntp_time(&ntp_time);

// 将时间设置到
    RTC set_rtc_time(ntp_time);

while (1) {
    // 做其他的事情... } }
目录
相关文章
|
计算机视觉
案例分享:Qt用于服务器多图像拼接存在误差的标定工具(像素误差校准)
案例分享:Qt用于服务器多图像拼接存在误差的标定工具(像素误差校准)
|
4天前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
82 0
|
4天前
|
存储 弹性计算 固态存储
阿里云服务器CPU内存配置详细指南,如何选择合适云服务器配置?
阿里云服务器配置选择涉及CPU、内存、公网带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型e实例,如2核2G3M配置,适合低流量网站。企业用户则应选择企业级独享型ECS,如通用算力型u1、计算型c7或通用型g7,至少2核4G配置,公网带宽建议5M,系统盘可选SSD或ESSD云盘。选择时考虑实际应用需求和性能稳定性。
149 6
|
2天前
|
弹性计算 运维 安全
阿里云ecs使用体验
整了台服务器部署项目上线
|
4天前
|
弹性计算
阿里云ECS的使用心得
本文主要讲述了我是如何了解到ECS,使用ECS的一些经验,以及自己的感悟心得
|
4天前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。
|
4天前
|
存储 弹性计算 固态存储
阿里云服务器租用价格参考,云服务器收费标准与实时活动价格整理
阿里云服务器租用价格参考,本文更新了阿里云服务器最新的租赁费用,包括云服务器实时的活动价格与云服务器收费标准。经济型e实例云服务器4核16G10M带宽配置30.00元/1个月、90.00元/3个月,独享型通用算力型u1实例2核4G服务器仅需199元1年,轻量云服务器2核2G新用户专享价格61元/1年,计算型c7a实例2核4G配置特惠价625.68元/1年。更多阿里云服务器热门配置活动价格及云服务器租赁费用及活动价格见下文。
阿里云服务器租用价格参考,云服务器收费标准与实时活动价格整理
|
4天前
|
弹性计算 运维 安全
阿里云ecs使用体验
整了台服务器部署项目上线
|
4天前
|
负载均衡 固态存储 Linux
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考
轻量应用服务器、云服务器、gpu云服务器是阿里云服务器产品中,比较热门的云服务器产品类型,不同类型的云服务器产品收费模式与收费标准是不一样的,本文为大家展示这几个云服务器产品的最新收费标准情况,以供参考。
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考
|
4天前
|
弹性计算 负载均衡 容灾
应用阿里云弹性计算:打造高可用性云服务器ECS架构
阿里云弹性计算助力构建高可用云服务器ECS架构,通过实例分布、负载均衡、弹性IP、数据备份及多可用区部署,确保业务连续稳定。自动容错和迁移功能进一步增强容灾能力,提供全方位高可用保障。
71 0

热门文章

最新文章