Linux 系統因其穩定性、低資源消耗和安全性,成為物聯網平臺的理想選擇。相較於 Windows,Linux 系統更能長時間穩定執行,降低維護成本,並具備內建的安全機制。硬體資源方面,1GB RAM 和 20-25GB 磁碟空間足以滿足平臺的執行需求。此外,選擇 DigitalOcean 作為雲端平臺,其簡潔的介面和透明的定價策略,有利於平臺的快速部署和成本控制。在軟體方面,Node.js、Node-RED 和 LAMP 堆疊是建構平臺的基礎工具。核心功能包括訊息代理、資料庫管理、訊息路由和微服務,而邊緣介面、訊息匯流排和 MQTT 協定則確保了裝置與平臺間的實時通訊。考量未來擴充性,平臺設計需預留時間序列資料儲存和 REST API 介面的空間,以便後續整合微服務架構和更進階的功能。

選擇作業系統

為了建立一個可靠且高效的物聯網平臺,我們需要選擇合適的作業系統。Linux基礎的系統比Windows更可靠,傳統上,Linux系統可以長時間執行而不需要重啟或維護。這對於我們的物聯網平臺來說是一個關鍵因素。

另外,Linux系統對硬體資源的需求較低,例如RAM和磁碟空間,這使得成本控制在合理的範圍內。為了確保平臺的正常執行,我們需要至少1 GB的RAM和20-25 GB的磁碟空間。

安全性

Linux基礎的系統具有內建的安全性,這使得它們更適合於安全的環境。由於這種內在的安全性,我們可以節省防病毒軟體的成本和額外的系統負擔。

控制

控制是建立自己的物聯網平臺的主要原因之一。Linux基礎的系統提供了所有層面的控制,沒有不必要的軟體,這對於像我們的平臺這樣的高速系統來說非常重要。

電源

Windows目前只能執行在不需要低功耗的裝置上,而我們的物聯網平臺需要低功耗的系統。

附加規格

為了有效地執行我們的平臺,我們需要安裝Node.js和Node-RED軟體。此外,我們需要一個LAMP堆疊(Linux-Apache-MySQL-PHP)來建立網站和網路應用程式。

雲例項

有許多選擇可以用於建立雲例項,例如AWS、Google Cloud、Alibaba Cloud和DigitalOcean。DigitalOcean提供了一個乾淨的使用者介面和透明的定價,這使得它成為一個不錯的選擇。

本地機器工具

雖然我們將在雲例項中進行大部分的開發,但我們仍需要在本地機器上安裝一些工具,例如終端模擬器、基本編輯器和FTP程式。

物聯網平臺的優先順序

為了快速開發,我們需要優先考慮哪些功能和模組。Edge Interface、Message Broker和Message Bus將是我們平臺的基本功能,我們將使用MQTT協議進行訊息交換。

時間序列儲存和資料管理

雖然這不是核心功能,但我們將在第一次開發中建立時間序列儲存和資料管理,以便稍後使用。

REST API介面

REST API是測試平臺功能的必要條件,我們將從基本API開始,然後在後續的開發中新增複雜的功能。

微服務

雖然我們不會在第一次開發中開發微服務,但我們將為未來的開發做好準備,以便在新增微服務時不需要對基本設計進行重大修改。

建立物聯網平臺的核心要素

在開始建立我們自己的物聯網平臺之前,讓我們先了解平臺的核心要素。這些要素包括_rule engine_、device managerapplication managermessage brokerdatabase managermessage router_和_microservices。然而,在這個初步的版本中,我們將專注於建立一個基本的平臺,而不是所有的功能。

Rule Engine

_rule engine_是物聯網平臺中最強大的功能之一。它允許我們定義規則並觸發動作,當特定的條件被滿足時。然而,_rule engine_不能在一開始就全部開發完成,我們需要多次迭代來使其完善。

Device Manager 和 Application Manager

device manager_和_application manager_是平臺的重要功能,但它們不是核心部分。因此,在這個初步版本中,我們不會開發這些功能。即使沒有正式的_device manager_和_application manager,我們仍然可以使用多個裝置和應用程式。

物聯網平臺的區塊圖

現在,我們已經列出了我們的重點開發領域,物聯網平臺的區塊圖如下所示。

物聯網平臺的核心功能

  • message broker
  • database manager
  • message router
  • microservices

這些核心功能將使我們的平臺從根本上功能齊全。其他被認為是功能的方面將被留到未來的增強中。

建立平臺的_wish list_

