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

251 lines
9.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "d6faf0e8d3c2d6d20c0aef2a305dab18",
"translation_date": "2025-08-26T15:01:17+00:00",
"source_file": "1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md",
"language_code": "hk"
}
-->
# 使用互聯網控制你的夜燈 - 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 庫文檔](https://docs.platformio.org/en/latest/librarymanager/index.html) 中了解更多關於庫管理以及如何查找和安裝庫的信息。
### 任務 - 安裝 WiFi 和 MQTT Arduino 庫
安裝 Arduino 庫。
1. 在 VS Code 中打開夜燈項目。
1.`platformio.ini` 文件的末尾添加以下內容:
```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 編譯項目時,它將下載這些庫的源代碼並編譯到你的項目中。
1.`lib_deps` 中添加以下內容:
```ini
knolleary/PubSubClient @ 2.8
```
這將導入 [PubSubClient](https://github.com/knolleary/pubsubclient),一個 Arduino MQTT 客戶端。
## 連接到 WiFi
現在可以將 Wio Terminal 連接到 WiFi。
### 任務 - 連接到 WiFi
將 Wio Terminal 連接到 WiFi。
1.`src` 文件夾中創建一個名為 `config.h` 的新文件。你可以通過選擇 `src` 文件夾或其中的 `main.cpp` 文件,然後在資源管理器中選擇 **新文件** 按鈕來完成。當你的光標位於資源管理器上時,該按鈕才會出現。
![新文件按鈕](../../../../../translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.hk.png)
1. 在該文件中添加以下代碼以定義 WiFi 憑據的常量:
```cpp
#pragma once
#include <string>
using namespace std;
// WiFi credentials
const char *SSID = "<SSID>";
const char *PASSWORD = "<PASSWORD>";
```
`<SSID>` 替換為你的 WiFi SSID。將 `<PASSWORD>` 替換為你的 WiFi 密碼。
1. 打開 `main.cpp` 文件。
1. 在文件頂部添加以下 `#include` 指令:
```cpp
#include <PubSubClient.h>
#include <rpcWiFi.h>
#include <SPI.h>
#include "config.h"
```
這將包含你之前添加的庫的頭文件以及配置頭文件。這些頭文件是必需的,用於告訴 PlatformIO 導入庫中的代碼。如果不顯式包含這些頭文件,某些代碼將不會被編譯,並且你會遇到編譯器錯誤。
1.`setup` 函數上方添加以下代碼:
```cpp
void connectWiFi()
{
while (WiFi.status() != WL_CONNECTED)
{
Serial.println("Connecting to WiFi..");
WiFi.begin(SSID, PASSWORD);
delay(500);
}
Serial.println("Connected!");
}
```
此代碼在設備未連接到 WiFi 時進行循環,並使用配置頭文件中的 SSID 和密碼嘗試連接。
1.`setup` 函數底部,配置引腳後,調用此函數。
```cpp
connectWiFi();
```
1. 將此代碼上傳到你的設備以檢查 WiFi 連接是否正常。你應該能在串行監視器中看到以下內容。
```output
> 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 的連接詳細信息:
```cpp
// 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](https://www.guidgen.com) 這樣的網站來生成唯一的 ID。
`BROKER` 是 MQTT broker 的 URL。
`CLIENT_NAME` 是此 MQTT 客戶端在 broker 上的唯一名稱。
1. 打開 `main.cpp` 文件,並在 `connectWiFi` 函數下方和 `setup` 函數上方添加以下代碼:
```cpp
WiFiClient wioClient;
PubSubClient client(wioClient);
```
此代碼使用 Wio Terminal WiFi 庫創建一個 WiFi 客戶端,並使用它創建一個 MQTT 客戶端。
1. 在此代碼下方添加以下內容:
```cpp
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 秒後重試。
1.`reconnectMQTTClient` 函數下方添加以下代碼:
```cpp
void createMQTTClient()
{
client.setServer(BROKER.c_str(), 1883);
reconnectMQTTClient();
}
```
此代碼為客戶端設置 MQTT broker並設置接收到消息時的回調。然後嘗試連接到 broker。
1. 在 WiFi 連接後,在 `setup` 函數中調用 `createMQTTClient` 函數。
1. 用以下代碼替換整個 `loop` 函數:
```cpp
void loop()
{
reconnectMQTTClient();
client.loop();
delay(2000);
}
```
此代碼首先重新連接到 MQTT broker。這些連接很容易中斷因此定期檢查並在必要時重新連接是值得的。然後調用 MQTT 客戶端的 `loop` 方法來處理任何在訂閱的主題上接收到的消息。此應用程序是單線程的,因此消息不能在後台線程上接收,因此需要在主線程上分配時間來處理網絡連接上等待的消息。
最後2 秒的延遲確保光線水平不會發送得太頻繁,並減少設備的功耗。
1. 將代碼上傳到你的 Wio Terminal並使用串行監視器查看設備連接到 WiFi 和 MQTT。
```output
> 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](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal) 文件夾中找到此代碼。
😀 你已成功將設備連接到 MQTT broker。
---
**免責聲明**
本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。