➤ ESP32開發板:ESP-WROOM-32(ESP32) 是一款 WiFi & 藍牙雙模雙核無線通信晶片,擁有 Tensilica LX6 雙核處理器,廣泛應用於行動裝置、可穿戴電子產品和物聯網解決方案。
上述硬體通過簡單的連接即可組成一個能夠通過 WIFI 網絡發送溫度數據的溫度監測組件。LM35的Vcc,Vout 和GND 針腳分別對接 ESP32的3v3,VP 和 GND 針腳。
這樣一個組件就可以通過 WIFI 與 AWS IoT Core 進行連接,實現對溫度數據的採集和處理。本方案將用到以下 Amazon Web Service(AWS)服務
➤ AWS IoT Core:AWS IoT 服務,用於對接我們的溫度監測組件
➤ AWS Lambda:AWS 無伺服器函數服務,用於處理IoT 服務接收到的數據
➤ Amazon Relational Database Service (Amazon RDS) :AWS 託管的關係型資料庫,這裡我們使用的是 MySQL,用於存儲接收到的溫度數據
➤ Amazon Simple Notification Service (Amazon SNS) :AWS 消息通知服務,在溫度異常時,用於發送郵件通知
➤ Amazon Simple Storage Service (Amazon S3) :對象存儲服務,低成本存儲物聯網數據
實現溫度監控組件與 AWS IoT Core 的對接,整個演示場景的架構如下圖所示。➤ 溫度監測組件每5秒鐘採集一次數據,包括設備號、時間和溫度值,數據通過 WIFI 傳輸到 AWS IoT Core
➤ AWS IoT Core 接收到溫度監測組件傳輸的數據,做如下三種處理:
◆ 數據存儲到對象存儲 Amazon S3,一方面利用低成本的存儲空間,另一方面為將來的數據湖大數據分析做準備
◆ 數據通過 AWS Lambda 函數進行解析,存入 MySQL 資料庫表,以便於用戶的應用直接去訪問關係型資料庫,對物聯網數據進行處理
◆ 對數據進行實時監測,對於溫度超過閾值(比如40℃),發送郵件提醒相關人員
➤ 設備管理及安全
➤ 設備連接與數據傳輸
➤ 數據存儲與處理
➤ 異常事件處理
物聯網平臺需要連接眾多的終端設備和傳感器,因此,需要一個管理這些設備的工具。另外,設備和傳感器是通過網絡與物聯網平臺進行連接的,設備要連接到物聯網平臺並且進行數據的傳輸需要進行設備身份的認證和數據的加密,來保證設備通訊的安全。
在 AWS IoT 中,通過設備註冊來實現對設備的管理。通過設備註冊,能夠為設備進行命名、分類、分組、設定權限等操作。
設備註冊後就可以在 AWS IoT 控制臺上對所連接的設備進行管理。
用戶也可以利用 AWS 所提供的 API 將設備管理與企業的EAM(企業資產管理)平臺進行對接,實現設備與物聯網平臺管理的關聯。在進行設備註冊的同時,AWS IoT 的設備管理會為設備生成證書,只有配置了這些證書的設備才能夠連接到 AWS IoT 上,並幫助設備與 AWS IoT 之間的通訊進行加密,確保物聯網接入和通訊的安全。https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/register-device.html
如要使用 ESP32開發板與 LM35溫度傳感器構建的溫度監測組件與 AWS IoT 進行對接,則需要對 ESP32開發板進行編程。這裡我們使用 Arduino IDE 編程工具通過 C 語言對 ESP32 進行開發。
關於 Arduino IDE 基於 AWS IoT 和ESP32 開發環境的配置可以參考 https://github.com/aws-samples/aws-iot-workshop 中 MacOS 或者 Windows 的安裝與配置部分。
環境安裝與配置完成之後,能夠在開發板菜單選擇「ESP32 Dev Module」和在包含庫中選擇「AWS_IOT」。使用 USB 線將開發機與 ESP32 連接後,需選擇接入埠。後續我們對開發板寫入的程序都通過該埠寫入。通過 Arduino IDE 構建的 ESP32程序主框架如下:
// 初始化變量,AWS IoT端點、隊列,WIFI配置,LM35引腳,報文等
……
……
// Arduino程序初始化函數
void setup()
{
WiFi.disconnect(true);
Serial.begin(115200);
// 建立WIFI連接
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to Wifi network: ");
Serial.println(WIFI_SSID);
status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
delay(5000);
}
Serial.println("Connected to Wifi!");
// 建立AWS IoT連接
if(hornbill.connect(HOST_ADDRESS,CLIENT_ID)== 0) {
Serial.println("Connected to AWS, bru");
delay(1000);
}
else {
Serial.println("AWS connection failed, Check the HOST Address");
while(1);
}
}
// 循環執行函數
void loop()
{
int RawValue= 0;
double Voltage = 0;
double tempC = 0;
double tempF = 0;
// 讀取LM35數據
RawValue = analogRead(analogIn);
Voltage = (RawValue / 2048.0) * 3300; // 5000 to get millivots.
// 攝氏度
tempC = Voltage * 0.1;
// 華氏度
tempF = (tempC * 1.8) + 32; // conver to F
// 獲得當前時間
time_t t = time(NULL);
int ii = time(&t);
// 生成JSON報文
sprintf(payload,"{\"state\": {\"reported\": {\"devid\":\" %s \",\"timestamp\":\" %d \",\"temperature\":\" %f \"}}}",CLIENT_ID, ii, tempC);
Serial.println(payload);
// 向AWS IoT發送報文
if(hornbill.publish(TOPIC_NAME,payload) == 0) {
Serial.println("Message published successfully");
}
else {
Serial.println("Message was not published");
}
// 每隔5秒執行一次
delay(5000);
}
https://github.com/steelren/aws_iot_core_workshop/blob/master/code/Esp32_LM35.ino
在 Arduino IDE 的 AWS 庫文件中,需要將之前配置所得到的證書的內容寫入到 aws_iot_certficates.c 文件,以便程序能夠通過 AWS IoT 的連接認證。/**
* @file aws_iot_certifcates.c
* @brief File to store the AWS certificates in the form of arrays
*/
#ifdef __cplusplus
extern "C" {
#endif
// AWS CA根證書
const char aws_root_ca_pem[] = {"BEGIN CERTIFICATE\n\
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n\
……
……
END CERTIFICATE\n"};
// 設備證書
const char certificate_pem_crt[] = {"BEGIN CERTIFICATE\n\
MIIDWTCCAkGgAwIBAgIUWxxS4xnnzBXoaoxwgWQ9Ij7ikKswDQYJKoZIhvcNAQEL\n\
……
……
END CERTIFICATE\n"};
// 設備私鑰
const char private_pem_key[] = {"BEGIN RSA PRIVATE KEY\n\
MIIEogIBAAKCAQEA26qt4XZCtlUSIz1acsyiXHJmqCEEkXBp6YuQUeT4wIihqr2w\n\
……
……
END RSA PRIVATE KEY\n"};
#ifdef __cplusplus
}
#endif
https://github.com/steelren/aws_iot_core_workshop/blob/master/code/aws_iot_certficates.c
程序編譯通過,即可通過 Arduino IDE 寫入 ESP32開發板,就能夠實現程序的在開發板中運行。通過 AWS IoT 測試工具能夠查看到接收的 ESP32開發板發送的信息。
物聯網數據採集之後,所面臨的首要問題就是如何存儲這些數據,其次就是怎樣使用這些數據。AWS IoT Core 提供了非常便利的手段幫助用戶對數據進行存儲和處理。在本文所介紹的應用場景中,我們主要使用 AWS IoT Core 所提供的規則(Rule)與操作(Action)來對物聯網數據進行處理。
AWS IoT Core 規則由 SQL SELECT 語句、主題篩選條件和規則操作組成。設備通過將消息發布到 MQTT 主題來向 AWS IoT Core 發送信息。利用 SQL SELECT 語句,您可以從傳入的 MQTT 消息提取數據。AWS IoT Core 規則的主題篩選條件用於指定一個或多個 MQTT 主題。當主題收到與主題篩選條件匹配的 MQTT 消息時,將觸發規則。藉助規則操作,您可以獲取從 MQTT 消息提取的信息並將其發送到其他 AWS 服務。
AWS IoT Core 規則操作用於指定規則觸發後應執行的操作。用戶可以定義一些操作以便將數據寫入 Amazon DynamoDB 資料庫或 Amazon Kinesis 流,或者調用 AWS Lambda 函數等。
在該業務場景中,我們使用 AWS IoT Core 規則觸發兩個操作,我們直接對 AWS IoT Core 所接收到的所有溫度監測數據進行處理。1、將溫度數據以文件方式直接存入 Amazon S3對象存儲,一方面通過對象存儲降低存儲成本,另一方面也為未來基於 Amazon S3構建的數據湖打下基礎。
此種配置方式每條物聯網數據都會在 Amazon S3保存為一個文件,在實際生產環境中,我們推薦用戶通過規則調用 Amazon Kinesis Firehose 對數據進行匯聚和壓縮後,再存入 Amazon S3,會有更佳的管理和成本優勢。2、通過觸發 AWS Lambda 函數,對數據進行解析處理,並將數據存入 AWS RDS MySQL 資料庫。在該場景中,我們通過 Node.js 構建了 AWS Lambda 函數,包括報文數據解析和資料庫表插入,核心代碼可參考如下:exports.handler = (event, context, callback) => {
// Receive Data from IoT Rule
var eventText = JSON.stringify(event, null, 2);
console.log("Received event:", eventText);
var devid = (JSON.parse(eventText)).state.reported.devid;
var timestamp = (JSON.parse(eventText)).state.reported.timestamp;
var temperature = (JSON.parse(eventText)).state.reported.temperature;
//prevent timeout from waiting event loop
context.callbackWaitsForEmptyEventLoop = false;
pool.getConnection(function(err, connection) {
// Use the connection
var insertSQL = 'insert into shiiottable (devid, msgtimestamp, temperature)values (?, ?, ?)';
var params = [devid, timestamp, temperature];
connection.query(insertSQL, params, function (error, results, fields) {
// And done with the connection.
connection.release();
// Handle error after the release.
if (error)
callback(error);
else
callback(null,results);
console.log('The solution is: ', results);
});
});
};
詳細代碼可參考如下連結:
https://github.com/steelren/aws_iot_core_workshop/blob/master/code/index.js
用戶也可以構建更複雜的處理程序來對數據進行處理。
通過上述的簡單配置即可很方便的完成數據的存儲和處理程序的觸發,為用戶充分利用和發揮物聯網及其數據的作用打下良好的基礎。
在物聯網業務中,大量的數據從設備和傳感器一端產生,這些數據能夠直接的反應出設備或者設備相關的業務所運行的狀態。在實際的生產中,設備或者業務的異常處理是非常常見的一種業務場景,比如設備溫度過高觸發告警,就是非常典型的應用場景。在本業務場景中,我們也利用 AWS IoT Core 的規則來實現超溫觸發郵件告警的功能。在異常事件規則中,我們設置溫度40度作為報警閾值,從 AWS IoT Core 的 MQTT 隊列中選擇溫度大於等於40度的數據進行告警。告警的方式我們通過 Amazon SNS 消息通知服務觸發郵件進行告警。通過此方式,用戶就可以在傳感器溫度超過40度的時候,觸發郵件通知。如果通過該規則觸發 AWS Lambda 函數或者其他方式,則能夠實現更豐富的處理方式。
在本文中,通過實戰場景的方式介紹了設備傳感器與 AWS IoT Core 以及 AWS 其他相關雲服務構建一個雖然簡單但是比較完整的物聯網解決方案。因為篇幅所限,本文中只涉及到了整個解決方案的框架部門,很多細節並沒有體現。為了讓大家能夠更詳細了解整個方案的構建過程,整理了一個詳細的方案配置步驟的說明文檔,大家可以參考如下連結:
https://github.com/steelren/aws_iot_core_workshop
在這個說明文檔當中,會通過 Step by Step 的說明,讓大家自己動手完成搭建並運行該解決方案場景的所有的步驟。