雖然可以邊做邊思考,但是預先定義需求(盡可能多)將幫助我們更快、更有效地建立所需的平臺架構。在這個章節中,我們將討論每個模組的期望和一般需求,包括:

  • 如何連線和與平臺實時通訊
  • 如何儲存資料
  • 我們將建立哪些型別的API
  • 我們需要建立哪些_microservices_和工具

實時連線和通訊

實時連線和通訊是物聯網解決方案和應用程式的關鍵需求。這是_message broker_和_publish-subscribe_機制的用途所在。_message broker_是一種中介軟體程式,提供非同步通訊能力給所有連線的應用程式和裝置。

_publish-subscribe_機制是一種有趣的正規化,它不需要任何一方同時線上。它還允許任何一方初始化資料傳輸,無論另一方是否準備好。這與HTTP的工作方式相反,客戶端必須發起請求,伺服器才會響應。當我們使用_message broker_和_publish-subscribe_機制連線伺服器和客戶端時,任意一方都可以傳送資料,這是一種強大的功能。

因此,我們需要一個_message broker_程式。選擇_message broker_時,需要考慮兩個重要的標準:易於配置和維護,以及足夠穩定以滿足生產環境的需求。

使用MQTT作為訊息代理

MQTT(MQ Telemetry Transport)是一種輕量級的發布/訂閱式訊息協定,設計用於受限的裝置和低頻寬、 高延遲或不可靠的網路。MQTT的設計原則是最小化網路頻寬和裝置資源需求,同時確保可靠性和交付保證。這些原則使得MQTT成為物聯網(IoT)應用和解決方案的理想協定。

MQTT有許多實現,包括商業和開源版本。Mosquitto是一個流行的開源MQTT實現,我們將使用它來建立我們的訊息代理。Mosquitto是一個輕量級的訊息代理,支援MQTT 3.1和3.1.1協定。

資料儲存機制

訊息代理不是儲存提供者,而是一種訊息傳遞機制。因此,我們需要一個儲存機制來儲存和檢索資料。由於我們的平臺根據Ubuntu伺服器和LAMP堆疊,MySQL是預設和明顯的選擇。

MySQL是一種流行的關係型資料庫,廣泛用於各種應用。為了儲存MQTT訊息,我們需要設計一個資料儲存結構。MQTT訊息包含兩個欄位:主題(topic)和有效載荷(payload)。主題用作資料的鍵,而有效載荷是實際的資料或內容。

資料儲存結構

為了儲存MQTT訊息,我們需要設計一個資料儲存結構。以下是可能的結構:

  • ID:唯一的自增號
  • 主題(topic):變長的字串,儲存主題名稱
  • 有效載荷(payload):變長的字串,儲存有效載荷
  • 時間戳:儲存訊息的時間戳

這個結構可以儲存MQTT訊息,並提供了一個簡單的方式來檢索資料。

API存取機制

為了提供一個安全和方便的方式來存取資料,我們需要設計一個API存取機制。API(Application Programming Interface)是一組子程式或函式定義,通訊協定和工具,用於建立軟體。

我們可以將API分為四種型別:

  • 資料存取API:提供存取時間序列資料儲存的機制
  • 公用API:提供一些公用功能,例如資料轉換或加密
  • 微服務API:提供特定的功能,例如電子郵件和簡訊
  • 外掛API:提供一些外掛功能,例如移動應用程式的前端

資料存取API

為了提供一個安全和方便的方式來存取時間序列資料儲存,我們需要設計一個資料存取API。以下是可能的API端點:

  • D1:取得單一資料記錄
  • D2:取得多個資料記錄
  • D3:取得一或多個記錄根據某些條件

這些API端點可以提供一個簡單的方式來存取時間序列資料儲存,並提供了一個安全和方便的方式來檢索資料。

建立IoT平臺的願景清單

在建立IoT平臺時,我們需要考慮許多功能和服務,以滿足不同應用和使用者的需求。以下是我們的願景清單:

資料管理

  • D1. 查詢資料: 根據指定的條件(主題、payload或兩者)查詢一或多個資料記錄。
  • D2. 儲存資料: 將資料記錄儲存在時間序列儲存中。
  • D3. 更新資料: 更新現有的資料記錄。
  • D4. 刪除單個資料記錄: 根據指定的主題刪除單個資料記錄。
  • D5. 刪除多個資料記錄: 根據指定的主題刪除多個資料記錄。
  • D6. 刪除資料記錄根據條件: 根據指定的條件刪除一或多個資料記錄。

