You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/hk/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md

9.6 KiB

使用互聯網控制你的夜燈 - Wio Terminal

物聯網設備需要編寫程式碼,通過 MQTT 與 test.mosquitto.org 通信,發送光感應器讀取的遙測值,並接收控制 LED 的指令。

在本課程的這部分,你將把 Wio Terminal 連接到 MQTT broker。

安裝 WiFi 和 MQTT Arduino 庫

為了與 MQTT broker 通信,你需要安裝一些 Arduino 庫來使用 Wio Terminal 的 WiFi 芯片,並與 MQTT 通信。在開發 Arduino 設備時你可以使用大量的開源庫這些庫實現了多種功能。Seeed 提供了 Wio Terminal 的 WiFi 通信庫。其他開發者也發布了與 MQTT broker 通信的庫,你將使用這些庫來操作你的設備。

這些庫以源代碼的形式提供,可以自動導入到 PlatformIO 並編譯到你的設備中。這樣Arduino 庫可以在任何支持 Arduino 框架的設備上運行,前提是設備具有該庫所需的特定硬件。一些庫,例如 Seeed WiFi 庫,是針對特定硬件的。

庫可以全局安裝並在需要時編譯,也可以安裝到特定項目中。對於這次任務,庫將安裝到項目中。

你可以在 PlatformIO 庫文檔 中了解更多關於庫管理以及如何查找和安裝庫的信息。

任務 - 安裝 WiFi 和 MQTT Arduino 庫

安裝 Arduino 庫。

  1. 在 VS Code 中打開夜燈項目。

  2. platformio.ini 文件的末尾添加以下內容:

    lib_deps =
        seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5
        seeed-studio/Seeed Arduino FS @ 2.1.1
        seeed-studio/Seeed Arduino SFUD @ 2.0.2
        seeed-studio/Seeed Arduino rpcUnified @ 2.1.3
        seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1
    

    這將導入 Seeed WiFi 庫。@ <number> 語法指的是該庫的特定版本號。

    💁 你可以刪除 @ <number> 以始終使用最新版本的庫,但不能保證最新版本的庫能與下面的代碼正常運行。這裡的代碼已經使用該版本的庫進行測試。

    這就是添加庫所需的全部操作。下次 PlatformIO 編譯項目時,它將下載這些庫的源代碼並編譯到你的項目中。

  3. lib_deps 中添加以下內容:

    knolleary/PubSubClient @ 2.8
    

    這將導入 PubSubClient,一個 Arduino MQTT 客戶端。

連接到 WiFi

現在可以將 Wio Terminal 連接到 WiFi。

任務 - 連接到 WiFi

將 Wio Terminal 連接到 WiFi。

  1. src 文件夾中創建一個名為 config.h 的新文件。你可以通過選擇 src 文件夾或其中的 main.cpp 文件,然後在資源管理器中選擇 新文件 按鈕來完成。當你的光標位於資源管理器上時,該按鈕才會出現。

    新文件按鈕

  2. 在該文件中添加以下代碼以定義 WiFi 憑據的常量:

    #pragma once
    
    #include <string>
    
    using namespace std;
    
    // WiFi credentials
    const char *SSID = "<SSID>";
    const char *PASSWORD = "<PASSWORD>";
    

    <SSID> 替換為你的 WiFi SSID。將 <PASSWORD> 替換為你的 WiFi 密碼。

  3. 打開 main.cpp 文件。

  4. 在文件頂部添加以下 #include 指令:

    #include <PubSubClient.h>
    #include <rpcWiFi.h>
    #include <SPI.h>
    
    #include "config.h"
    

    這將包含你之前添加的庫的頭文件以及配置頭文件。這些頭文件是必需的,用於告訴 PlatformIO 導入庫中的代碼。如果不顯式包含這些頭文件,某些代碼將不會被編譯,並且你會遇到編譯器錯誤。

  5. setup 函數上方添加以下代碼:

    void connectWiFi()
    {
        while (WiFi.status() != WL_CONNECTED)
        {
            Serial.println("Connecting to WiFi..");
            WiFi.begin(SSID, PASSWORD);
            delay(500);
        }
    
        Serial.println("Connected!");
    }
    

    此代碼在設備未連接到 WiFi 時進行循環,並使用配置頭文件中的 SSID 和密碼嘗試連接。

  6. setup 函數底部,配置引腳後,調用此函數。

    connectWiFi();
    
  7. 將此代碼上傳到你的設備以檢查 WiFi 連接是否正常。你應該能在串行監視器中看到以下內容。

    > Executing task: platformio device monitor <
    
    --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
    --- More details at http://bit.ly/pio-monitor-filters
    --- Miniterm on /dev/cu.usbmodem1101  9600,8,N,1 ---
    --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
    Connecting to WiFi..
    Connected!
    

