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 manager、application manager、message broker、database manager、message 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技術的快速發展,物聯網平臺將迎來更廣闊的應用場景,而提前佈局微服務架構和安全機制,將成為平臺長期發展的關鍵制勝因素。