基礎微服務和公用程式

  • M1. 發布當前時間戳: 發布當前時間戳,以便分散式應用程式同步時間。
  • M2. 獲取當前時間戳: 獲取當前時間戳,供應用程式或裝置使用。
  • M3. 獲取唯一或隨機數字/字串: 獲取唯一或隨機數字或字串,供建立唯一鍵或參考號碼使用。
  • M4. 獲取UUID: 獲取UUID(通用唯一識別碼),供建立唯一鍵或密碼使用。
  • M5. 傳送電子郵件: 傳送電子郵件,供自動化、警報、使用者檢查和驗證、密碼重置、金鑰通訊等使用。
  • M6. 傳送簡訊: 傳送簡訊,供實現兩步 驗證、警報和通知等使用。

時間序列儲存

  • T1. 時間序列儲存: 儲存資料記錄以時間序列的形式,供查詢和分析使用。
  • T2. 時間序列查詢: 根據指定的條件查詢時間序列儲存中的資料記錄。

安全性

  • S1. 身份驗證: 驗證使用者或裝置的身份,供授權和存取控制使用。
  • S2. 授權: 控制使用者或裝置對資源的存取,供安全性和隱私保護使用。
  • S3. 加密: 加密資料,供保護資料隱私和安全性使用。

這些功能和服務將是我們IoT平臺的基礎,供不同應用和使用者使用。

初始化雲端例項

初始化雲端例項是建立我們的IoT平臺的第一步。在開始之前,請確保您已經準備好所有必要的條件。

建立雲端例項

為了建立雲端例項,我們需要選擇一個雲端服務提供商。有許多選擇,例如Amazon Web Services(AWS)、Microsoft Azure、Google Cloud Platform(GCP)等。每個提供商都有其自己的優缺點,請根據您的需求選擇合適的提供商。

安裝基本軟體堆疊

一旦雲端例項建立完成,我們就需要安裝基本軟體堆疊。這包括作業系統、網路配置、安全設定等。根據您的需求,您可能需要安裝額外的軟體包。

新增安全設定檔

為了確保我們的平臺安全,我們需要新增安全設定檔。這包括設定防火牆、使用者許可權、密碼等。請確保您已經設定了適當的安全設定檔。

建立和配置時間序列資料庫

時間序列資料庫是用於儲存和管理時間序列資料的資料庫。為了建立和配置時間序列資料庫,我們需要選擇一個合適的資料庫管理系統,例如InfluxDB、OpenTSDB等。

給平臺賦予域名

最後,我們需要給平臺賦予域名。這樣,我們就可以透過域名訪問我們的平臺。

實現細節

以下是實現細節:

初始化雲端例項

import os
import boto3

# 建立雲端例項
ec2 = boto3.client('ec2')
instance = ec2.run_instances(
    ImageId='ami-abc123',
    InstanceType='t2.micro',
    MinCount=1,
    MaxCount=1
)

# 取得例項ID
instance_id = instance['Instances'][0]['InstanceId']

# 等待例項啟動
ec2.get_waiter('instance_status_ok').wait(InstanceIds=[instance_id])

安裝基本軟體堆疊

# 安裝基本軟體堆疊
sudo apt-get update
sudo apt-get install -y python3-pip

新增安全設定檔

import os

# 設定防火牆
os.system('sudo ufw allow 22')

# 設定使用者許可權
os.system('sudo useradd -m -s /bin/bash user')

# 設定密碼
os.system('sudo passwd user')

建立和配置時間序列資料庫

import influxdb

# 建立時間序列資料庫
client = influxdb.InfluxDBClient(host='localhost', port=8086)
client.create_database('mydb')

# 配置時間序列資料庫
client.switch_database('mydb')

給平臺賦予域名

import os

# 設定域名
os.system('sudo echo "domain.name" > /etc/hosts')

建立雲端例項

在 DigitalOcean 平臺上建立雲端例項是建立 IoT 平臺的第一步。首先,我們需要註冊和初始化一個 DigitalOcean 例項,然後安裝基本的作業系統。

步驟 1:選擇作業系統

選擇作業系統是建立雲端例項的第一步。在這個例子中,我們將選擇 Ubuntu 作為我們的作業系統。DigitalOcean 提供了多種作業系統選擇,包括 Container Distributions 和 Marketplace。

  flowchart TD
    A[開始] --> B[選擇作業系統]
    B --> C[Ubuntu]
    C --> D[Container Distributions]
    D --> E[Marketplace]

