Raspberry Pi 的應用 - 透過 GPS 衛星來校正系統時間

by 1/28/2015 0 意見

由於 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 校時法 ...

參考資料


圖片來源


更新紀錄

  • 2015/01/28 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

0 意見 :

張貼留言