透過 AWS SQS 服務,可以非同步地控制 Raspberry Pi 上的 Sense HAT。此方法利用 SQS 作為訊息中介,將控制指令從雲端傳送到裝置。實作上,首先需在 AWS 建立 SQS 佇列,並設定適當的存取許可權。接著,在 Raspberry Pi 上撰寫 Python 程式碼,使用 boto3 函式庫連線到 SQS,並持續監聽指定的佇列。程式碼會接收 SQS 訊息,解析訊息內容,例如顏色、開關狀態等指令,然後根據指令控制 Sense HAT 的顯示。最後,程式碼會刪除已處理的 SQS 訊息,避免重複執行指令。此架構提供可靠且可擴充套件的物聯網控制方案,適用於遠端管理和控制連網裝置。

組態帳戶連結詳細步驟

  • 輸入您的 Client ID,從您的安全組態檔中複製。
  • 輸入您的 Secret,從您的安全組態檔中複製。
  • 選擇您的 Authentication Scheme,建議選擇 HTTP Basic。
  • 輸入 Scope,點選「+Add scope」,然後輸入「profile:user_id」。
  • 點選「Save」按鈕,位於頁面的頂部。
  • 儲存 redirect URLs,它們應該類別似於某個 URL。
  • 點選「Save」按鈕。
  • 將 redirect URLs 新增到您的安全組態檔中。 Alexa 會使用其中一個 URL 來存取授權服務,當帳戶連結時。

13.10 啟用和連結技能

啟用技能並連結帳戶。前往 Skills > All Skills > Your Skills > Dev Skills。

找到您的技能(雖然已經過了一段時間),如果找不到,請檢查您是否使用了正確的開發者帳戶。點選「ENABLE」按鈕,將您導向登入頁面。登入並點選「Allow」按鈕。

您應該會看到一條訊息,然後關閉視窗。您將被帶回前一個視窗。現在,您可以發現您的裝置了。Alexa 將搜尋新的裝置。

故障排除

如果您的裝置未被發現,請檢查 CloudWatch 日誌,以檢視是否觸發了函式。如果沒有,請檢查您是否正確複製了 ClientID 和密碼,並驗證帳戶連結是否正確。如果函式被觸發,請檢查日誌以檢視是否發送了 discover 命令,並檢視您的程式的回應。

您也可以從 Lambda 函式再次測試您的函式。當裝置被發現時,您可以從開發者控制檯測試。另外,您也可以從開發者控制檯執行測試。

13.11 清理

如果您想要刪除所有建立的專案,請前往 LWA 並刪除您的安全組態檔,然後前往 Lambda 並刪除您的函式,最後前往開發者控制檯並刪除您的技能。

13.12 故障排除

如果出現問題,請嘗試以下步驟。記住發生了什麼事情。您的使用者發現了裝置(是否正常工作?)。函式是否被觸發(是否有問題?)。您可以從 CloudWatch 日誌中判斷。如果函式未被觸發,請檢查您的主機區域。

控制智慧家居裝置使用SQS與Raspberry Pi

14.1 簡介

在前面的章節中,我們學習瞭如何將MQTT訊息傳送到Raspberry Pi,並設定了一個智慧家居裝置。在本章中,我們將使用Simple Queue Service (SQS)訊息服務控制一個智慧家居裝置,從Alexa傳送命令到Raspberry Pi。當然,我們也可以使用MQTT。

我們的Raspberry Pi Python程式碼將讀取SQS訊息佇列,並控制Raspberry Pi Sense Hat,開啟或關閉它,或改變其顏色。這些動作將使用Alexa技能實作。我們還可以使用MODE控制器設定特定的火焰型別(例如“roaring”、“campfire”或“candle”),或使用RANGE控制火焰的大小(從全開到小火)。

14.2 建立SQS佇列

首先,我們需要建立一個佇列。在AWS儀錶板中找到Simple Queue Service。您可以選擇標準佇列或FIFO佇列。留下佇列型別為標準,並給它一個名稱(senseHatQueue)。這意味著訊息可能會以任意順序到達,但這更簡單。

我們將允許任何人存取我們的佇列(不推薦),所以在存取策略中點選高階並輸入以下JSON:

{
  "Version": "2012-10-17",
  "Id": "SenseHat_Policy_UUID",
  "Statement": [
    {
      "Sid": "Queue1_AnonymousAccess_All",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "sqs:*",
      "Resource": "arn:aws:sqs:eu-west-1:559144301234:senseHatQueue"
    }
  ]
}

將您的ARN更改為適合您的值。點選建立佇列。佇列應該會成功建立。

一旦您的佇列建立完成,您可以使用以下Python程式碼從Raspberry Pi列出可用的佇列:

import boto3
client = boto3.resource('sqs', region_name='eu-west-1')

內容解密:

上述程式碼使用boto3函式庫連線到AWS SQS服務,並建立了一個SQS資源物件。這個物件可以用來與SQS佇列進行互動,例如傳送和接收訊息。

14.3 控制Sense Hat

現在,我們可以使用SQS訊息控制Sense Hat了。以下是示例程式碼:

import boto3
from sense_hat import SenseHat

sense = SenseHat()