內容解密:

在這個步驟中,我們需要選擇一個適合我們 IoT 平臺的作業系統。Ubuntu 是一個流行的選擇,因為它穩定且易於使用。Container Distributions 和 Marketplace 提供了更多的選擇,包括預先配置的作業系統和應用程式。

步驟 2:選擇計劃

選擇計劃是建立雲端例項的第二步。在這個步驟中,我們需要指定例項的 RAM 和磁碟空間。根據我們的需求,我們需要約 2 GB 的 RAM 和 50 GB 的磁碟空間。

  flowchart TD
    A[開始] --> B[選擇計劃]
    B --> C[2 GB RAM]
    C --> D[50 GB 磁碟空間]

內容解密:

在這個步驟中,我們需要選擇一個適合我們 IoT 平臺的計劃。2 GB 的 RAM 和 50 GB 的磁碟空間足夠滿足我們的基本需求。如果我們需要擴充套件例項的規格,我們可以輕鬆地在 DigitalOcean 的控制面板中完成。

步驟 3:選擇資料中心

選擇資料中心是建立雲端例項的第三步。在這個步驟中,我們需要選擇一個適合我們使用者的地理位置的資料中心。DigitalOcean 提供了多個資料中心選擇,包括 London、New York 等。

  flowchart TD
    A[開始] --> B[選擇資料中心]
    B --> C[London]
    C --> D[New York]

內容解密:

在這個步驟中,我們需要選擇一個適合我們使用者的地理位置的資料中心。London 是一個適合的選擇,因為它靠近 UTC 時區。如果我們的使用者分佈在全球各地,選擇一個靠近 UTC 時區的資料中心可以保持延遲的一致性。

步驟 4:建立例項

建立例項是建立雲端例項的最後一步。在這個步驟中,我們需要指定例項的主機名稱和密碼。

  flowchart TD
    A[開始] --> B[建立例項]
    B --> C[主機名稱]
    C --> D[密碼]

內容解密:

在這個步驟中,我們需要指定例項的主機名稱和密碼。主機名稱需要是唯一的,密碼需要強壯且安全。

最終,我們可以建立一個雲端例項,滿足我們 IoT 平臺的需求。這個例項可以用於部署和執行我們的 IoT 應用程式。

初始化雲端例項

在雲端平臺上建立了一個新的例項後,我們需要進行初始化設定。這包括設定主機名稱、控制面板資訊和伺服器的主機名稱。然後,我們需要建立例項,設定例項的數量為1,因為我們只建立一個例項。最後,點選「建立」按鈕以啟動例項建立過程。

當例項建立完成後,雲端平臺會為我們的例項分配一個IP地址,並在控制面板上顯示。這個IP地址將在整個過程中被使用,所以我們需要記下它。

連線到雲端例項

如果您使用Linux或macOS,可以使用終端機輸入ssh命令來連線到雲端例項。命令如下:

ssh root@<INSTANCE_IP>

請注意,<INSTANCE_IP>需要被替換為您例項的實際IP地址。

如果您使用Windows,可以使用PuTTY軟體來連線到雲端例項。PuTTY的主對話方塊如下所示:

  flowchart TD
    A[啟動PuTTY] --> B[輸入IP地址]
    B --> C[連線到例項]
    C --> D[登入到例項]

圖表翻譯:

此圖表顯示了使用PuTTY軟體連線到雲端例項的過程。首先,啟動PuTTY軟體,然後輸入例項的IP地址,點選連線按鈕以連線到例項,最後,登入到例項。

安全設定

為了提高例項的安全性,我們需要啟用防火牆。Ubuntu伺服器使用Uncomplicated Firewall (UFW)來管理防火牆。UFW是一個使用命令列介面的程式,使用iptables進行配置。以下命令可以用來啟用UFW:

ufw enable

內容解密:

此命令啟用UFW防火牆,從而提高例項的安全性。UFW可以管理應用程式的配置,允許只連線到某些服務。以下命令可以用來檢視已經註冊的應用程式:

ufw app list

內容解密:

此命令顯示了已經註冊的應用程式列表。這些應用程式可以被UFW管理,以提高例項的安全性。

安裝基本軟體棧

初始化雲端例項後,下一步是安裝基本軟體棧。LAMP棧是一個開源軟體集合,用於建立網站和網路應用程式。LAMP是Linux-Apache-MySQL-PHP的縮寫,包括Linux作業系統、Apache HTTP伺服器、MySQL關聯式資料庫管理系統和PHP程式語言。

