跳至主要内容

通過互聯網控制你的夜燈 - Wio Terminal

物聯網設備需要編寫代碼,使用MQTT與test.mosquitto.org通信,發送光傳感器讀數的遙測值,並接收控制LED的命令。

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

安裝WiFi和MQTT Arduino庫

要與MQTT代理通信,你需要安裝一些Arduino庫,以使用Wio Terminal中的WiFi芯片,並與MQTT通信。在為Arduino設備開發時,你可以使用範圍廣泛的庫,這些庫包含開源代碼並實現了大量功能。Seeed發布了Wio Terminal的庫,使其能夠通過WiFi通信。其他開發者發布了與MQTT代理通信的庫,你將使用這些庫與你的設備通信。

這些庫以源代碼形式提供,可以自動導入到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憑據
    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代理。

任務 - 連接到MQTT

連接到MQTT代理。

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

    // MQTT設置
    const string ID = "<ID>";

    const string BROKER = "test.mosquitto.org";
    const string CLIENT_NAME = ID + "nightlight_client";

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

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

    BROKER是MQTT代理的URL。

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

  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代理的連接,如果未連接則重新連接。它在未連接時循環,並嘗試使用配置頭文件中定義的唯一客戶端名稱進行連接。

    如果連接失敗,它將在5秒後重試。

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

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

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

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

  6. 用以下內容替換整個loop函數:

    void loop()
    {
    reconnectMQTTClient();
    client.loop();

    delay(2000);
    }

    此代碼首先重新連接到MQTT代理。這些連接很容易中斷,因此值得定期檢查並在必要時重新連接。然後它調用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代理。