def control_sense_hat(message):
    if message == 'on':
        sense.clear(255, 255, 255)  # 白色
    elif message == 'off':
        sense.clear(0, 0, 0)  # 黑色
    elif message == 'red':
        sense.clear(255, 0, 0)  # 紅色
    #...

sqs = boto3.client('sqs', region_name='eu-west-1')
queue_url = 'https://sqs.eu-west-1.amazonaws.com/559144301234/senseHatQueue'

while True:
    response = sqs.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=1)
    if 'Messages' in response:
        message = response['Messages'][0]['Body']
        control_sense_hat(message)
        sqs.delete_message(QueueUrl=queue_url, ReceiptHandle=response['Messages'][0]['ReceiptHandle'])

圖表翻譯:

此圖表顯示了控制Sense Hat的流程:

  flowchart TD
    A[接收SQS訊息] --> B[解析訊息]
    B --> C[控制Sense Hat]
    C --> D[刪除SQS訊息]

在這個流程中,我們首先接收SQS訊息,然後解析訊息內容。如果訊息是“on”、“off”或“red”,我們就控制Sense Hat的顏色。最後,我們刪除SQS訊息以確保它不會被重複處理。

使用 AWS SQS 控制 Raspberry Pi 顯示

取得可用佇列 URL

首先,我們需要取得可用的 SQS 佇列 URL。這可以透過以下 Python 程式碼實作:

print("Available Queue URL")

for queue in client.queues.all():
    print(queue.url)

請注意,確保區網域名稱正確,以避免連線錯誤。

接收 SQS 訊息

現在,我們已經有一個佇列可以傳送訊息到,我們將撰寫一些程式碼來接收訊息並控制我們的 Pi 顯示。傳送的訊息包含一個名稱空間(例如,ColorController 訊息是:

{
    'endpointId': 'sense-hat-01',
    'name': 'color',
    'value': {'hue': 350.0, 'saturation': 0.25, 'brightness': 1.0}
}

完整的接收 Smart Home 訊息程式碼位於軟體附錄 14.1。

讀取和刪除 SQS 訊息

以下程式碼讀取 SQS 訊息並刪除它(fire 函式控制 Sense Hat):

def get_sqs_msg(queue):
    json_msg = ""
    for message in queue.receive_messages():
        json_msg = json.loads(message.body)
        message.delete()
    return json_msg

主要程式碼

主要程式碼是:

def main():
    powerState = "on"
    colour = (255, 0, 0)  # 這是 HSV,不是 RGB(見上面的 'value')

內容解密:

  • get_sqs_msg 函式用於從指定的 SQS 佇列中讀取訊息,並將其轉換為 JSON 格式。
  • main 函式是程式的入口點,它初始化了一些變數,包括 powerStatecolour
  • colour 變數使用 HSV 色彩模型,而不是 RGB。

圖表翻譯:

以下是程式邏輯的 Mermaid 流程圖:

  flowchart TD
    A[開始] --> B[讀取 SQS 訊息]
    B --> C[轉換為 JSON]
    C --> D[刪除訊息]
    D --> E[控制 Sense Hat]
    E --> F[結束]

圖表解釋:

  • 程式從開始(A)開始。
  • 讀取 SQS 訊息(B)。
  • 將訊息轉換為 JSON 格式(C)。
  • 刪除訊息(D)。
  • 控制 Sense Hat(E)。
  • 結束(F)。

智慧燈泡控制系統

系統概述

本系統是一個根據物聯網(IoT)的智慧燈泡控制系統,利用Amazon Web Services(AWS)中的Simple Queue Service(SQS)來接收和處理控制命令。系統的核心功能是根據接收到的命令來控制燈泡的開關和顏色。

系統架構

系統架構如下:

  flowchart TD
    A[控制命令] --> B[SQS]
    B --> C[控制系統]
    C --> D[燈泡]

圖表翻譯:

此圖表示控制命令如何透過SQS傳遞給控制系統,然後控制系統根據命令控制燈泡的開關和顏色。

從系統整合的視角來看,使用 AWS SQS 控制 Raspberry Pi 與智慧裝置的互動,展現了雲端服務與邊緣裝置整合的潛力。透過 SQS 作為中介,Alexa 技能得以非同步控制 Sense HAT 等裝置,提升了系統的反應速度和穩定性。然而,SQS 的非同步特性也帶來了訊息處理順序和延遲的挑戰,在設計智慧家庭裝置控制系統時,需要仔細考量訊息格式、錯誤處理和裝置狀態同步等問題。此外,允許匿名存取 SQS 佇列存在安全風險,建議在生產環境中設定更嚴格的存取控制策略。展望未來,隨著邊緣運算和物聯網技術的發展,預期 SQS 這類別雲端訊息服務將扮演更重要的角色,成為連線雲端和邊緣裝置的橋樑。對於追求高效能和高可靠性的智慧家庭系統,建議深入研究 SQS 的進階功能,例如訊息延遲、死信佇列等,並結合其他 AWS 服務,例如 Lambda 和 IoT Core,構建更強大的智慧家庭生態系統。玄貓認為,善用 SQS 的特性並妥善管理其限制,將能有效提升智慧家庭裝置的控制效率和使用者經驗。