C SDK 和內嵌 C SDK 使用方式情節
Microsoft提供適用於內嵌和受限裝置案例的 Azure IoT 裝置 SDK 和中間件。 本文可協助裝置開發人員決定要用於應用程式的裝置開發人員。
下圖顯示客戶使用 C 型 (C99) SDK 將裝置連線到 Azure IoT 的四個常見案例。 本文的其餘部分提供每個案例的詳細數據。
案例 1 – Azure IoT C SDK (適用於 Linux 和 Windows)
從 2015 年開始, Azure IoT C SDK 是第一個用來將裝置連線到 IoT 服務的 Azure SDK 。 這是一個穩定的平臺,專為提供下列功能來將裝置連線至 Azure IoT 而建置:
- IoT 中樞 服務
- 裝置布建服務用戶端
- 通訊傳輸的三個選項(MQTT、AMQP 和 HTTP),由Microsoft建立和維護
- 一般 TLS 堆疊的多個選擇(根據目標平臺,OpenSSL、安全通道和床上 TLS)
- TCP 套接字 (Win32、Berkeley 或 Mbed)
提供通訊傳輸、TLS 和套接字抽象概念具有效能成本。 許多路徑需要 malloc
各種 memcpy
抽象層之間的呼叫。 相較於桌面或Raspberry Pi裝置,此效能成本很小。 然而,在真正受限的裝置上,成本會隨著記憶體分散的可能性而變得負擔很大。 通訊傳輸層也需要至少每 100 毫秒呼叫一個 doWork
函式。 這些頻繁的呼叫使得更難針對電池供電的裝置優化 SDK。 存在多個抽象層也使得客戶很難使用或變更任何指定的連結庫。
建議針對 Windows 或 Linux 裝置使用案例 1,這通常較不區分記憶體使用量或耗電量。 不過,Windows 和 Linux 型裝置也可以使用內嵌 C SDK,如案例 2 所示。 Windows 和 Linux 型裝置的其他選項包括其他 Azure IoT 裝置 SDK:Java SDK、.NET SDK、Node SDK 和 Python SDK。
案例 2 – 內嵌 C SDK(適用於裸機案例和微型控制器)
在 2020 年,Microsoft發行 Azure SDK for Embedded C (也稱為內嵌 C SDK)。 此 SDK 是以客戶的意見反應為基礎所建置,而且需要支援受限制的 微型控制器裝置。 一般而言,受限制的微控制器會降低記憶體和處理能力。
內嵌 C SDK 具有下列主要特性:
- 沒有動態記憶體配置。 客戶必須配置所需的數據結構,例如全域記憶體、堆積或堆疊。 然後,它們必須將配置結構的位址傳遞至 SDK 函式,以初始化和執行各種作業。
- 僅限 MQTT。 只有 MQTT 的使用量很適合限制裝置,因為它是有效率且輕量型的網路通訊協定。 目前僅支援 MQTT v3.1.1。
- 自備網路堆疊。 內嵌 C SDK 不會執行 I/O 作業。 這種方法可讓客戶選取最符合其目標平臺的 MQTT、TLS 和套接字用戶端。
- 與 C SDK 類似的 功能集 。 內嵌 C SDK 提供與 Azure IoT C SDK 類似的功能,但內嵌 C SDK 不提供下列例外狀況:
- 上傳至 Blob
- 以 IoT Edge 模組身分執行的能力
- 以AMQP為基礎的功能,例如內容訊息批處理和裝置多任務處理
- 較小的整體 使用量。 內嵌 C SDK 如示範如何連線到 IoT 中樞 的範例中所見,只需要 74 KB 的 ROM 和 8.26 KB 的 RAM。
內嵌 C SDK 支援沒有操作系統的微型控制器、具有即時操作系統的微型控制器(例如 Eclipse ThreadX)、Linux 和 Windows。 客戶可以實作自定義平臺層,以在自定義裝置上使用SDK。 SDK 也提供一些平台層,例如 Arduino 和 Swift。 Microsoft鼓勵社群提交其他平台層,以提高現用支持的平臺。 Wind River VxWorks 是社群提交的平台層範例。
內嵌 C SDK 新增了一些程式設計優點,因為它與 Azure IoT C SDK 相比具有彈性。 特別是,使用受限制裝置的應用程式將受益於巨大的資源節省和更大的程序設計控制。 相較之下,如果您使用 Eclipse ThreadX 或 FreeRTOS,您可以透過每個 RTOS 實作的其他功能來享有這些相同的優點。
案例 3 – Eclipse ThreadX 搭配 Azure IoT 中間件 (適用於 Eclipse ThreadX 型專案)
案例 3 牽涉到使用 Eclipse ThreadX 和 Azure IoT 中間件。 Eclipse ThreadX 建置在內嵌 C SDK 之上,並新增 MQTT 和 TLS 支援。 Eclipse ThreadX 的中間件會公開與原生 Eclipse ThreadX API 類似的應用程式 API。 這種方法可讓開發人員更輕鬆地使用 API,並將其 Eclipse ThreadX 型裝置連線至 Azure IoT。 Eclipse ThreadX 是完全整合、有效率、即時的內嵌平臺,可提供解決方案所需的所有網路和IoT功能。
有數個來自 ST、KITS、Renesas 和 Microchip 的熱門開發人員套件範例可供使用。 這些範例可與 Azure IoT 中樞 或 Azure IoT Central 搭配使用,並可在 GitHub 上以 IAR Workbench 或半導體 IDE 專案的形式提供。
因為它是以內嵌 C SDK 為基礎,所以適用於 Eclipse ThreadX 的 Azure IoT 中間件是非記憶體配置。 客戶必須在全域記憶體、堆積或堆疊中配置 SDK 數據結構。 客戶配置數據結構之後,必須將結構的位址傳遞至 SDK 函式,以初始化和執行各種作業。
案例 4 – FreeRTOS 中間件的 FreeRTOS (用於 FreeRTOS 型專案)
案例 4 將內嵌 C 中間件帶入 FreeRTOS。 內嵌 C 中間件建置在內嵌 C SDK 之上,並透過 開放原始碼 coreMQTT 連結庫新增 MQTT 支援。 FreeRTOS 的這個中間件會在 MQTT 層級運作。 它會建立 MQTT 連線、訂閱和取消訂閱主題,以及傳送和接收訊息。 客戶會透過中間件 API 處理中斷連線。
客戶會控制 TLS/TCP 組態和端點的連線。 這種方法可讓您彈性地實作任一堆疊的軟體或硬體實作。 免費RTOS的 Azure IoT 中間件不會建立任何背景工作。 訊息會以同步方式傳送和接收。
核心實作會在此 GitHub 存放庫中提供。 有數個熱門開發人員套件的範例可供使用,包括NXP1060、STM32 和 ESP32。 這些範例可與 Azure IoT 中樞、Azure IoT Central 和 Azure 裝置佈建服務搭配使用,而且可在此 GitHub 存放庫中取得。
因為它是以 Azure Embedded C SDK 為基礎,所以適用於 FreeRTOS 的 Azure IoT 中間件也是非記憶體配置。 客戶必須在全域記憶體、堆積或堆疊中配置 SDK 數據結構。 客戶配置數據結構之後,必須將配置結構的位址傳遞至 SDK 函式,以初始化和執行各種作業。
以 C 為基礎的 SDK 技術使用案例
下圖摘要說明本文所述的每個 SDK 使用案例的技術選項。
記憶體和通訊協定的 C 型 SDK 比較
下表根據記憶體和通訊協定使用量來比較四個裝置 SDK 開發案例。
記憶 分配 |
記憶 用法 |
協定 支援 |
建議用於 | |
---|---|---|---|---|
Azure IoT C SDK | 大部分是動態 | Unrestricted。 可以跨越 在 RAM 中為 1 MB 或更多。 |
AMQP HTTP MQTT v3.1.1 |
以微控制器為基礎的系統 Microsoft Windows Linux Apple OS X |
適用於內嵌 C 的 Azure SDK | 僅限靜態 | 受限於數量 數據應用程式配置。 |
MQTT v3.1.1 | 微型控制器 裸機實作 以 RTOS 為基礎的實作 |
適用於 Eclipse ThreadX 的 Azure IoT 中間件 | 僅限靜態 | 受限制 | MQTT v3.1.1 | 微型控制器 以 RTOS 為基礎的實作 |
適用於 FreeRTOS 的 Azure IoT 中間件 | 僅限靜態 | 受限制 | MQTT v3.1.1 | 微型控制器 以 RTOS 為基礎的實作 |
每個 SDK 支援的 Azure IoT 功能
下表根據 Azure IoT 功能的支援,比較四個裝置 SDK 開發案例。
Azure IoT C SDK | 適用於的 Azure SDK 內嵌 C |
Azure IoT 中間件 Eclipse ThreadX |
Azure IoT 中間件 FreeRTOS |
|
---|---|---|---|---|
SAS 用戶端驗證 | Yes | .是 | .是 | Yes |
x509 客戶端驗證 | Yes | .是 | .是 | Yes |
裝置佈建 | Yes | .是 | .是 | Yes |
遙測 | Yes | .是 | .是 | Yes |
雲端到裝置訊息 | Yes | .是 | .是 | Yes |
直接方法 | Yes | .是 | .是 | Yes |
裝置對應項 | Yes | .是 | .是 | Yes |
IoT 隨插即用 | Yes | .是 | .是 | Yes |
遙測批處理 (AMQP,HTTP) |
是 | 無 | 無 | No |
上傳至 Azure Blob | 是 | 無 | 無 | No |
中的自動整合 IoT Edge 裝載的容器 |
是 | 無 | 無 | 否 |
下一步
若要深入瞭解裝置開發和適用於 Azure IoT 的可用 SDK,請參閱下表。