網路上已有很多的 NTP 校時資訊,而以下的內容是建立自己的校時伺服器(NTP server),供給其他儀器使用。
為什麼要有自己的 NTP server?因為網路上的 NTP server 距離你需要校時的儀器可能很遙遠,會產生較大的延遲與誤差,被校時的儀器距離 NTP server 越近越好,最好在同一個區域網路底下。而如果有諸多儀器需要校時,使用同一個 NTP server 當然是最好的。因此我們可能會有需要自己建立 NTP server 的時候。
NTP server 的建立很簡單,在 linux 底下執行
sudo apt-get install ntp #安裝
sudo service ntp start #執行ntp服務
ntpq -p # 查看ntp server的狀況
其他設定
sudo vim /etc/ntp.conf #裡面可以更改其他校時伺服器的選擇
----------------------------------------------------------------------------
以上是網路上最常見最簡單的 NTP server 資料,但在某些情況下我們會沒有網路進行校時。那就要依靠 PPS 訊號或是 GPS 訊號協助校時。在有網路的情況下,有這兩項技術也可以幫助校時。
GPS 校時需要有一塊 GPS 晶片透過 UART 或是 I2C 等通訊方法,把資訊傳進樹莓派,然後使用gpsd 等服務配合NTP進行校時,確切設定也在 /etc/ntp.conf 中。
----------------------------------------------------------------------------
PPS 是 Pulse-per-second 每秒一次訊號的意思。比方手錶內的石英晶片,會傳出固定的振動頻率,有了這個頻率我們就可以精確的執行校時。其實原子鐘也是類似的原理,人類的校時技術目前大概就只能透過精確的測量頻率。
PPS 功能通常附加在 RTC 晶片或 GPS 晶片底下,而樹莓派這兩個都沒有,我買了一個DS3231 RTC 原本要用來做樹莓派的時鐘,但後來發現中國製的晶片會有問題,只能拿來做 PPS 訊號源。
------------------------------------------------------------------------
DS2321是 I2C 界面的晶片,插入樹莓派的 GPIO 後,如要正常使用 RTC#config i2c device
sudo apt-get install i2c-tools
sudo bash
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device #寫入註冊
exit
i2cdetect -y 1 #偵測位置是否正確
sudo i2cdump -f -y 1 0x68 #查看裝置內容
sudo i2cset -f -y 1 0x68 0x0e 0x00 #更改裝置內容成00,才能啟用PPS腳位
sudo reboot
#hwclock
sudo heclock -r #讀取實時時鐘
sudo heclock -w #把現在時間寫入實時時鐘
timdatectl #查看時間資訊
------------------------------------------------------------------------
若要有PPS的功能還需以下#install
sudo apt-get install vim pps-tools i2c-tools #安裝套件
#config pps gpio pin 設定 gpio 4為pps訊號源
sudo vim /boot/config.txt #修改並加入下一行
dtoverlay=pps-gpio,gpiopin=4
#config pps modules #開機啟用pps模組
sudo vim /etc/modules #修改並加入下一行
pps-gpio
sudo reboot
#see mod exist?
lsmod
#pps test
sudo ppstest /dev/pps0 #若有穩定訊號產生就代表成功了
------------------------------------------------------------------------
結合NTP與PPS功能
通常NTP沒有PPS的功能,需要重新下載並編譯
#re-built ntp for pps
mkdir ntp
cd ntp
sudo apt-get install libcap-dev
sudo apt-get install libssl-dev
wget http://archive.ntp.org/ntp4/ntp-dev/ntp-dev-4.3.93.tar.gz # development
(May redirect to: https://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-dev/)
tar xvfz ntp-dev-4.3.93.tar.gz
cd ntp-dev-4.3.93
./configure --enable-linuxcaps # takes 11-15 minutes
make -j5
sudo apt-get remove ntp #請務必移除舊的
sudo make install
sudo /etc/init.d/ntp stop
sudo cp /usr/local/bin/ntp* /usr/bin/ && sudo cp /usr/local/sbin/ntp* /usr/sbin/
sudo /etc/init.d/ntp start
ntpq -crv -pn # optional step to check for version and basic function
安裝完後進入設定
#ntp server config
sudo vim /etc/ntp.conf
server 127.127.22.0 minpoll 4 maxpoll 4 #加入pps訊號源,他是使用保留ip作為來源
fudge 127.127.22.0 refid PPS #重新命名成PPS
sudo service ntp restart
ntpq -p #理論上就可以看到PPS了
------------------------------------------------------------------------
~$ ntpq -p
remote refid st t when poll reach delay offset jitter
=========================================================
*ntp.ntu.edu.tw .GPS. 1 u 18 32 377 9.243 0.224 0.387
+ntp2.ntu.edu.tw .GPS. 1 u 25 32 377 9.183 0.107 0.579
+118-163-81-61.H 192.168.0.3 2 u 34 64 377 9.691 0.438 0.791
-211-22-103-158. 192.168.0.2 2 u 35 64 377 10.192 1.762 0.274
-118-163-81-63.H 192.168.0.3 2 u 47 64 377 10.081 1.215 0.514
ntpq -p前段看到的服到代表目前對這個NTP來源的使用狀態(http://doc.ntp.org/4.1.0/ntpq.htm)
space reject 無法使用,無法聯繫上
x falsetick 拒絕,因為某些原因被演算法拒用
. excess 在第十名之外的候選者
- outlyer 演算法認為此訊號是偏移值
+ candidat 此訊號源存活並被列入演算法使用的候選之中
# selected 此訊號源存活但未在前六名之中
* sys.peer 系統時間的優先比對者
o pps.peer PPS訊號專用的符號
執行 make -j5後,出現錯誤如下
回覆刪除error: storage size of ‘ctx’ isn’t known
warning: unused variable ‘ctx’ [-Wunused-variable]
[Makefile:597: all] Error 2
請問要修改哪裡的CTX 變數?