我有一个嵌入式板,其中的发行版是基于Yocto的自定义Linux发行版。

我添加了ntp,并通过ntpd通过UMTS 3G加密狗或以太网将时间与通用ntp池同步。

此板与Olimex的一些ESP32 PoE板通过非托管交换机连接。

用途

ESP32板具有传感器,这些传感器收集信息并为其添加时间戳,然后通过以太网将其发送到运行在主嵌入式板上的InfluxDB,使其成为有线传感器网络。 。这些ESP32板上还带有RTC DS3231,所以我希望它们首先从运行在此嵌入式板上的NTP服务器获取时间来同步RTC,然后将信息发送到InfluxDB。

问题


如何在嵌入式板上创建NTP服务器?我可以在ntp.conf文件中添加一行,以用于例如提高服务器的性能。 192.168.4.11的NTP服务器?在我的arduino代码中使用该IP地址,我可以要求提供时间戳记。
如果进行测试,如果我以某种方式在嵌入式主板上设置了NTP服务器,该如何初步测试来自它的时间?是否有命令行实用程序来轮询NTP服务器,以查看时间是否正确(在常规计算机上)?


评论

我知道这个问题的答案是可以接受的,但是我也会考虑时间戳的精确度,以及从没有时间戳的ESP32开发板发送数据并将其添加到主菜单中是否更简单板。就个人而言,由于我通常将数据存储在MySQL或SQLite中,因此我通过声明诸如time_stamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP之类的列来让数据库为我处理。除非我需要微秒的精度,否则数据库代码已经编写并且调试良好;为什么要编写我自己的错误?

#1 楼

查询的精确描述

初始NTP时间同步



在Yocto构建系统中,在conf/local.conf下添加ntp配方,如下所示:

 IMAGE_INSTALL_append = " ntp"



在目标板上,首先停止systemd服务:

 systemctl stop ntp



假设板是连接到互联网:

  ntpd -gq


信息:使用date检查时间


为了安全起见,还将硬件时钟同步到NTP时间:

 hwclock -w --localtime



重新启动systemd服务

 systemctl start ntp



设置一个嵌入式板上的本地NTP服务器



停止systemd服务:

 systemctl stop ntp



编辑/etc/ntp.conf,以使嵌入式板在端口123上广播NTP时间戳。添加以下行:

 # Here the IP Address could that of your board but make sure to use
 # Broadcast address (x.x.x.255) and if you have a larger network
 # select your subnet masks accordingly
 broadcast 192.168.1.255 



重新启动systemd服务:

systemctl start ntp



使用传感器编号实现时间同步des


假设其中有一块可以用Arduino编程的板子;下载NTPClient Arduino库。

在您的Sketch中,使用NTPClient构造函数通过其IP地址连接到本地NTP服务器。

NTPClient timeServer(ntpUDP, "192.168.1.123", 0, 60000);



并从本地NTP服务器获取时间戳

参考文献


NTPClient Arduino库
询问@hardillb的答案提到的Ubuntu SE查询以上


#2 楼

为了回答您的拳头问题,我将指向“询问Ubuntu”答案:

https://askubuntu.com/questions/14558/how-do-i-setup-a-local-ntp-server

它是Ubuntu特有的,但应该为您指出在Yocto上搜索哪些软件包的正确方向。

第二,ntpdate <ip address of ntp server>可用于向ntp服务器查询日期。