为子网中的 Arduino 板制作嵌入式板 NTP 服务器

物联网 阿杜伊诺 linux
2021-06-10 03:45:07

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

我已经添加ntp并通过ntpd我将通过 UMTS 3G 加密狗或以太网与常见的 ntp 池同步时间。

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

目的

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

问题

  1. 如何在嵌入式板上创建 NTP 服务器?我可以在ntp.conf文件中添加一行,用于加强服务器,例如 NTP 服务器192.168.4.11吗?在我的 arduino 代码中使用这个 IP 地址我可以要求时间戳

  2. 在测试的情况下,如果我以某种方式在嵌入式板上设置了 NTP 服务器,我如何最初测试来自它的时间?是否有命令行实用程序可以轮询 NTP 服务器并查看在普通计算机上的时间是否正确?

2个回答

查询的精确描述

初始 NTP 时间同步

  1. 在 Yocto 构建系统下conf/local.conf添加ntp配方如下:

     IMAGE_INSTALL_append = " ntp"
    
  2. 在目标板上最初停止systemd服务:

     systemctl stop ntp
    
  3. 假设板已连接到互联网:

      ntpd -gq
    

    信息:检查时间使用date

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

     hwclock -w --localtime
    
  5. 重启systemd服务

     systemctl start ntp
    

在嵌入式板上设置本地 NTP 服务器

  1. 停止systemd服务:

     systemctl stop ntp
    
  2. 编辑/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 
    
  3. 重启systemd服务:

    systemctl start ntp
    

与传感器节点实现时间同步

  1. 假设一个板子可以用 Arduino 编程;下载NTPClientArduino 库。

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

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

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

参考

要回答您的第一个问题,我将指出这个 Ask Ubuntu 答案:

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

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

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