讀取 GPS 數據 - 虛擬物聯網硬體
在本課程的這一部分,你將向虛擬物聯網設備添加一個 GPS 傳感器,並從中讀取數據。
虛擬硬體
虛擬物聯網設備將使用一個模擬的 GPS 傳感器,該傳感器可以通過 UART 串口訪問。
物理 GPS 傳感器將有一個天線來接收來自 GPS 衛星的無線電波,並將 GPS 信號轉換為 GPS 數據。虛擬版本通過允許你設置緯度和經度、發送原始 NMEA 語句或上傳包含多個位置的 GPX 文件來模擬這一過程,這些位置可以依次返回。
🎓 NMEA 語句將在本課程後面介紹
向 CounterFit 添加傳感器
要使用虛擬 GPS 傳感器,你需要向 CounterFit 應用程序添加一個
任務 - 向 CounterFit 添加傳感器
將 GPS 傳感器添加到 CounterFit 應用程序中。
-
在你的電腦上創建一個名為
gps-sensor
的新 Python 應用程序,該應用程序包含一個名為app.py
的文件和一個 Python 虛擬環境,並添加 CounterFit pip 包。⚠️ 如果需要,你可以參考在課程 1 中創建和設置 CounterFit Python 項目的說明。
-
安裝一個額外的 Pip 包來安裝一個 CounterFit shim,它可以通過串行連接與基於 UART 的傳感器通信。確保你在啟動虛擬環境的終端中安裝此包。
pip install counterfit-shims-serial
-
確保 CounterFit 網頁應用程序正在運行
-
創建一個 GPS 傳感器:
-
在 Sensors 面板的 Create sensor 框中,打開 Sensor type 下拉框並選擇 UART GPS。
-
將 Port 保持設置為 /dev/ttyAMA0
-
選擇 Add 按鈕以在端口
/dev/ttyAMA0
上創建 GPS 傳感器
GPS 傳感器將被創建並出現在傳感器列表中。
-
編程 GPS 傳感器
虛擬物聯網設備現在可以編程以使用虛擬 GPS 傳感器。
任務 - 編程 GPS 傳感器
編程 GPS 傳感器應用程序。
-
確保
gps-sensor
應用程序在 VS Code 中打開 -
打開
app.py
文件 -
在
app.py
文件的頂部添加以下代碼以將應用程序連接到 CounterFit:from counterfit_connection import CounterFitConnection
CounterFitConnection.init('127.0.0.1', 5000) -
在此代碼下方添加以下代碼以導入一些需要的庫,包括 CounterFit 串行端口的庫:
import time
import counterfit_shims_serial
serial = counterfit_shims_serial.Serial('/dev/ttyAMA0')此代碼從
counterfit_shims_serial
Pip 包中導入serial
模塊。然後它連接到/dev/ttyAMA0
串行端口 - 這是虛擬 GPS 傳感器用於其 UART 端口的串行端口地址。 -
在此代碼下方添加以下代碼以從串行端口讀取並將值打印到控制台:
def print_gps_data(line):
print(line.rstrip())
while True:
line = serial.readline().decode('utf-8')
while len(line) > 0:
print_gps_data(line)
line = serial.readline().decode('utf-8')
time.sleep(1)定義了一個名為
print_gps_data
的函數,該函數將傳遞給它的行打印到控制台。接下來,代碼無限循環,每次循環從串行端口讀取盡可能多的文本行。它為每行調用
print_gps_data
函數。在讀取完所有數據後,循環休眠 1 秒鐘,然後再次嘗試。
-
運行此代碼,確保你使用的終端與 CounterFit 應用程序運行的終端不同,以便 CounterFit 應用程序保持運行。
-
從 CounterFit 應用程序更改 GPS 傳感器的值。你可以通過以下方式之一進行更改:
-
將 Source 設置為
Lat/Lon
,並設置明確的緯度、經度和用於獲取 GPS 定位的衛星數量。此值將僅發送一次,因此選中 Repeat 框以使數據每秒重複一次。 -
將 Source 設置為
NMEA
並在文本框中添加一些 NMEA 語句。所有這些值將被發送,每個新的 GGA(位置修正)語句可以被讀取之前有 1 秒的延遲。你可以使用像 nmeagen.org 這樣的工具通過在地圖上繪製來生成這些語句。這些值將僅發送一次,因此選中 Repeat 框以使數據在全部發送後每秒重複一次。
-
將 Source 設置為 GPX 文件,並上傳包含軌跡位置的 GPX 文件。你可以從許多流行的地圖和徒步網站(如 AllTrails)下載 GPX 文件。這些文件包含多個 GPS 位置作為軌跡,GPS 傳感器將每秒返回一個新位置。
這些值將僅發送一次,因此選中 Repeat 框以使數據在全部發送後每秒重複一次。
配置 GPS 設置後,選擇 Set 按鈕將這些值提交到傳感器。
-
-
你將看到來自 GPS 傳感器的原始輸出,如下所示:
$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67
$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67
💁 你可以在 code-gps/virtual-device 文件夾中找到此代碼。
😀 你的 GPS 傳感器程序成功了!