透過 MQTT 訊息代理服務,本文示範如何使用 Alexa 語音命令控制 Raspberry Pi 物聯網裝置。首先在 Raspberry Pi 上設定 MQTT 使用者端,訂閱特定主題並監聽來自 Alexa 的訊息。接著,建立一個 Alexa 技能,組態意圖和陳述式,以便接收和理解使用者的語音指令。當使用者發出指令時,Alexa 技能會將指令轉換為 MQTT 訊息,並發布到 Raspberry Pi 訂閱的主題。Raspberry Pi 接收到訊息後,解析指令內容並執行相應的動作,例如控制 LED 燈、馬達或其他連線的裝置。
驗證訊息傳遞
如果您看到 “hello” 在您的 Raspberry Pi 上,則表示您已經成功地傳遞了一個 MQTT 訊息給您的 Pi。恭喜!您已經完成了第一步。
解決問題
如果您遇到問題,請檢查以下幾點:
- 您是否輸入了正確的指令?請注意,指令是區分大小寫的。
- 您是否將正確的憑證複製到正確的目錄中?
- 您是否在程式碼中輸入了正確的憑證路徑?
擴充套件程式碼
現在,我們可以修改 Raspberry Pi 的程式碼,以便在接收到 payload 指令訊息時執行任意動作。例如,我們可以發布以下訊息到 /myPi 主題:
{
"directive": "forward",
"data": "10"
}
在我們的程式碼中,我們可以使用以下語法來提取指令和資料:
command = payload['directive']
distance = payload['data']
建立 Alexa 主機技能
接下來,我們需要建立一個 Alexa 主機技能,以便在使用者說 “hello” 時傳送一個 MQTT 訊息。首先,讓我們建立一個新的 Alexa 主機技能(我將其命名為 “my hosted thing”),並選擇 “從頭開始”。
然後,開啟程式碼標籤,並建立一個名為 certs 的目錄。在此目錄中,建立三個檔案:Amazon-RootCA1.pem、MyThing-certificate.pem.key 和 MyThing-private.pem.key。編輯這些檔案,以便包含您之前下載的憑證。
接下來,編輯 requirements.txt 檔案,以便包含以下內容:
AWSIoTPythonSDK==1.5.2
然後,開啟 lambda.py 檔案,並在程式碼頂部新增以下內容:
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json
在 LaunchRequestHandler 類別之前新增以下內容:
createMQTTClient = AWSIoTMQTTClient("MyThing")
請注意,MyThing 應該與您建立的 Thing 名稱相同。
圖表翻譯:
graph LR
A[使用者說 "hello"] --> B[傳送 MQTT 訊息]
B --> C[執行 Raspberry Pi 程式碼]
C --> D[提取指令和資料]
D --> E[執行動作]
在這個圖表中,我們可以看到使用者說 “hello” 時,會傳送一個 MQTT 訊息給 Raspberry Pi。然後,Raspberry Pi 會執行程式碼,提取指令和資料,並執行相應的動作。
建立物聯網裝置:Raspberry Pi 的應用
在物聯網(IoT)的世界中,Raspberry Pi 是一個非常受歡迎的平臺,用於建立各種智慧裝置。這個小巧的電腦可以連線到網際網路,並執行各種任務,從簡單的感應器監控到複雜的自動化系統。
載入APL檔案
要建立一個IoT裝置,我們需要載入APL(Alexa Presentation Language)檔案。APL是一種用於定義 Alexa 智慧助手的視覺化介面的語言。以下是載入APL檔案的Python函式:
def _load_apl_document(file_path):
"""
載入APL JSON檔案到字典物件中。
"""
with open(file_path) as f:
return json.load(f)
格式化MQTT訊息
在IoT裝置中,MQTT(Message Queuing Telemetry Transport)是一種常用的通訊協定。以下是格式化MQTT訊息的Python函式:
def format_mqtt_message(directive, data):
"""
格式化MQTT訊息。
"""
payload = {}
payload['directive'] = directive
payload['data'] = data
return json.dumps(payload)
傳送MQTT指令
要傳送MQTT指令,我們需要使用以下Python函式:
def send_mqtt_directive(topic, directive, data={}):
"""
傳送MQTT指令。
"""
payload = format_mqtt_message(directive, data)
#...
注意:上述程式碼僅為示例,實際實作可能需要根據具體需求進行修改。
圖表翻譯:
以下是上述程式碼的Mermaid圖表:
flowchart TD
A[載入APL檔案] --> B[格式化MQTT訊息]
B --> C[傳送MQTT指令]
C --> D[處理MQTT回應]
內容解密:
上述程式碼示例瞭如何建立一個IoT裝置,並使用MQTT協定進行通訊。首先,我們需要載入APL檔案,然後格式化MQTT訊息,最後傳送MQTT指令。注意:上述程式碼僅為示例,實際實作可能需要根據具體需求進行修改。
建立物聯網應用:使用 Alexa 和 Raspberry Pi
12.2.5 測試技能
現在,您已經完成了 Alexa 技能的佈署,讓我們測試一下。啟動您的 Raspberry Pi 並執行您的技能:點選「測試」按鈕,然後說「hello」。當使用者說「hello」時,技能會向您的 Pi 傳送一個 MQTT 訊息。
12.3 新增意圖到 Alexa 技能
現在,我們將新增 Alexa 意圖和陳述式。新增一個「MoveDirectionIntent」和一個「StopMovingIntent」。為「Move」新增陳述式:「go {direction}」、「travel {direction}」和「move {direction}」。注意,為了適應機器人和 LED 的命令,我們將包括「go on」和「go off」(或「move on」和「move off」)來開啟和關閉 LED。
12.4 控制機器人
首先,請確認您的硬體是否正常工作。您可以連線一個 LED 到 Raspberry Pi 的 GPIO 17 引腳,或使用 Pimoroni 機器人和 Explorer HAT。
a) LED
連線 LED 的長腿(正極)到 GPIO 17,然後透過一個電阻(例如 1.2 kΩ)連線到 GND。
b) Pimoroni 機器人
安裝軟體:sudo pip3 install explorerhat
測試:cd /home/pi/Pimoroni/explorerhat/examples 然後執行 python test.py
注意,在撰寫本文時,Explorer HAT 的 Python 函式庫不支援最新版本的 Raspberry Pi OS(Bullseye)。
12.5 新增意圖處理器到技能程式碼
現在,我們將編輯技能程式碼以新增意圖:a) 傳送一個指令作為方向(或 LED 開/關),b) 傳送一個指令「stop」。稍後,我們將編輯 Pi 程式碼以控制機器人或 LED。
新增 StopMoving 和 MoveDirection 意圖程式碼:
class StopMovingIntentHandler(AbstractRequestHandler):
"""Handler for stop moving Intent."""
def can_handle(self, handler_input):
# type: (HandlerInput) -> bool
內容解密:
在這個例子中,我們使用 Alexa 技能套件(ASK)建立了一個物聯網應用。ASK 提供了一個框架,讓我們可以建立自定義的 Alexa 技能。我們使用 Python 編寫技能程式碼,並使用 MQTT 通訊協定與 Raspberry Pi 進行通訊。
圖表翻譯:
以下是 Alexa 技能架構的 Mermaid 圖表:
graph LR
A[User] -->| speak | B[Alexa]
B -->| Intent | C[Skill]
C -->| MQTT | D[Raspberry Pi]
D -->| Control | E[Hardware]
這個圖表展示了使用者與 Alexa 之間的互動,Alexa 如何處理意圖並將其轉發給 Raspberry Pi,然後 Raspberry Pi 控制硬體。
處理 Raspberry Pi IoT 裝置的移動Intent
在這個章節中,我們將探討如何處理 Raspberry Pi IoT 裝置的移動Intent。移動Intent是一種特殊的Intent,允許使用者控制裝置的移動。
MoveDirectionIntentHandler 類別
MoveDirectionIntentHandler 類別是用於處理移動Intent的Handler。它繼承自AbstractRequestHandler 類別,並實作了can_handle 和 handle 方法。
class MoveDirectionIntentHandler(AbstractRequestHandler):
"""Handler for move Intent."""
def can_handle(self, handler_input):
# type: (HandlerInput) -> bool
return ask_utils.is_intent_name("MoveDirectionIntent")(handler_input)
def handle(self, handler_input):
# type: (HandlerInput) -> Response
speak_output = "Moving"
data = {}
slots = handler_input.request_envelope.request.intent.slots
logger.info("slots")
在上面的程式碼中,can_handle 方法用於檢查是否可以處理移動Intent。handle 方法用於處理移動Intent,包括傳送MQTT指令和回應使用者。
StopMovingIntentHandler 類別
StopMovingIntentHandler 類別是用於處理停止移動Intent的Handler。它也繼承自AbstractRequestHandler 類別,並實作了can_handle 和 handle 方法。
def handle(self, handler_input):
# type: (HandlerInput) -> Response
speak_output = "Stopping the robot"
data = {}
send_mqtt_directive("/myPi", "stop", data)
return (
handler_input.response_builder
.speak(speak_output)
.ask("I've stopped the robot")
.response
)
在上面的程式碼中,handle 方法用於處理停止移動Intent,包括傳送MQTT指令和回應使用者。
MQTT 指令
MQTT 指令是用於控制裝置的移動。它包括了移動方向和速度等資訊。在上面的程式碼中,send_mqtt_directive 函式用於傳送MQTT指令。
send_mqtt_directive("/myPi", "stop", data)
在上面的程式碼中,"/myPi" 是MQTT 主題,“stop” 是MQTT 指令,data 是指令的資料。
控制 IoT 裝置的語音命令
在上一節中,我們已經建立了一個基本的 Alexa 技能,現在我們要將其應用於控制 IoT 裝置。首先,我們需要修改技能的程式碼,以便它可以處理語音命令並將其轉換為 MQTT 訊息。
從技術架構視角來看,本文逐步建構了一個以 Alexa 語音助理為控制端、MQTT 作為通訊協定、Raspberry Pi 作為邊緣計算節點的物聯網應用範例。透過解析語音指令、傳送 MQTT 訊息,實作了遠端控制 Raspberry Pi 連線的裝置,例如 LED 或機器人。分析其核心技術組成,包含語音辨識、訊息佇列、邊緣運算等關鍵技術,展現了物聯網系統的典型架構。然而,文中程式碼片段缺乏完整性,讀者難以直接應用於實際專案,需自行補充程式碼邏輯與錯誤處理機制。此外,對於 MQTT 訊息格式的設計也較為簡略,未考慮更複雜的控制場景和資料傳輸需求。展望未來,此架構可整合更多感測器資料採集與分析功能,並結合雲端服務實作更強大的物聯網應用。對於想要快速上手物聯網開發的使用者,建議參考更完整的程式碼範例和更詳細的技術檔案,並深入學習 MQTT 協定和邊緣計算相關知識,才能構建更穩健、功能更豐富的物聯網系統。