Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PHY_LAN8720A
LWIP
NTP_网络校时
RT-Thread 在 Lan8720a 和 lwip基础上移植ntp
发布于 2023-02-15 09:47:52 浏览:927
订阅该版
开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2。以**RT-Thread中Lan8720和lwip协议栈的使用**文章创建的工程为基础。 ntp代码参考网上的例程,[参考1](https://blog.csdn.net/u014470361/article/details/79142221);[参考2](https://blog.csdn.net/C3080844491/article/details/77934050)。 新建ntptest.c测试文件,移植以上参考的ntp代码,整理后如下: ``` #include
#include
#define SERVER_IP "114.67.237.130" #define SERVER_PORT 123 #define TIMEOUT 10 //宏定义 #define NTP_TIMESTAMP_DELTA 2208988800ull //number of seconds between 1900 and 1970,1900-1970的时间差 #define SEC_TIME_ZONE + (8*60*60) //Beijing,GMT+8, 时区差 typedef struct { uint8_t li_vn_mode; // Eight bits. li, vn, and mode. // li. Two bits. Leap indicator. // vn. Three bits. Version number of the protocol. // mode. Three bits. Client will pick mode 3 for client. uint8_t stratum; // Eight bits. Stratum level of the local clock. uint8_t poll; // Eight bits. Maximum interval between successive messages. uint8_t precision; // Eight bits. Precision of the local clock. uint32_t rootDelay; // 32 bits. Total round trip delay time. uint32_t rootDispersion; // 32 bits. Max error aloud from primary clock source. uint32_t refId; // 32 bits. Reference clock identifier. uint32_t refTm_s; // 32 bits. Reference time-stamp seconds. uint32_t refTm_f; // 32 bits. Reference time-stamp fraction of a second. uint32_t origTm_s; // 32 bits. Originate time-stamp seconds. uint32_t origTm_f; // 32 bits. Originate time-stamp fraction of a second. uint32_t rxTm_s; // 32 bits. Received time-stamp seconds. uint32_t rxTm_f; // 32 bits. Received time-stamp fraction of a second. uint32_t txTm_s; // 32 bits and the most important field the client cares about. Transmit time-stamp seconds. uint32_t txTm_f; // 32 bits. Transmit time-stamp fraction of a second. } ntp_packet; // Total: 48 bytes. int sockfd=-1; int maxfd1; fd_set readfds; struct timeval timeout; struct sockaddr_in servaddr; int len; int i; uint8_t buf[48]; long local_timestamp;//uint32_t local_timestamp; ntp_packet packet ; struct tm * Net_time; uint8_t NTP_Data[48]; //48字节的报文 int bsp_ntp_init(void) { NTP_Data[0]=0xa3; //00100011, 0xa3,100 版本4 //00011011, 0x1b,011 版本3 //00010011, 0x13,010 版本2 //00001011, 0x0b,001 版本1 //后面分别发送了4个不同版本,都可以收到数据。 for(i=1;i<48;i++)NTP_Data[i]=0;//剩余的47字节为0 // servaddr.sin_family = AF_INET; // servaddr.sin_port = htons(SERVER_PORT); // servaddr.sin_addr.s_addr = inet_host(SERVER_IP); servaddr.sin_family = AF_INET; inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr.s_addr); servaddr.sin_port = htons(SERVER_PORT); if(sockfd>0) { //close(sockfd); closesocket(sockfd); sockfd=-1; } if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { return -1; } if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) != 0) { //close(sockfd); closesocket(sockfd); sockfd=-1; return -1; } return 0; } int bsp_read_ntp(void) { if(sockfd<0) { if(bsp_ntp_init()<0) { rt_kprintf("sockfd is err\n"); return -1; } } send(sockfd, NTP_Data, sizeof(NTP_Data), 0); rt_kprintf("send \n"); FD_ZERO(&readfds); FD_SET(sockfd, &readfds); maxfd1 = sockfd + 1; timeout.tv_sec = TIMEOUT; timeout.tv_usec = 0; if (select(maxfd1, &readfds, NULL, NULL, &timeout) > 0) { if (FD_ISSET(sockfd, &readfds)) { if ((len = recv(sockfd, buf, sizeof(buf), 0)) < 0) { //close(sockfd); closesocket(sockfd); sockfd=-1; return -1; } packet.txTm_s = buf[40]<<24 | buf[40+1]<<16|buf[40+2]<<8 |buf[40+3];//由于本文的时间精度要求不高,故自己用服务器返回的时间作为对时的时间,并未用公式:时间差offset=((T2-T1)+(T3-T4))/2。而是用T3作为对时基准时间。 local_timestamp = packet.txTm_s - NTP_TIMESTAMP_DELTA;//减去1970和1900的差值 rt_kprintf( "unix_timestamp=%ld\n",local_timestamp); local_timestamp +=SEC_TIME_ZONE; //加上北京的时间差,GMT+8 Net_time = localtime(&local_timestamp); //秒数转换位标准时间 rt_kprintf("%d-%d-%d %d:%d:%d\r\n",(Net_time->tm_year)+1900, (Net_time->tm_mon)+1, Net_time->tm_mday, Net_time->tm_hour,Net_time->tm_min,Net_time->tm_sec); //打印出时间 } } return 0; } ``` 主函数调用,代码如下: ``` extern int bsp_ntp_init(void); extern int bsp_read_ntp(void); int main(void) { int count = 1; rt_thread_mdelay(5000); bsp_ntp_init(); while (count++) { LOG_D("Hello RT-Thread!"); rt_thread_mdelay(1000); bsp_read_ntp(); } return RT_EOK; } ``` 编译无报错,下载测试,测试结果如下:  选择其中一个时间戳,利用时间戳转换工具比对,结果如下:  结果正常。
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
YZRD
这家伙很懒,什么也没写!
文章
26
回答
226
被采纳
20
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
{lwip}使能RT_LWIP_DHCP时可以获取到ip
3
stm32f103 LWIP 2.0.2 TCP收发问题
4
lwip2.1不重启修改IP
5
关于网络协议栈的测试
6
可否将LWIP升级到2.1.2 和 2.0.3?
7
socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
8
tcpclient 插拔网线问题?
9
两个tcpclient同时通讯可以吗?
10
SO_BINDTODEVICE 未定义该如何解决
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
10
个答案
3
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
lizimu
2
篇文章
7
次点赞
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部