內容解密:

LAMP棧是建立網站和網路應用程式的基本軟體集合。安裝LAMP棧需要啟用防火牆,然後安裝Apache HTTP伺服器、MySQL資料庫管理系統和PHP程式語言。以下命令可以用來安裝Apache HTTP伺服器:

apt-get install apache2

內容解密:

此命令安裝Apache HTTP伺服器。安裝完成後,需要啟用Apache伺服器,以便它可以開始提供網頁服務。以下命令可以用來啟用Apache伺服器:

service apache2 start

內容解密:

此命令啟用Apache伺服器。啟用Apache伺服器後,需要配置MySQL資料庫管理系統,以便它可以被用來儲存網站資料。以下命令可以用來安裝MySQL資料庫管理系統:

apt-get install mysql-server

內容解密:

此命令安裝MySQL資料庫管理系統。安裝完成後,需要配置MySQL資料庫管理系統,以便它可以被用來儲存網站資料。以下命令可以用來配置MySQL資料庫管理系統:

mysql_secure_installation

內容解密:

此命令配置MySQL資料庫管理系統。配置完成後,需要安裝PHP程式語言,以便它可以被用來建立動態網頁。以下命令可以用來安裝PHP程式語言:

apt-get install php7.4

內容解密:

此命令安裝PHP程式語言。安裝完成後,需要配置PHP程式語言,以便它可以被用來建立動態網頁。以下命令可以用來配置PHP程式語言:

nano /etc/apache2/apache2.conf

內容解密:

此命令配置PHP程式語言。配置完成後,需要重啟Apache伺服器,以便它可以重新載入配置檔案。以下命令可以用來重啟Apache伺服器:

service apache2 restart

內容解密:

此命令重啟Apache伺服器。重啟Apache伺服器後,LAMP棧就已經安裝完成,可以用來建立網站和網路應用程式。

啟用防火牆並安裝Apache

在啟用防火牆之前,我們需要確保SSH連線不會被阻斷。為此,我們可以使用以下命令允許OpenSSH連線:

# ufw allow OpenSSH

然後,啟用防火牆:

# ufw enable

系統會提示您確認是否啟用防火牆,請按Y確認。啟用後,可以使用以下命令檢查防火牆的狀態:

# ufw status

這將顯示防火牆的狀態,包括允許的連線。

安裝Apache

Apache HTTP Server是一個免費和開源的跨平臺網頁伺服器軟體,廣泛使用於全球。為了安裝Apache,我們可以使用Ubuntu的套件管理器apt。安裝過程只需要兩個命令:

# apt update
# apt install apache2

在安裝過程中,系統會提示您確認是否繼續安裝,請按Y確認。

配置防火牆允許Apache連線

安裝Apache後,需要配置防火牆允許網頁伺服器連線。可以使用以下命令新增Apache的配置檔案:

  flowchart TD
    A[啟用防火牆] --> B[允許OpenSSH]
    B --> C[啟用防火牆]
    C --> D[安裝Apache]
    D --> E[配置防火牆允許Apache]

圖表翻譯:

此圖表顯示了啟用防火牆、允許OpenSSH連線、啟用防火牆、安裝Apache和配置防火牆允許Apache的過程。

綜觀產業技術發展趨勢,建構一個穩固的物聯網平臺需要審慎的技術選型和架構規劃。本文從作業系統選擇、安全性考量、核心功能設計、訊息傳輸協議、資料庫選型以及雲端部署等多個維度,深入探討了物聯網平臺搭建的關鍵要素。分析比較Linux和Windows作業系統後,Linux在可靠性、資源消耗、安全性以及控制能力等方面更符合物聯網平臺的需求,尤其在低功耗裝置的支援上更具優勢。此外,MQTT協議的輕量級特性以及MySQL資料庫的成熟度,也使其成為物聯網平臺訊息傳輸和資料儲存的理想選擇。然而,平臺搭建並非一蹴可幾,從核心功能的優先順序排序到微服務架構的未來規劃,都需要根據實際業務需求逐步迭代完善。技術團隊應著重於Edge Interface、Message Broker和Message Bus等核心功能的開發,並同步規劃時間序列資料儲存和REST API介面,為後續功能擴充套件奠定基礎。玄貓認為,隨著邊緣運算和5G技術的快速發展,物聯網平臺將迎來更廣闊的應用場景,而提前佈局微服務架構和安全機制,將成為平臺長期發展的關鍵制勝因素。