跳至主要内容

讀取 GPS 數據 - 虛擬物聯網硬體

在本課程的這一部分,你將向虛擬物聯網設備添加一個 GPS 傳感器,並從中讀取數據。

虛擬硬體

虛擬物聯網設備將使用一個模擬的 GPS 傳感器,該傳感器可以通過 UART 串口訪問。

物理 GPS 傳感器將有一個天線來接收來自 GPS 衛星的無線電波,並將 GPS 信號轉換為 GPS 數據。虛擬版本通過允許你設置緯度和經度、發送原始 NMEA 語句或上傳包含多個位置的 GPX 文件來模擬這一過程,這些位置可以依次返回。

🎓 NMEA 語句將在本課程後面介紹

向 CounterFit 添加傳感器

要使用虛擬 GPS 傳感器,你需要向 CounterFit 應用程序添加一個

任務 - 向 CounterFit 添加傳感器

將 GPS 傳感器添加到 CounterFit 應用程序中。

  1. 在你的電腦上創建一個名為 gps-sensor 的新 Python 應用程序,該應用程序包含一個名為 app.py 的文件和一個 Python 虛擬環境,並添加 CounterFit pip 包。

    ⚠️ 如果需要,你可以參考在課程 1 中創建和設置 CounterFit Python 項目的說明

  2. 安裝一個額外的 Pip 包來安裝一個 CounterFit shim,它可以通過串行連接與基於 UART 的傳感器通信。確保你在啟動虛擬環境的終端中安裝此包。

    pip install counterfit-shims-serial
  3. 確保 CounterFit 網頁應用程序正在運行

  4. 創建一個 GPS 傳感器:

    1. Sensors 面板的 Create sensor 框中,打開 Sensor type 下拉框並選擇 UART GPS

    2. Port 保持設置為 /dev/ttyAMA0

    3. 選擇 Add 按鈕以在端口 /dev/ttyAMA0 上創建 GPS 傳感器

    GPS 傳感器設置

    GPS 傳感器將被創建並出現在傳感器列表中。

    創建的 GPS 傳感器

編程 GPS 傳感器

虛擬物聯網設備現在可以編程以使用虛擬 GPS 傳感器。

任務 - 編程 GPS 傳感器

編程 GPS 傳感器應用程序。

  1. 確保 gps-sensor 應用程序在 VS Code 中打開

  2. 打開 app.py 文件

  3. app.py 文件的頂部添加以下代碼以將應用程序連接到 CounterFit:

    from counterfit_connection import CounterFitConnection
    CounterFitConnection.init('127.0.0.1', 5000)
  4. 在此代碼下方添加以下代碼以導入一些需要的庫,包括 CounterFit 串行端口的庫:

    import time
    import counterfit_shims_serial

    serial = counterfit_shims_serial.Serial('/dev/ttyAMA0')

    此代碼從 counterfit_shims_serial Pip 包中導入 serial 模塊。然後它連接到 /dev/ttyAMA0 串行端口 - 這是虛擬 GPS 傳感器用於其 UART 端口的串行端口地址。

  5. 在此代碼下方添加以下代碼以從串行端口讀取並將值打印到控制台:

    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 秒鐘,然後再次嘗試。

  6. 運行此代碼,確保你使用的終端與 CounterFit 應用程序運行的終端不同,以便 CounterFit 應用程序保持運行。

  7. 從 CounterFit 應用程序更改 GPS 傳感器的值。你可以通過以下方式之一進行更改:

    • Source 設置為 Lat/Lon,並設置明確的緯度、經度和用於獲取 GPS 定位的衛星數量。此值將僅發送一次,因此選中 Repeat 框以使數據每秒重複一次。

      選擇了緯度經度的 GPS 傳感器

    • Source 設置為 NMEA 並在文本框中添加一些 NMEA 語句。所有這些值將被發送,每個新的 GGA(位置修正)語句可以被讀取之前有 1 秒的延遲。

      設置了 NMEA 語句的 GPS 傳感器

      你可以使用像 nmeagen.org 這樣的工具通過在地圖上繪製來生成這些語句。這些值將僅發送一次,因此選中 Repeat 框以使數據在全部發送後每秒重複一次。

    • Source 設置為 GPX 文件,並上傳包含軌跡位置的 GPX 文件。你可以從許多流行的地圖和徒步網站(如 AllTrails)下載 GPX 文件。這些文件包含多個 GPS 位置作為軌跡,GPS 傳感器將每秒返回一個新位置。

      設置了 GPX 文件的 GPS 傳感器

      這些值將僅發送一次,因此選中 Repeat 框以使數據在全部發送後每秒重複一次。

    配置 GPS 設置後,選擇 Set 按鈕將這些值提交到傳感器。

  8. 你將看到來自 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 傳感器程序成功了!