近年來(lái),智能暫存柜在物流、服務(wù)行業(yè)大放異彩。例如順豐蜂巢快遞柜、菜鳥(niǎo)驛站智能柜等,不但解決了快遞行業(yè)的最后一公里理念,還能在特殊的時(shí)期(例如疫情期間)避免人流聚集。
基于涂鴉IoT開(kāi)發(fā)平臺(tái),使用涂鴉三明治Wi-FiMCU通信板(WB3S)、涂鴉三明治電源板、STM32開(kāi)發(fā)板、門(mén)鎖驅(qū)動(dòng)、以及其他零部件,借助涂鴉MCUSDK低代碼開(kāi)發(fā)方式,您可以跟隨本教程快速開(kāi)發(fā)一個(gè)校園智能暫存柜產(chǎn)品原型。
本教程內(nèi)容均為涂鴉開(kāi)發(fā)者@何權(quán)燊提供,經(jīng)其授權(quán)編輯發(fā)布。
物料清單:
1、涂鴉三明治Wi-FiMCU通信板(WB3S)數(shù)量:1
適用于涂鴉IoT自定義方案中,照明、臺(tái)燈、燈絲燈、調(diào)光器、照明遙控器、排插、開(kāi)關(guān)、家電、運(yùn)動(dòng)健康、傳感類(lèi)產(chǎn)品原型。
2、涂鴉三明治直流供電電源板數(shù)量:1
用于給涂鴉三明治其余相關(guān)的部件供電。
3、STM32開(kāi)發(fā)板數(shù)量:1
支持評(píng)估高成本效益的超低功耗LPWAN遠(yuǎn)距離物聯(lián)網(wǎng)連接。
4、門(mén)鎖驅(qū)動(dòng)板數(shù)量:1
根據(jù)認(rèn)證信號(hào)或鑰匙動(dòng)作,決定是否將內(nèi)側(cè)門(mén)把手軸和外側(cè)門(mén)把手軸聯(lián)接。
步驟
第1步:產(chǎn)品框架
智能校園寄存柜管理系統(tǒng)由以下IoT組件組成:智能暫存柜設(shè)備:門(mén)鎖驅(qū)動(dòng)板、涂鴉三明治通訊板、涂鴉三明治電源板、STM32開(kāi)發(fā)板
涂鴉云開(kāi)發(fā)平臺(tái):設(shè)備管理、設(shè)備控制
微信小程序(經(jīng)由涂鴉小程序SDK開(kāi)發(fā)):用戶(hù)掃碼開(kāi)柜存放、用戶(hù)取用存
管理后臺(tái)(由開(kāi)發(fā)者服務(wù)器運(yùn)行):用戶(hù)列表、存放記錄、管理員授權(quán)開(kāi)柜、設(shè)備列表
第2步:組裝設(shè)備PCBA和開(kāi)發(fā)嵌入式軟件
暫存柜硬件部分
暫存柜分為四部分:
門(mén)鎖驅(qū)動(dòng)板,門(mén)鎖驅(qū)動(dòng)原理如下圖所示:
涂鴉三明治通訊板
STM32開(kāi)發(fā)板
涂鴉三明治電源板
暫存柜嵌入式軟件部分
作品使用的涂鴉智能MCU接入方式接入:
1、在涂鴉IoT平臺(tái)上參考選品類(lèi)創(chuàng)建產(chǎn)品創(chuàng)建一個(gè)四路排查(升級(jí)版)_Wi-Fi_BLE產(chǎn)品。產(chǎn)品的模型使用的是插排,該排插硬件方案與作者定義的智能暫存柜具備相似的DP(DataPoint)定義。
2、在功能定義頁(yè)面,根據(jù)智能暫存柜的相關(guān)功能定義設(shè)置DP。
作者添加了4個(gè)DP,分別對(duì)應(yīng)4個(gè)柜鎖。
3、在硬件開(kāi)發(fā)頁(yè)面,選擇一款模組,例如WBR3模組,然后在下載資料區(qū)域下載MCU_SDK。
4、配置開(kāi)發(fā)板,移植SDK。
作者使用的STM32官方開(kāi)發(fā)板,采用STM32CubeMX+CLion方式進(jìn)行單片機(jī)開(kāi)發(fā)。
作者使用了一個(gè)串口用于涂鴉開(kāi)發(fā)板通訊,以及四個(gè)GPIO分別控制對(duì)應(yīng)的門(mén)鎖繼電器。對(duì)接涂鴉MCU_SDK時(shí),作者主要使用了以下功能:
串口接收和發(fā)送
SDK初始化以及運(yùn)行
網(wǎng)絡(luò)狀態(tài)以及配網(wǎng)
串口接收和發(fā)送
串口發(fā)送使用的寄存器方式發(fā)送數(shù)據(jù):
將這個(gè)發(fā)送函數(shù)填入到SDK的Protocol.c中:
使用串口中斷接收進(jìn)行串口數(shù)據(jù)的接收:
并且在main里面啟用串口中斷接收:
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
SDK初始化以及運(yùn)行
主要是在main和主循環(huán)里面分別填入wifi_protocol_init和wifi_uart_service。
獲取網(wǎng)絡(luò)狀態(tài)以及配網(wǎng),使用mcu_get_wifi_work_state即可獲取當(dāng)前模組的網(wǎng)絡(luò)狀態(tài)。
復(fù)位配網(wǎng)
涂鴉提供了Wi-Fi快連配網(wǎng)和熱點(diǎn)配網(wǎng)兩種配網(wǎng)方式。
調(diào)用SDK的mcu_api.c中的mcu_reset_wifi()即可對(duì)模組進(jìn)行復(fù)位并且進(jìn)入配網(wǎng)狀態(tài)。
控制繼電器開(kāi)鎖
原理是給GPIO一個(gè)250ms的高電平使鎖芯通電彈出鎖鉤。以開(kāi)關(guān)1為例,其他以此類(lèi)推。
第3步:連接涂鴉云開(kāi)發(fā)平臺(tái)
作者調(diào)用了涂鴉云開(kāi)發(fā)平臺(tái)的設(shè)備信息查詢(xún)和設(shè)備控制能力進(jìn)行后端環(huán)境開(kāi)發(fā)。因?yàn)橥盔f云開(kāi)發(fā)平臺(tái)的主要SDK為JavaSDK,而作者的后端環(huán)境的使用的是PHP,所以作者自行調(diào)用云開(kāi)發(fā)平臺(tái)API寫(xiě)了一個(gè)類(lèi),實(shí)現(xiàn)了是簡(jiǎn)單的鑒權(quán)和獲取設(shè)備信息、設(shè)備控制。
實(shí)現(xiàn)代碼如下:
get_devices($devicesid);$data=json_decode($data,true);//var_dump($data);if($data['success']){foreach($data['result']['status']as$lock){if(!$lock['value']){$data=$this->set_device($devicesid,$lock['code'],true);$data=json_decode($data,true);if($data['success']){return$lock['code'];}}}}returnfalse;}publicfunctionRequestclose($devicesid,$lockcode){$data=$this->set_device($devicesid,$lockcode,false);$data=json_decode($data,true);return$data['success'];}publicfunctionget_devices($devicesid){$this->get_token();$data=$this->queryheader_business();$requestdata=$this->query_curl("GET",APIURL."/v1.0/devices/".$devicesid,$data,"");return$requestdata;}publicfunctionget_devices_list($page_no,$page_size,$product_id){$this->get_token();$data=$this->queryheader_business();$requestdata=$this->query_curl("GET",APIURL."/v1.0/devices?page_no=".$page_no."&page_size=".$page_size."&product_id=".$product_id,$data,"");return$requestdata;}publicfunctionset_device($devicesid,$comkey,$state){$postdata=array();$postdata["commands"][0]["code"]=$comkey;$postdata["commands"][0]["value"]=$state;$postdata=json_encode($postdata);$this->get_token();$data=$this->queryheader_business();$requestdata=$this->query_curl("POST",APIURL."/v1.0/devices/".$devicesid."/commands",$data,$postdata);return$requestdata;}privatefunctionaccess_token(){$data=$this->queryheader_token();$requestdata=$this->query_curl("GET",APIURL."/v1.0/token?grant_type=1",$data,"");$arraydata=json_decode($requestdata,true);if($arraydata['success']=="true"){$this->access_token=$arraydata['result']['access_token'];$this->refresh_token=$arraydata['result']['refresh_token'];$this->expire_time=time()+$arraydata['result']['expire_time'];$this->uid=$arraydata['result']['uid'];$tokendata=array();$tokendata['access_token']=$this->access_token;$tokendata['refresh_token']=$this->refresh_token;$tokendata['expire_time']=$this->expire_time;$tokendata['uid']=$this->uid;$tokendata=json_encode($tokendata);$this->set_token($tokendata);returntrue;}returnfalse;}privatefunctionget_token(){$redis=newRedis();//$redis->connect(redisarr,6379);//$redis->auth('demo');$data=$redis->get('token');$arraydata=json_decode($data,true);$this->access_token=$arraydata['access_token'];$this->refresh_token=$arraydata['refresh_token'];$this->expire_time=$arraydata['expire_time'];$this->uid=$arraydata['uid'];if($this->expire_time-time()access_token();}//$redis->close();}privatefunctionset_token($data){$redis=newRedis();//$redis->connect(redisarr,6379);//$redis->auth('demo');$redis->set('token',$data);//$redis->close();}privatefunctionqueryheader_business(){list($t1,$t2)=explode('',microtime());$time=(float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);$Message=client_id.$this->access_token.$time;$sha256data=hash_hmac('sha256',$Message,secret,false);$sign=strtoupper($sha256data);$headerdata=array('client_id:'.client_id,'sign:'.$sign,'sign_method:HMAC-SHA256','t:'.$time,'lang:ch','access_token:'.$this->access_token,'Content-Type:application/json');return$headerdata;}privatefunctionqueryheader_token(){list($t1,$t2)=explode('',microtime());$time=(float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);$Message=client_id.$time;$sha256data=hash_hmac('sha256',$Message,secret,false);$sign=strtoupper($sha256data);$headerdata=array('client_id:'.client_id,'sign:'.$sign,'t:'.$time,'sign_method:HMAC-SHA256','lang:ch');return$headerdata;}privatefunctionquery_curl($typequery,$url,$headerdata=array(),$bodydata=array()){$curl=curl_init();curl_setopt($curl,CURLOPT_URL,$url);curl_setopt($curl,CURLOPT_HTTPHEADER,$headerdata);curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);curl_setopt($curl,CURLOPT_HEADER,false);curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);//curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);if($typequery=="POST"){curl_setopt($curl,CURLOPT_POST,true);curl_setopt($curl,CURLOPT_POSTFIELDS,$bodydata);}else{curl_setopt($curl,CURLOPT_POST,false);}$tmpInfo=curl_exec($curl);curl_close($curl);return$tmpInfo;}}
第4步:開(kāi)發(fā)微信小程序
用戶(hù)開(kāi)柜存放
實(shí)現(xiàn)原理:掃碼存放-用戶(hù)掃碼-把用戶(hù)ID和設(shè)備ID(掃碼結(jié)果)-云端請(qǐng)求開(kāi)鎖-完成
實(shí)現(xiàn)代碼:
用戶(hù)取出存放
實(shí)現(xiàn)原理:用戶(hù)點(diǎn)擊取出存放-云端查詢(xún)是否存在未取出的存放-如有請(qǐng)求開(kāi)柜,若無(wú)反饋無(wú)存放。
實(shí)現(xiàn)代碼:
第5步:開(kāi)發(fā)管理后臺(tái)
智能暫存柜管理后臺(tái)使用ThinkPHP5框架和Xadmin前端框架進(jìn)行開(kāi)發(fā)。
用戶(hù)列表
實(shí)現(xiàn)原理:用戶(hù)授權(quán)小程序獲取用戶(hù)信息后,調(diào)用后端接口對(duì)用戶(hù)的注冊(cè)并寫(xiě)入數(shù)據(jù)庫(kù),用戶(hù)列表只是遍歷數(shù)據(jù)庫(kù)表的數(shù)據(jù)。
實(shí)現(xiàn)代碼:
存放記錄
實(shí)現(xiàn)原理:獲取數(shù)據(jù)庫(kù)設(shè)備存儲(chǔ)記錄表的數(shù)據(jù)并且遍歷出來(lái),而管理員開(kāi)柜是通過(guò)傳遞ID給前端,當(dāng)管理員按開(kāi)柜的按鈕即可把列表ID傳后端,通過(guò)ID在數(shù)據(jù)庫(kù)中查找設(shè)備ID和開(kāi)柜號(hào),并調(diào)用SDK控制設(shè)備開(kāi)柜。
實(shí)現(xiàn)代碼:
設(shè)備列表實(shí)現(xiàn)原理:通過(guò)SDK獲取設(shè)備列表,并傳遞到前端進(jìn)行遍歷。
實(shí)現(xiàn)代碼:
涂鴉物聯(lián)網(wǎng)開(kāi)發(fā)平臺(tái)為開(kāi)發(fā)者提供了便捷的IoT開(kāi)發(fā)工具與服務(wù),助力開(kāi)發(fā)者更高效的完成設(shè)備接入,并為開(kāi)發(fā)者提供物聯(lián)網(wǎng)應(yīng)用開(kāi)發(fā)及場(chǎng)景服務(wù)能力。
看到這里你是否也很心動(dòng)?不如親手實(shí)踐,自己手動(dòng)一個(gè)校園暫存柜吧~
auth.tuya.com/?from=https%3A%2F%2Fiot.tuya.com%2F&_source=795a75d7c1af33f95d8ea55409e4b22e |
編輯:jq
-
mcu
+關(guān)注
關(guān)注
146文章
17316瀏覽量
352286 -
STM32
+關(guān)注
關(guān)注
2271文章
10923瀏覽量
357139 -
wi-fi
+關(guān)注
關(guān)注
14文章
2169瀏覽量
124855 -
調(diào)光器
+關(guān)注
關(guān)注
4文章
147瀏覽量
23385
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論