文章始發:雲棲社區
作者:xinyu198736
原文鏈接:https://yq.aliyun.com/articles/719045
文中提到的 AliyunIoTSDK 這個 arduino 庫,可以在 arduino 庫商店裡搜索到(搜索 AliyunIoTSDK)
https://github.com/xinyu198736/arduino-aliyun-iot-sdk
有問題,歡迎提 issues 或 PR 共建
阿里雲物聯網平臺簡介
阿里雲物聯網平臺提供接入物聯網場景的一整套基礎設施,強大的在線配置能力,基本可以實現無代碼開發接入各類應用,實現大規模的物聯網應用場景。
核心能力模塊包括:
- 產品&設備創建和管理
- 服務可視化開發
- 控制界面可視化開發
- 數據分析和監控運維等輔助設施
基於以上功能模塊,可以快速在阿里雲定義設備模型和事件等信息,然後快速創建和接入設備,再利用可視化的開發平臺,可以零代碼實現非常強大的功能。
不過,今天我們要介紹一個比較特殊的接入場景,使用嵌入式系統快速接入阿里雲物聯網平臺,這裡以 esp8266 為例。
esp8266 是一款集成網絡模塊的嵌入式芯片,自帶 32 位處理器,各種外設接口,wifi 模塊等,可以使用 arduino 平臺進行編程,兼容大量 arduino 庫。
本文就是以 arduino 編程方式,使用的 esp8266 開發板為 NodeMCU 1.0 ,淘寶成本僅為 8~10 元。
場景
本次我們想利用 ESP8266 芯片實現一個簡單的可遠程控制的空調控制器,具備以下功能:
- 批量部署,可通過雲平臺集中管理和遠程控制空調開關、溫度、模式等
- 芯片可感知環境溫度、亮度,並上報物聯網平臺
- 芯片可遠程觸發事件,上報物聯網平臺
- 成本儘量低,不超過 30 元
首先,我們進行硬件選型,經過功能評估,選用以下硬件:
- nodemcu 核心板(基於 esp8266) 10.89元/個
- DS18B20模塊 溫度傳感 3.18元/個
- GY-30 光照傳感 4.38元/個
- 紅外發射板 3.5元/個
- 杜邦線母對母 1.45元/串
- 電源插頭 1.4元/個
- 數據線 1.8元/個
- 按鈕開關 0.75元/個
開始接入
具體的連線,我們這裡不展開,我們主要探討如何使用 arduino 快速接入物聯網平臺。
第一步,在物聯網創建產品,建立物模型,並創建設備,獲取設備配置信息。
創建產品,並定義物模型
創建設備,與產品綁定,獲取設備鑑權信息
第二步,用 arduino 連接 nodemcu 開發板,開始硬件端的開發。
具體接線可以自己研究,這裡只是個展示,哈哈
硬件端開發
這裡不討論如何使用 arduino 進行 esp8266 芯片開發,直接進入代碼環節,相關基礎知識可以百度一下。
首先,亮相一個我自己封裝的 aliyun iot 上層 SDK( arduino-aliyun-iot-sdk ),底層連接基於 PubSubClient 庫,並且對模型操作做了一些上層封裝,可以方便的發送數據和訂閱遠程指令。
// 引入 wifi 模塊,並實例化,不同的芯片這裡的依賴可能不同
#include <ESP8266WiFi.h>
static WiFiClient espClient;
// 引入阿里雲 IoT SDK
#include <AliyunIoTSDK.h>
// 設置產品和設備的信息,從阿里雲設備信息裡查看
#define PRODUCT_KEY "xxx"
#define DEVICE_NAME "Device_D"
#define DEVICE_SECRET "xxxxxxxxxxxxxx"
#define REGION_ID "cn-shanghai"
// 設置 wifi 信息
#define WIFI_SSID "xxxxx"
#define WIFI_PASSWD "xxxxx"
void setup()
{
Serial.begin(115200);
// 初始化 wifi
wifiInit(WIFI_SSID, WIFI_PASSWD);
// 初始化 iot,需傳入 wifi 的 client,和設備產品信息
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
// 綁定一個設備屬性回調,當遠程修改此屬性,會觸發 powerCallback
// PowerSwitch 是在設備產品中定義的物聯網模型的 id
AliyunIoTSDK::bindData("PowerSwitch", powerCallback);
// 發送一個數據到雲平臺,LightLuminance 是在設備產品中定義的物聯網模型的 id
AliyunIoTSDK::send("LightLuminance", 100);
}
void loop()
{
AliyunIoTSDK::loop();
}
// 初始化 wifi 連接
void wifiInit(const char *ssid, const char *passphrase)
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passphrase);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("WiFi not Connect");
}
Serial.println("Connected to AP");
}
// 電源屬性修改的回調函數
void powerCallback(JsonVariant p)
{
int PowerSwitch = p["PowerSwitch"];
if (PowerSwitch == 1)
{
// 啟動設備
}
}
核心代碼只有三句:
// 初始化 iot,需傳入 wifi 的 client,和設備產品信息
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
// 綁定一個設備屬性回調,當遠程修改此屬性,會觸發 powerCallback
// PowerSwitch 是在設備產品中定義的物聯網模型的 id
AliyunIoTSDK::bindData("PowerSwitch", powerCallback);
// 發送一個數據到雲平臺,LightLuminance 是在設備產品中定義的物聯網模型的 id
AliyunIoTSDK::send("LightLuminance", 100);
注意這裡的數據綁定和數據發送,是非常有用和方便的,不需要自己去寫做匹配的代碼,也不需要自己組裝數據,並且會自動合併數據,節約上報的頻率。
將設備配置信息配置進代碼,燒錄到板子,運行即可,是不是炒雞方便呢。
注意事項:
- 阿里雲對客戶端的鏈接參數有一些限制,需要修改 PubSubClient 的連接參數,否則無法使用
PubSubClient 中的 MQTT_MAX_PACKET_SIZE 修改為 1024
PubSubClient 中的 MQTT_KEEPALIVE 修改為 60
- 默認 5000ms 檢測一次連接狀態,可以通過 AliyunIoTSDK.cpp 中的 CHECK_INTERVAL 修改此值
- 掉線後會一直嘗試重新連接,可能會觸發阿里雲的一些限流規則(已經做了規避),並且會導致擠掉其他同設備 ID 的設備
資源
目前 AliyunIoTSDK 這個 arduino 庫,可以在 arduino 庫商店裡搜索到(搜索 AliyunIoTSDK),但是版本可能不一定是最新的,可以手動把 github 上的項目 clone 下來,放到 arduino 的 library 庫下,保證功能是最新的。
github 地址:https://github.com/xinyu198736/arduino-aliyun-iot-sdk
有問題,歡迎提 issues 或 PR 共建,我對 c++ 不是特別熟悉,寫出來的代碼可能不一定是最合理的。
可視化開發界面和服務
完成了設備的連接之後,已經邁出了第一步,如果你想要自己開發一個界面,可視化的控制空調,或者想利用一些遠程設備的數據觸發一些自定義的規則和邏輯(例如如果某個數據超標,報警到釘釘群等),用阿里雲的物聯網平臺的話,這些都不需要自己去開發,直接使用物聯網平臺的“開發服務”拖拖拽拽即可完成。
界面開發
界面開發的核心是 拖動佈局、數據源綁定、交互綁定、自定義變量等。
佈局界面,右側可以設置各種控件屬性
數據源綁定,可以方便的和產品模型數據綁定
交互綁定,可以與服務進行綁定,觸發某個服務,並傳入設備屬性
控件可以給自定義變量賦值,其他組件可以與變量綁定
使用上述的功能,加上各種設備綁定功能,基本可以完成一個很複雜的界面的開發,但是如果你需要通過交互觸發遠程指令,或者監聽遠程的數據做一些判斷邏輯,光有界面是不夠的。
服務開發
上面提到的邏輯開發,就需要使用“服務開發”了,服務開發的觸發點主要是兩類:設備觸發、界面交互觸發。
設備觸發的服務,中間的路徑選擇是用來做條件判斷分流的,最右側是觸發通知邏輯節點
一個溫度控制服務,通過界面控件觸發,最終生成設備控制邏輯
結語
本文不是 arduino 教學,也不是 esp8266 教學,更不是硬件教學,所以沒有展開細節,需要讀者具備一定的基礎,請各位諒解。
最後展示一下成果:
一個成品,包含四個傳感器模塊,包括一個硬件按鈕
空調遠程控制界面
另外,還可以給這個控制器加入一些很有意思的功能,例如定點關閉所有設備,根據環境亮度開關空調等。