由於 Raspberry Pi 無法儲存時間資料,所以每次開機都必須呼叫網路校時協定 (Network Time Protocol),透過網際網路連線與 NTP 伺服器進行時間的校正。
可是,當我們身在無網路的環境,或是網路中斷的狀況下,要怎麼進行校時呢???
事前準備
- Raspberry Pi Type A / A+ /B / B+。
- Raspbian 作業系統。
- GPS 接收器,這裡是用 USB 介面的 Altina GGM 309 做示範,藍牙介面亦可,不過必須再接上 USB 介面的藍牙傳輸器;或是用 URAT 自己轉接 GPS 晶片。
安裝服務
我們需要利用 GPSd 這個套件來接收 GPS 的訊號,官方套件庫已經收錄了,所以直接用 apt-get 指令安裝就可以了。
sudo apt-get install gpsd gpsd-clients
目前最新的版本是 3.11,可以到 gpsd - releases 下載,再自行編譯安裝。
設定 GPS
先確認一下 GPS 接收器已正確的被系統偵測到。
lsusb
取得目前位置的 GPS 資訊。
cgps -s
如果出現「cgps: GPS timeout」的錯誤訊息,代表 gpsd 沒有偵測到 GPS 接收器。
把 gpsd 服務強制重新啟動。
sudo killall gpsd
sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
修改 gpsd 的設定檔,不建議用 vi 直接修改 /etc/default/gpsd。
sudo dpkg-reconfigure gpsd
讓 gpsd 開機時自動啟動。
讓 gpsd 自動掛載 GPS 接收器。
指定 GPS 接收器的路徑,USB 介面 GPS 接收器的設備是 /dev/ttyUSB0,請依照實際環境修改。
如果要額外指定 gpsd 的參數,可以在這裡輸入,不可指定「-F」參數。
指定「-F」參數的 socket 檔案路徑。
重新啟動 gpsd 服務。
sudo service gpsd restart
使用 GPS 校時程式
國外的網友用 Python 寫了一支 GPS Time 的校時程式。
我們可以在 gpstime - Downloads 找到下載連結。
把它複製下來,回到 shell 進行下載。
wget https://gpstime.googlecode.com/files/gpstime.tar.gz
將壓縮檔解開。
tar zxvf gpstime.tar.gz
直接執行就可以了。
python gpstime.py
不過,校時後的時間與台灣有八個小時的時差,所以我們要動一下手腳。
sudo vi gpstime/gpstime.py
找到「os.system('sudo date --set="%s"' % gpstime)」,在下面加一行「os.system('sudo date --set=\'+ 8 hour\'')」
這時候,在無網路連線的環境, 系統時間就可以靠 GPS 訊號自動更新成正確的時間。
最後,只要在系統排程中,設定每天晚上 12 點校時,就可以確保 Raspberry Pi 的系統時間一定會是正確的。
sudo vi /etc/crontab
待處理問題
- 爬了很多文,試了很多種方法,就是沒有辦法讓 NTP 抓到 GPS 的時間,目前暫時放棄 NTP 的 GPS 校時法 ...
參考資料
- Peter Mount's Blog - Getting GPS to work on a Raspberry PI
- David & Cecilia Taylor's Web Pages -The Raspberry Pi as a Stratum-1 NTP Server
- XMission - Building a Stratum 1 NTP Server with a Raspberry Pi
- Open Collector - Raspberry Flavored Time (a NTP Server on Your Pi, Tethered to a GPS Unit)
- vanheusden.com - rpi_gpio_ntp
- https://code.google.com/p/gpstime/
- http://www.element14.com/community/message/68918#68918/l/re-difficulties-using-ntp-with-a-gps-raspberry-pi-help
圖片來源
更新紀錄
- 2015/01/28 撰文。
0 意見 :
張貼留言