陳嘉歡
摘要:該文介紹了一個(gè)以SpringBoot框架為基礎(chǔ)的物聯(lián)網(wǎng)設(shè)備故障檢測(cè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程。該系統(tǒng)使用了MySQL、Redis以及MongoDB數(shù)據(jù)庫(kù),實(shí)現(xiàn)對(duì)物聯(lián)網(wǎng)設(shè)備進(jìn)行故障檢測(cè)、對(duì)故障信息存儲(chǔ)和反饋的功能,從而滿(mǎn)足了對(duì)物聯(lián)網(wǎng)設(shè)備故障檢測(cè)的基本需求。
關(guān)鍵詞:物聯(lián)網(wǎng)設(shè)備;故障檢測(cè);故障反饋;SpringBoot;Redis;MongoDB
中圖分類(lèi)號(hào):TP311.1 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2022)02-0109-03
1 引言
近年來(lái),隨著社會(huì)和互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,物聯(lián)網(wǎng)技術(shù)也日漸成熟,社會(huì)正在逐步走向“萬(wàn)物互聯(lián)”的時(shí)代。目前市面上誕生了許多功能不同的諸如攝像頭、智能水表、電表以及智能家居等物聯(lián)網(wǎng)設(shè)備[1],這些物聯(lián)網(wǎng)設(shè)備的應(yīng)用場(chǎng)景有很強(qiáng)的針對(duì)性并且十分智能,在提供了某方面功能的同時(shí)簡(jiǎn)化了某些流程、減輕了使用負(fù)擔(dān)從而提升效率。與此同時(shí),越來(lái)越多設(shè)備聯(lián)網(wǎng),也會(huì)造成一些困擾,例如物聯(lián)網(wǎng)設(shè)備的操作管理流程復(fù)雜、設(shè)備發(fā)生故障難以及時(shí)發(fā)現(xiàn)等問(wèn)題。其中對(duì)物聯(lián)網(wǎng)設(shè)備進(jìn)行實(shí)時(shí)故障檢測(cè)和設(shè)備發(fā)生故障時(shí)的第一時(shí)間信息反饋尤為重要。合理運(yùn)用物聯(lián)網(wǎng)設(shè)備故障檢測(cè)功能,能夠在設(shè)備發(fā)生故障時(shí)避免或減少造成相應(yīng)的人力、物力損失。
為了解決上述提到的物聯(lián)網(wǎng)設(shè)備發(fā)生故障難以發(fā)現(xiàn)的問(wèn)題,本文設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)以SpringBoot[2]為基礎(chǔ)的故障檢測(cè)系統(tǒng)[3],將設(shè)備分成兩種類(lèi)型,對(duì)不同類(lèi)型的設(shè)備使用不同的方法進(jìn)行故障檢測(cè),當(dāng)系統(tǒng)檢測(cè)到有設(shè)備發(fā)生故障時(shí),會(huì)采用發(fā)送電子郵件的方式,通知相應(yīng)的人員及時(shí)解決設(shè)備故障問(wèn)題。
2 系統(tǒng)設(shè)計(jì)
2.1 總體設(shè)計(jì)
設(shè)計(jì)該系統(tǒng)使用到的編譯軟件是IDEA,主要以SpringBoot框架為核心,選擇MySQL數(shù)據(jù)庫(kù)[4]對(duì)物聯(lián)網(wǎng)設(shè)備信息持久化存儲(chǔ)、使用Redis數(shù)據(jù)庫(kù)的高速緩存功能對(duì)物聯(lián)網(wǎng)設(shè)備進(jìn)行故障檢測(cè),以及使用MongoDB文檔型數(shù)據(jù)庫(kù)對(duì)設(shè)備故障信息進(jìn)行記錄。
本系統(tǒng)根據(jù)物聯(lián)網(wǎng)設(shè)備是否會(huì)主動(dòng)上傳設(shè)備心跳信息分為兩種類(lèi)型:設(shè)備會(huì)主動(dòng)上傳心跳信息(主動(dòng)類(lèi)型)和設(shè)備不會(huì)上傳心跳信息(被動(dòng)類(lèi)型),對(duì)于兩種類(lèi)型的設(shè)備使用不同的方法進(jìn)行故障檢測(cè)。具體故障檢測(cè)流程如圖2所示。
2.2 數(shù)據(jù)庫(kù)設(shè)計(jì)
本系統(tǒng)使用MySQL關(guān)系型數(shù)據(jù)庫(kù),對(duì)物聯(lián)網(wǎng)設(shè)備的基本信息進(jìn)行持久化存儲(chǔ)和查詢(xún)。根據(jù)功能需求分析,需要?jiǎng)?chuàng)建一個(gè)devices_db設(shè)備數(shù)據(jù)庫(kù),然后在數(shù)據(jù)庫(kù)里面分別創(chuàng)建兩個(gè)數(shù)據(jù)表:用戶(hù)信息表和設(shè)備信息表。
用戶(hù)信息表[5](user,用于登錄系統(tǒng),以及記錄用戶(hù)信息),其中的字段包含用戶(hù)ID(user_id,用戶(hù)ID,主鍵),賬號(hào)(account,后臺(tái)登錄賬號(hào)),密碼(password,加密后的登錄密碼),用戶(hù)名(user_name,用戶(hù)姓名或昵稱(chēng)),手機(jī)號(hào)(phone,用于短信提醒),電子郵箱(email,用于發(fā)送郵件提醒),鹽(salt,用于密碼加密驗(yàn)證)等。
設(shè)備信息表(devices,記錄設(shè)備的基本信息),其中的字段包含設(shè)備ID(device_id,設(shè)備ID,主鍵),設(shè)備UID(設(shè)備自身ID,設(shè)備唯一ID),設(shè)備類(lèi)型(device_type,用于區(qū)分設(shè)備屬于主動(dòng)類(lèi)型還是被動(dòng)類(lèi)型),設(shè)備名稱(chēng)(device_name,設(shè)備的名字),設(shè)備地點(diǎn)(device_address,記錄設(shè)備所在地點(diǎn)),設(shè)備IP(device_ip,設(shè)備的IP地址,用于主動(dòng)請(qǐng)求設(shè)備),設(shè)備狀態(tài)(device_state,用于顯示設(shè)備的在線(xiàn)狀態(tài),在線(xiàn)或離線(xiàn))等。
2.3 主動(dòng)類(lèi)型設(shè)備故障檢測(cè)設(shè)計(jì)
一般的物聯(lián)網(wǎng)設(shè)備都會(huì)有自動(dòng)上傳心跳信息的功能,心跳信息包含對(duì)應(yīng)的設(shè)備信息,如果設(shè)備有正常上傳心跳信息則可以判定設(shè)備目前正常運(yùn)行,心跳信息上傳地址和推送間隔可以在設(shè)備后臺(tái)手動(dòng)設(shè)置,本文將此類(lèi)設(shè)備歸納為主動(dòng)類(lèi)型設(shè)備。圖3是某物聯(lián)網(wǎng)設(shè)備的心跳信息參數(shù)設(shè)置界面。
系統(tǒng)有一個(gè)專(zhuān)門(mén)接收心跳信息的接口,在接收到設(shè)備心跳信息時(shí),將設(shè)備的UID與當(dāng)前系統(tǒng)時(shí)間以鍵值對(duì)的形式存入到Redis緩存中,記錄設(shè)備最近一次的在線(xiàn)時(shí)間。圖4是系統(tǒng)接收設(shè)備心跳信息接口。
系統(tǒng)運(yùn)行后,會(huì)定時(shí)執(zhí)行一個(gè)判斷主動(dòng)類(lèi)型設(shè)備是否在線(xiàn)的任務(wù),本系統(tǒng)設(shè)定為每分鐘執(zhí)行一次,每次執(zhí)行該任務(wù)都會(huì)先查詢(xún)?cè)O(shè)備信息表中所有的主動(dòng)類(lèi)型設(shè)備(根據(jù)device_type字段判斷),并生成對(duì)應(yīng)列表(List),然后系統(tǒng)啟動(dòng)多線(xiàn)程對(duì)列表中的所有設(shè)備進(jìn)行故障檢測(cè)。
具體的檢測(cè)方法是根據(jù)當(dāng)前設(shè)備的UID,并以這個(gè)UID為key去Redis緩存中查詢(xún)當(dāng)前設(shè)備最后一次在線(xiàn)時(shí)間,將當(dāng)前的系統(tǒng)時(shí)間減去設(shè)備最后一次在線(xiàn)時(shí)間,得到時(shí)間差,如果時(shí)間大于心跳上傳閾值(60秒)則判定該設(shè)備發(fā)生故障。
2.4 被動(dòng)類(lèi)型設(shè)備故障檢測(cè)設(shè)計(jì)
與主動(dòng)類(lèi)型設(shè)備相反,不會(huì)上傳心跳信息的設(shè)備則為被動(dòng)類(lèi)型設(shè)備。對(duì)于被動(dòng)類(lèi)型設(shè)備,不能通過(guò)等待設(shè)備主動(dòng)響應(yīng)的方式來(lái)判斷設(shè)備是否發(fā)生故障,因此想要知道設(shè)備是否在線(xiàn),需要系統(tǒng)主動(dòng)去請(qǐng)求設(shè)備,例如主動(dòng)請(qǐng)求設(shè)備信息接口或者Ping設(shè)備IP。因?yàn)椴煌O(shè)備的獲取信息接口格式不一,所以本文采用主動(dòng)Ping設(shè)備IP的方式來(lái)實(shí)現(xiàn)。系統(tǒng)啟動(dòng)后,也會(huì)每分鐘執(zhí)行一次定時(shí)任務(wù),查詢(xún)?cè)O(shè)備信息表中所有被動(dòng)類(lèi)型設(shè)備并生成對(duì)應(yīng)列表。
然后系統(tǒng)將啟用多線(xiàn)程對(duì)列表中的每臺(tái)被動(dòng)類(lèi)型設(shè)備采用Ping設(shè)備IP的方式主動(dòng)發(fā)起請(qǐng)求,如果設(shè)備在3秒內(nèi)沒(méi)有響應(yīng),則重新發(fā)生請(qǐng)求,以防網(wǎng)絡(luò)波動(dòng)引起誤判,如果再次請(qǐng)求設(shè)備還是沒(méi)有響應(yīng)則判定該設(shè)備發(fā)生故障。
2.5 設(shè)備故障反饋設(shè)計(jì)
對(duì)于主動(dòng)類(lèi)型設(shè)備和被動(dòng)類(lèi)型設(shè)備,當(dāng)根據(jù)對(duì)應(yīng)的方法判定設(shè)備發(fā)生故障后,會(huì)先將設(shè)備UID為key,設(shè)備的狀態(tài)為value存入到一個(gè)公有的故障設(shè)備映射(Map)中,此步驟是為了避免某設(shè)備發(fā)生故障后,一直重復(fù)提醒該設(shè)備發(fā)生故障。隨后將此故障設(shè)備信息和當(dāng)前系統(tǒng)時(shí)間存入到MongoDB數(shù)據(jù)庫(kù)以及公有的故障集合(Set)中。
在系統(tǒng)啟動(dòng)后,每分鐘都會(huì)執(zhí)行一個(gè)定時(shí)任務(wù),每次執(zhí)行時(shí)都將判斷故障設(shè)備集合(Set)是否為空,如果不為空,則說(shuō)明有設(shè)備發(fā)生故障,此時(shí)系統(tǒng)將發(fā)送電子郵件到管理人員郵箱中,提醒有設(shè)備發(fā)生故障,盡快處理。發(fā)送電子郵件后,系統(tǒng)將會(huì)清空故障設(shè)備列表,避免重復(fù)發(fā)送郵件通知。
3 系統(tǒng)測(cè)試
該系統(tǒng)的可運(yùn)行在Linux和windows操作系統(tǒng)上,運(yùn)行前必須在本地或者服務(wù)器上安裝配置好JDK1.8及以上的環(huán)境,并且啟動(dòng)MySQL、Redis以及MongoDB數(shù)據(jù)庫(kù)確保連接成功,并且MySQL數(shù)據(jù)庫(kù)中需要?jiǎng)?chuàng)建好device_db數(shù)據(jù)庫(kù),里面應(yīng)包含用戶(hù)信息表(user)和設(shè)備信息表(devices),通過(guò)修改項(xiàng)目的配置文件,填寫(xiě)MySQL、Redis、MongoDB數(shù)據(jù)庫(kù)的連接地址(url)、端口(port)、賬戶(hù)和密碼,本文將數(shù)據(jù)庫(kù)部署在云服務(wù)器上并且在本地啟動(dòng)項(xiàng)目運(yùn)行,成功連接上服務(wù)器的數(shù)據(jù)庫(kù)[6]。
本地測(cè)試連接數(shù)據(jù)庫(kù)成功后,即可使用Maven工具將項(xiàng)目打成jar包,通過(guò)使用XShell、XFtp等工具連接上云服務(wù)器再將jar包上傳到服務(wù)器上并運(yùn)行起來(lái),系統(tǒng)成功啟動(dòng)。
MySQL數(shù)據(jù)庫(kù)中設(shè)備信息表存在部分主動(dòng)類(lèi)型設(shè)備和被動(dòng)類(lèi)型不在線(xiàn),因此系統(tǒng)通過(guò)定時(shí)任務(wù)檢測(cè)到設(shè)備故障,然后發(fā)送電子郵件提醒,設(shè)備故障信息郵件如圖13所示。
4 結(jié)束語(yǔ)
本文設(shè)計(jì)并實(shí)現(xiàn)了基于SpringBoot框架開(kāi)發(fā)的物聯(lián)網(wǎng)設(shè)備故障檢測(cè)系統(tǒng),通過(guò)將物聯(lián)網(wǎng)設(shè)備分成主動(dòng)和被動(dòng)兩種類(lèi)型,分別采用不同的方法進(jìn)行故障判斷。對(duì)于主動(dòng)類(lèi)型設(shè)備,系統(tǒng)根據(jù)定時(shí)任務(wù),將設(shè)備存儲(chǔ)在Redis緩存里的最近一次心跳記錄時(shí)間與當(dāng)前時(shí)間作比較,如果時(shí)間差大于設(shè)定閾值,則判斷設(shè)備發(fā)生故障,反之則設(shè)備正常;對(duì)于被動(dòng)類(lèi)型設(shè)備,系統(tǒng)根據(jù)定時(shí)任務(wù),主動(dòng)請(qǐng)求設(shè)備IP地址,并等待設(shè)備響應(yīng),如果設(shè)備在設(shè)定的閾值時(shí)間內(nèi)沒(méi)有響應(yīng),則判斷設(shè)備發(fā)生故障,如果有響應(yīng)則說(shuō)明設(shè)備正常。對(duì)于故障反饋,也是采用定時(shí)任務(wù)的方式,當(dāng)系統(tǒng)發(fā)現(xiàn)故障列表不為空,則將故障列表里的設(shè)備存儲(chǔ)在MongoDB數(shù)據(jù)庫(kù)中,并及時(shí)將故障設(shè)備信息發(fā)送電子郵件通知到對(duì)應(yīng)的用戶(hù)。
當(dāng)然本系統(tǒng)也存在一定的缺陷,頻繁使用定時(shí)任務(wù)檢測(cè),以及開(kāi)啟多線(xiàn)程去請(qǐng)求多臺(tái)設(shè)備,會(huì)占用一定的系統(tǒng)資源,還有可能造成線(xiàn)程堵塞,影響效率。未來(lái)會(huì)有更多的設(shè)備聯(lián)網(wǎng),對(duì)物聯(lián)網(wǎng)設(shè)備的故障檢測(cè)會(huì)愈發(fā)得到人們重視,也會(huì)有更多的方法對(duì)現(xiàn)有的系統(tǒng)提出改進(jìn),對(duì)高并發(fā)、多線(xiàn)程情景做優(yōu)化處理。
參考文獻(xiàn):
[1] 高小淋.物聯(lián)網(wǎng)設(shè)備通訊故障檢測(cè)技術(shù)與解決方案[J].電腦知識(shí)與技術(shù),2021,17(9):210-212.
[2] 楊開(kāi)振.深入淺出Spring Boot 2.x[M].北京:人民郵電出版社,2018.
[3] 張海藩.軟件工程[M].4版.北京:清華大學(xué)出版社,2003.
[4] 唐漢明.深入淺出MySQL[M].北京:人民郵電出版社,2014.
[5] 桑一梅,陸文怡.學(xué)生管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2020,16(35):62-63,77.
[6] 李宏坤,鄭光勇,謝舞,等.基于spring boot框架的公司考勤系統(tǒng)的研究與設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2019,15(18):55-56.
【通聯(lián)編輯:謝媛媛】
2923500783331