連接到 MQTT

Wio Terminal 連接到 WiFi 後,可以連接到 MQTT broker。

任務 - 連接到 MQTT

連接到 MQTT broker。

  1. config.h 文件底部添加以下代碼以定義 MQTT broker 的連接詳細信息:

    // MQTT settings
    const string ID = "<ID>";
    
    const string BROKER = "test.mosquitto.org";
    const string CLIENT_NAME = ID + "nightlight_client";
    

    <ID> 替換為一個唯一的 ID該 ID 將用作此設備客戶端的名稱,並在稍後用於此設備發布和訂閱的主題。test.mosquitto.org broker 是公共的,許多人都在使用,包括其他完成此任務的學生。擁有唯一的 MQTT 客戶端名稱和主題名稱可以確保你的代碼不會與其他人的代碼衝突。稍後在創建服務器代碼時,你也需要此 ID。

    💁 你可以使用像 GUIDGen 這樣的網站來生成唯一的 ID。

    BROKER 是 MQTT broker 的 URL。

    CLIENT_NAME 是此 MQTT 客戶端在 broker 上的唯一名稱。

  2. 打開 main.cpp 文件,並在 connectWiFi 函數下方和 setup 函數上方添加以下代碼:

    WiFiClient wioClient;
    PubSubClient client(wioClient);
    

    此代碼使用 Wio Terminal WiFi 庫創建一個 WiFi 客戶端,並使用它創建一個 MQTT 客戶端。

  3. 在此代碼下方添加以下內容:

    void reconnectMQTTClient()
    {
        while (!client.connected())
        {
            Serial.print("Attempting MQTT connection...");
    
            if (client.connect(CLIENT_NAME.c_str()))
            {
                Serial.println("connected");
            }
            else
            {
                Serial.print("Retying in 5 seconds - failed, rc=");
                Serial.println(client.state());
    
                delay(5000);
            }
        }
    }
    

    此函數測試與 MQTT broker 的連接,如果未連接則重新連接。它會在未連接時進行循環,並使用配置頭文件中定義的唯一客戶端名稱嘗試連接。

    如果連接失敗5 秒後重試。

  4. reconnectMQTTClient 函數下方添加以下代碼:

    void createMQTTClient()
    {
        client.setServer(BROKER.c_str(), 1883);
        reconnectMQTTClient();
    }
    

    此代碼為客戶端設置 MQTT broker並設置接收到消息時的回調。然後嘗試連接到 broker。

  5. 在 WiFi 連接後,在 setup 函數中調用 createMQTTClient 函數。

  6. 用以下代碼替換整個 loop 函數:

    void loop()
    {
        reconnectMQTTClient();
        client.loop();
    
        delay(2000);
    }
    

    此代碼首先重新連接到 MQTT broker。這些連接很容易中斷因此定期檢查並在必要時重新連接是值得的。然後調用 MQTT 客戶端的 loop 方法來處理任何在訂閱的主題上接收到的消息。此應用程序是單線程的,因此消息不能在後台線程上接收,因此需要在主線程上分配時間來處理網絡連接上等待的消息。

    最後2 秒的延遲確保光線水平不會發送得太頻繁,並減少設備的功耗。

  7. 將代碼上傳到你的 Wio Terminal並使用串行監視器查看設備連接到 WiFi 和 MQTT。

    > Executing task: platformio device monitor <
    
    source /Users/jimbennett/GitHub/IoT-For-Beginners/1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal/nightlight/.venv/bin/activate
    --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
    --- More details at http://bit.ly/pio-monitor-filters
    --- Miniterm on /dev/cu.usbmodem1201  9600,8,N,1 ---
    --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
    Connecting to WiFi..
    Connected!
    Attempting MQTT connection...connected
    

💁 你可以在 code-mqtt/wio-terminal 文件夾中找到此代碼。

😀 你已成功將設備連接到 MQTT broker。


免責聲明
本文件已使用人工智能翻譯服務 Co-op Translator 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。