您現在的位置是:首頁 > 動漫首頁動漫

如何用Link Develop開發一個智慧廁所

由 阿里云云棲號 發表于 動漫2021-09-08
簡介connected()) { Serial

奧比克usr簽名卡多少錢

概述

由於阿里雲懸殊的男女比例,以及廁所佔地面積的限制,各位男同胞每天都要在特殊味道的包圍下等待有限的坑位。我們在想能不能利用物聯網技術做一個低成本的解決方案,讓男同胞們不需要親自去現場的情況下也能得知坑位的空餘情況(像停車場一樣),基於我們IoT事業部的一站式開發平臺——Link Develop,做一個IoT的智慧廁所。

技術架構

如何用Link Develop開發一個智慧廁所

前期準備

硬體

NodeMCU x9,PIR感測器 x9,1800mAh LiPo電池 x9,防水盒子 x9,usb mini 連線線 x1

軟體

Arduino IDE

平臺

阿里雲賬號,Link Develop平臺許可權開通

具體實施

建立裝置模型

裝置模型可以理解為一個類,或者一個模板。它規定了某種裝置下的共有屬性,並且允許你批次例項化裝置。

如何用Link Develop開發一個智慧廁所

如何用Link Develop開發一個智慧廁所

進入Link Develop平臺,跟其他雲產品一樣,需要先完成基本的入駐資訊填寫。

如何用Link Develop開發一個智慧廁所

接下來我們會進入到一個專案空頁面,我們需要在頁面頂部點選“新建裝置模型”。開啟裝置模型彈窗,輸入名稱以及定義類別,這裡我們選擇“自定義型別”即可。然後進入到裝置模型的詳情頁之後,新增標準功能——輸入紅外——選擇紅外檢測狀態。我們就完成了一個可以上報紅外檢測資料的裝置模型了。這個模型已經滿足我們的需求。

如何用Link Develop開發一個智慧廁所

然後我們需要例項化我們的廁所監控裝置,在裝置模型詳情頁裡點選“測試裝置”tab。然後依次建立9個不同裝置名稱(deviceName)的測試裝置。每個裝置建立完成後都有一個ProductKey,DeviceName和DeviceSecret,我們簡稱為“三元組”,接下來我們還會用到這個。

如何用Link Develop開發一個智慧廁所

做完這些步驟之後,裝置模型的建立與例項化就OK了。接下來我們進入Arduino程式碼編寫。

硬體開發

PIR只有三個口,分別是VCC,GND和輸出口。接線方法如下(NodeMCU的D7相當於arduino裡的Pin 13)

如何用Link Develop開發一個智慧廁所

然後接上usb線。開啟arduino IDE。複製以下程式碼:

#include #include #include #define SENSOR_PIN 13/* 連線您的WIFI SSID和密碼,這個9個裝置可以一致 */#define WIFI_SSID “yourssid”#define WIFI_PASSWD “yourwifipassword”/* 產品的三元組資訊,根據9個測試裝置的三元組,每個裝置都燒錄不同的*/#define PRODUCT_KEY “yourproductKey”#define DEVICE_NAME “yourdeviceName”#define DEVICE_SECRET “yourdeviceSecret”/* LD線上環境域名和埠號,不需要改 */#define MQTT_SERVER PRODUCT_KEY“。iot-as-mqtt。cn-shanghai。aliyuncs。com”#define MQTT_PORT 1883#define MQTT_USRNAME DEVICE_NAME “&” PRODUCT_KEY// TODO: MQTT連線的簽名信息,雜湊加密請以“clientIdtestdeviceName”+裝置名稱+“productKey”+裝置模型標識+“timestamp123456789”前往http://tool。oschina。net/encrypt?type=2進行加密// HMACSHA1_SRC clientIdtestdeviceNamehuman04productKeya1rezUVs103timestamp123456789#define CLIENT_ID “test|securemode=3,timestamp=123456789,signmethod=hmacsha1|”#define MQTT_PASSWD “e0748281f8db36e12cac478801318f95ae821ba7”#define ALINK_BODY_FORMAT “{\”id\“:\”123\“,\”version\“:\”1。0\“,\”method\“:\”%s\“,\”params\“:%s}”#define ALINK_TOPIC_PROP_POST “/sys/” PRODUCT_KEY “/” DEVICE_NAME “/thing/event/property/post”#define ALINK_TOPIC_PROP_POSTRSP “/sys/” PRODUCT_KEY “/” DEVICE_NAME “/thing/event/property/post_reply”#define ALINK_TOPIC_PROP_SET “/sys/” PRODUCT_KEY “/” DEVICE_NAME “/thing/service/property/set”#define ALINK_METHOD_PROP_POST “thing。event。property。post”unsigned long lastMs = 0;WiFiClient espClient;PubSubClient client(espClient);void callback(char *topic, byte *payload, unsigned int length){ Serial。print(“Message arrived [”); Serial。print(topic); Serial。print(“] ”); payload[length] = ‘\0’; Serial。println((char *)payload); if (strstr(topic, ALINK_TOPIC_PROP_SET)) { StaticJsonBuffer<100> jsonBuffer; JsonObject& root = jsonBuffer。parseObject(payload); if (!root。success()) { Serial。println(“parseObject() failed”); return ; } }}void wifiInit(){ WiFi。mode(WIFI_STA); WiFi。begin(WIFI_SSID, WIFI_PASSWD); while (WiFi。status() != WL_CONNECTED) { delay(1000); Serial。println(“WiFi not Connect”); } Serial。println(“Connected to AP”); Serial。println(“IP address: ”); Serial。println(WiFi。localIP()); client。setServer(MQTT_SERVER, MQTT_PORT); /* 連線WiFi之後,連線MQTT伺服器 */ client。setCallback(callback);}void mqttCheckConnect(){ while (!client。connected()) { Serial。println(“Connecting to MQTT Server 。。。”); if (client。connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD)) { Serial。println(“MQTT Connected!”); // client。subscribe(ALINK_TOPIC_PROP_POSTRSP); client。subscribe(ALINK_TOPIC_PROP_SET); Serial。println(“subscribe done”); } else { Serial。print(“MQTT Connect err:”); Serial。println(client。state()); delay(5000); } }}void mqttIntervalPost(){ char param[32]; char jsonBuf[128]; sprintf(param, “{\”MotionAlarmState\“:%d}”, digitalRead(13)); sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param); Serial。println(jsonBuf); client。publish(ALINK_TOPIC_PROP_POST, jsonBuf);}void setup() { pinMode(SENSOR_PIN, INPUT); /* initialize serial for debugging */ Serial。begin(115200); Serial。println(“Demo Start”); wifiInit();} // the loop function runs over and over again forevervoid loop(){ if (millis() - lastMs >= 5000) { lastMs = millis(); mqttCheckConnect(); /* 上報 */ mqttIntervalPost(); } client。loop(); if (digitalRead(SENSOR_PIN) == HIGH){ Serial。println(“Motion detected!”); delay(2000); } else { Serial。println(“Motion absent!”); delay(2000); } }

這裡有幾段程式碼需要解釋一下:

引用庫

#include #include #include

如果之前沒有使用過arduino,這些庫不是arduino自帶的,需要去import一下。以ArduinoJson為例,具體操作方法見下圖:

如何用Link Develop開發一個智慧廁所

修改WiFi

#define WIFI_SSID “yourssid”#define WIFI_PASSWD “yourwifipassword”

這裡要輸入你家的wifi SSID(即wifi名稱)和密碼。如下圖紅框內wifi,SSID即“TOM”(注意大小寫),密碼是“123456”

如何用Link Develop開發一個智慧廁所

修改三元組

/* 產品的三元組資訊,根據9個測試裝置的三元組,每個裝置都燒錄不同的*/#define PRODUCT_KEY “yourproductKey”#define DEVICE_NAME “yourdeviceName”#define DEVICE_SECRET “yourdeviceSecret”

這裡就是之前說的三元組,把不同裝置的對應三元組填入即可。

如何用Link Develop開發一個智慧廁所

修改HashMAC金鑰

// TODO: MQTT連線的簽名信息,雜湊加密請以“clientIdtestdeviceName”+裝置名稱+“productKey”+裝置模型標識+“timestamp123456789”前往http://tool。oschina。net/encrypt?type=2進行加密// HMACSHA1_SRC clientIdtestdeviceNamehuman04productKeya1rezUVs103timestamp123456789#define CLIENT_ID “test|securemode=3,timestamp=123456789,signmethod=hmacsha1|”#define MQTT_PASSWD “e0748281f8db36e12cac478801318f95ae821ba7”

Link Develop平臺為了保證安全性,裝置上傳資料的時候需要驗證身份。因此需要為每個裝置配置不同的Hmac值。方法是先組合一段欄位:

“clientIdtestdeviceName”+裝置名稱+“productKey”+裝置模型標識+“timestamp123456789”

例如剛才截圖的三元組,欄位是

clientIdtestdeviceNamehuman01productKeya1rezUVs103timestamp123456789

寫完這個欄位之後,前往這裡進行加密。選擇HmacSHA1方法,以上面的欄位為明文,deviceSecret為金鑰。見下圖:

如何用Link Develop開發一個智慧廁所

可以得到如下的密文:

e30657f36e7ded9a2781bba97b0dee79e8fa31b6

然後替換掉MQTT_PASSWD原來的欄位即可。

完成程式碼編譯之後,選擇好對應的開發板和燒錄線即可進行上傳。通電之後可以檢視串列埠以及Link Develop上的測試裝置列表看看有否成功上線。

如何用Link Develop開發一個智慧廁所

如何用Link Develop開發一個智慧廁所

應用開發

點選左側欄的Web應用開發,選擇“視覺化應用”並輸入名稱。然後就進入視覺化開發Web應用的工作臺了。

如何用Link Develop開發一個智慧廁所

然後我們需要文字元件用來表示標題等。需要指示燈用來表示當前坑位有沒有人的狀態。

如何用Link Develop開發一個智慧廁所

接下來以坑位1為例舉例如何將元件繫結裝置。點選右側面板的“資料”,選擇關聯裝置。這裡會顯示出所有已經建立的測試裝置。選擇對應坑位的感測器,之後選擇展示的資料(布林型的紅外監測狀態)。這樣就完成了繫結資料了。

如何用Link Develop開發一個智慧廁所

可以透過模擬上線看看是否成功關聯。另外有一些個性化的樣式也可以自己配置。

如何用Link Develop開發一個智慧廁所

接下來就是發揮創造力的時候了。可以上傳各種背景圖,加各種小樣式,做成如圖的看板。最後點選右上角預覽即可。

如何用Link Develop開發一個智慧廁所

這樣就完成了一個看板了!不用忍氣吞聲,直接檢視廁所有沒有空餘坑位!

釘釘推送的教程後續會跟進同步~

部署

這是實體裝機的盒子。為了更好的使用者體驗,我們在盒子上加了一個字條“只檢測有人,沒有攝像頭”,以免使用者產生隱私方面的擔憂。

如何用Link Develop開發一個智慧廁所

如何用Link Develop開發一個智慧廁所

部署的時候用了樹莓派+顯示屏。

如何用Link Develop開發一個智慧廁所

造福90%飛天園區一號樓四樓員工的智慧廁所解決方案,完成!

歡迎使用Link Develop

Link Develop(物聯網開發平臺)是阿里雲針對物聯網領域提供的端到端一站式開發服務平臺,可覆蓋各個物聯網行業應用場景,主要解決物聯網開發領域開發鏈路長、技術棧複雜、協同成本高、方案移植困難的問題,提供了從硬體開發、服務編排、Web應用開發到移動APP開發全鏈路的開發流程、框架/引擎和除錯工具,並可將成熟的開發產出物對接阿里云云市場進行售賣,為開發者實現商業收益。

這篇文章的兩個作者,一位是學法律出身的運營同學,一位是學設計出身的UED同學,兩位都不是專業的工程師,卻能在短短一天之內基於Link Develop完成整個智慧廁所的解決方案搭建。相信大家認識到了Link Develop平臺的開發能力之後,會有更多更新奇的idea出現,並且藉助Link Develop快速實現物聯網應用開發!

作者:dupig