莊 富,張藝帆,林果園,3
(1.中國礦業(yè)大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,江蘇 徐州 221116;2.礦山數(shù)字化教育部工程研究中心,江蘇 徐州 221116;3.南京大學(xué)軟件新技術(shù)國家重點實驗室,江蘇 南京 210093)
社區(qū)治理是國家治理體系中的基礎(chǔ)性工程,是國家治理體系中的關(guān)鍵一環(huán)[1]。近年來,國家提出“推進國家治理體系和治理能力現(xiàn)代化”的戰(zhàn)略任務(wù),這給社區(qū)治理提出了挑戰(zhàn)。社區(qū)治理能力的高低關(guān)乎人民群眾的生活水平與質(zhì)量,關(guān)乎百姓的歸屬感和幸福感。
突如其來的新冠肺炎疫情席卷全球,全國上下投入到了疫情防控工作中,這無疑對社區(qū)治理能力是一次重大考驗?;ヂ?lián)網(wǎng)的出現(xiàn)已經(jīng)徹徹底底改變了人們的日常生活。利用互聯(lián)網(wǎng),人們讓生活變得更加美好。為此,根據(jù)社區(qū)治理的實際需求開發(fā)出適用于基層社區(qū)的“社區(qū)巡檢系統(tǒng)”,將傳統(tǒng)的社區(qū)安全巡邏結(jié)合互聯(lián)網(wǎng),實現(xiàn)突發(fā)事件信息的在線共享。不僅提高了突發(fā)事件信息的傳播速度,還能最大程度給相關(guān)管理部門在采取措施時提供更多的選擇,這一系統(tǒng)的應(yīng)用具有深遠的意義。
基于Android的社區(qū)巡檢系統(tǒng)由基于Android的手機APP、服務(wù)端和后臺管理系統(tǒng)三部分組成(如圖1所示)。Android手機APP負責(zé)社區(qū)治安數(shù)據(jù)、基礎(chǔ)設(shè)施數(shù)據(jù)、消防安全數(shù)據(jù)、環(huán)境保護數(shù)據(jù)、文物保護數(shù)據(jù)和文化生活數(shù)據(jù)等的收集并實現(xiàn)對社區(qū)各類突發(fā)事件信息的巡查上報。服務(wù)端負責(zé)對APP傳輸來的數(shù)據(jù)進行封裝,并對數(shù)據(jù)進行處理。后臺管理系統(tǒng)則對系統(tǒng)進行權(quán)限、巡檢人員和巡檢人員上報的巡檢信息等方面的管理。
圖1 系統(tǒng)整體架構(gòu)
系統(tǒng)采用C/S和B/S相結(jié)合的方式[2],服務(wù)端與APP之間采用C/S模式,巡檢人員可以使用手機APP上傳和查看突發(fā)事件信息。服務(wù)端與后臺管理系統(tǒng)之間采用B/S模式,把服務(wù)端封裝的數(shù)據(jù)顯示在管理系統(tǒng)中。
基于Android的社區(qū)巡檢系統(tǒng)APP以Android Studio作為開發(fā)平臺。Android Studio是谷歌推出的Android集成開發(fā)工具,相比Eclipse ADT開發(fā)環(huán)境,具有響應(yīng)速度快、UI更漂亮,強大的UI編輯功能的優(yōu)點[3]。APP與服務(wù)端通信采用http協(xié)議,使用Android網(wǎng)絡(luò)框架OkHttp[4]完成http協(xié)議的相關(guān)操作。OkHttp是目前安卓開發(fā)中最火熱的輕量級框架,由于共享Socket,減少了對服務(wù)器的請求次數(shù),通過連接池,減少請求延遲,提高請求的效率。
使用OkHttp進行網(wǎng)絡(luò)請求的步驟分為以下四點[5]:(1)創(chuàng)建一個OkHttpClient實例;(2)創(chuàng)建一個Request實例。創(chuàng)建Request實例時,用戶可以根據(jù)需要發(fā)起Post請求或者Get請求。Post或者Get請求是HTTP協(xié)議中向后臺服務(wù)器發(fā)送數(shù)據(jù)的一種機制,是HTTP協(xié)議的一個組成部分;(3)使用OkHttpClient創(chuàng)建一個Call并執(zhí)行,獲取一個Response對象。可以根據(jù)同步或者異步需求,分別采用execute()方法或者enqueue()方法,實現(xiàn)不同的訪問策略;(4)對Response進行相關(guān)操作。通過以上四個步驟,一個應(yīng)用可以完成各種情況下的網(wǎng)絡(luò)訪問。
服務(wù)端采用IntelliJ IDEA集成開發(fā)環(huán)境和SSM[6](Spring+SpringMVC+MyBatis)框架集,數(shù)據(jù)庫采用MySQL數(shù)據(jù)庫系統(tǒng)。IntelliJ IDEA在智能代碼助手、代碼自動提示、重構(gòu)、J2EE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、創(chuàng)新的GUI設(shè)計等方面被公認為是最好的java開發(fā)工具[7]。
Spring就像是整個項目中裝配bean的大工廠,在配置文件中可以指定使用特定的參數(shù)去調(diào)用實體類的構(gòu)造方法來實例化對象。SpringMVC在項目中攔截用戶請求,它的核心Servlet即Dispatcher Servlet承擔(dān)中介或是前臺這樣的職責(zé),將用戶請求通過Handler Mapping去匹配Controller,Controller就是具體對應(yīng)請求所執(zhí)行的操作。MyBatis是對JDBC的封裝,通過配置文件關(guān)聯(lián)到各實體類的Mapper文件,Mapper文件中配置了每個類對數(shù)據(jù)庫所需進行的SQL語句映射。在每次與數(shù)據(jù)庫交互時,通過SQLSessionFactory拿到一個SQLSession,再執(zhí)行SQL命令[5]。
基于Android的社區(qū)巡檢系統(tǒng)APP由地圖瀏覽、巡檢上報、GPS、查看中心和設(shè)置中心五個模塊組成,每個模塊下有對應(yīng)的若干子模塊(如圖2所示)。
圖2 社區(qū)巡檢系統(tǒng)APP的基本功能
地圖瀏覽模塊包括地圖操作和圖層控制兩個子模塊。地圖操作是指對首頁用戶地圖進行平移和縮放;圖層控制是指對地圖進行顯隱控制。巡檢上報模塊包括表單采集、圖片采集、視頻采集和數(shù)據(jù)上報四個子模塊。表單采集包括對事件類型信息的采集和事件描述信息的采集。事件類型預(yù)先定義了50種,由用戶通過點擊下拉列表進行選擇。
事件描述由用戶在文本框中手動添加,內(nèi)容不超過100個漢字;圖片采集和視頻采集均可以通過攝像頭進行新增也可以通過訪問本地相冊進行選擇,圖片數(shù)量不超過5張,視頻數(shù)量為1個,視頻大小不超過200 M,時長不超過1分鐘;數(shù)據(jù)上報分為成功和失敗兩種情況,成功情況下事件的類型、描述和內(nèi)容等信息會上傳至服務(wù)器端,而失敗情況下事件的信息會暫存到本地,待網(wǎng)絡(luò)恢復(fù)后重新進行上傳。GPS模塊包括實時定位和巡檢軌跡上報兩個子模塊。實時定位是指將巡檢人員當(dāng)前所在位置實時顯示在用戶地圖中并每隔一定時間間隔刷新一次,該時間間隔由用戶自己設(shè)置,默認值為30 s;巡檢軌跡上報是指每隔一定時間間隔記錄下巡檢人員實時位置并上傳服務(wù)器端,由后臺管理系統(tǒng)畫出巡檢軌跡[8-11]。查看中心模塊包括查看列表、查看詳情和刪除事件三個子模塊。查看列表包括查看事件的時間、類型和經(jīng)緯度等信息;查看詳情包括查看事件的時間、類型、描述、經(jīng)緯度和圖片視頻等信息;刪除事件執(zhí)行的是將已保存到本地的事件信息進行刪除的操作。
設(shè)置中心包括設(shè)置用戶昵稱、設(shè)置服務(wù)器IP地址、設(shè)置定位時間間隔和設(shè)置照片質(zhì)量四個子模塊。設(shè)置用戶昵稱是巡檢人員在系統(tǒng)中修改自己昵稱的功能,昵稱不作為巡檢人員身份的標識,巡檢人員可以多次修改自己的昵稱;正確連入服務(wù)器是成功上傳事件的前提,用戶首先要確保手機與服務(wù)器處在同一局域網(wǎng)下,然后再設(shè)置服務(wù)器IP地址;設(shè)置定位時間間隔是對巡檢人員進行實時定位以及巡檢軌跡上報的關(guān)鍵,時間間隔由巡檢人員自己設(shè)置,單位為“秒/s”,默認值為30 s;設(shè)置照片質(zhì)量設(shè)置的是巡檢人員在拍攝事件圖片時圖片的質(zhì)量,質(zhì)量分為高、中、低三個等級,默認值為高。
為了保證服務(wù)端與APP端的正常連接,使得服務(wù)端能夠及時知道APP端何時掉線,該系統(tǒng)設(shè)計使用了Socket心跳周期檢測機制(如圖3所示)。
圖3 Socket心跳周期檢測機制
首先在服務(wù)端建立定時器并設(shè)置定時器的時間為60秒,定時發(fā)送心跳包給到APP端:timer=new Timer();Beat beat=new Beat(clients);timer. Schedule (beat, 1 000*60,beat.Interval);APP端收到心跳包后,立即發(fā)送心跳包給服務(wù)端,服務(wù)端收到APP端發(fā)來的心跳包后確認APP端的連接可用,不執(zhí)行釋放socket相關(guān)的操作。當(dāng)服務(wù)端接收到APP端發(fā)送來的數(shù)據(jù)時,心跳丟失計數(shù)清零:beatMissNum=0;如果服務(wù)端沒在規(guī)定的時間間隔即60秒內(nèi)收到APP端響應(yīng)的心跳包,服務(wù)端就認為APP端的連接不可用,執(zhí)行釋放socket相關(guān)的操作:Server Thread st=clients. Get(i); St.Close()。Socket心跳周期檢測機制使得服務(wù)端能夠準確地掌握APP端是否在線,保證了服務(wù)端和APP端的可靠連接。
為了更好地描述事件的內(nèi)容信息,該系統(tǒng)支持巡檢人員上傳視頻。視頻可以通過使用攝像頭重新拍攝也可以訪問本地相冊進行選擇。視頻時長為1分鐘,大小不超過200 M。
首先在APP端創(chuàng)建視頻上傳類VideoUpload-Activity,在該類中預(yù)先定義視頻路徑private String path="",然后通過方法:.isCamera(true)判斷是否點擊了拍照按鈕,如果點擊了直接開始重新拍攝,如果沒有點擊則通過PictureMimeType.ofVideo()方法訪問本地相冊中的視頻并過濾掉圖片和音頻文件。選擇本地視頻的時候要通過if (file.Length()>200*1 024*1 024) {"文件大于200 M";break;語句來進行視頻文件大小的校驗。視頻選擇完成后,通過VideoView.start()方法可以播放視頻。
然后在服務(wù)端創(chuàng)建接口類uploadVideo,在接口類中通過file.isEmpty()判斷文件是否為空,分別使用String fileName=file.getOriginalFilename(); String suffixName=fileName. Substring (fileName.lastIndexOf("."));String filePath="E:\study"來獲取文件名、文件后綴名和設(shè)置文件存儲路徑。視頻會在服務(wù)端以命名規(guī)則:SimpleDateFormat date Format=new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss”)重新命名。服務(wù)端會檢測是否存在該視頻目錄:if (! dest. getParentFile().exists())。如果目錄已存在,則通過dest. GetParentFile (). mkdirs ()新建文件夾。最后使用file.transferTo(dest)將視頻文件保存到服務(wù)端。
事件的內(nèi)容包括圖片和視頻兩類信息,圖片和視頻均可以通過攝像頭重新拍攝或者訪問本地相冊進行選擇。圖片數(shù)量至多為5張,視頻數(shù)量至多為1個。巡檢人員根據(jù)實際需要進行上傳。在APP端新建事件添加類AddEvent,在該類中定義方法addContent用來添加事件的內(nèi)容信息。使用.open Gallery(PictureMimeType.ofAll())訪問本地相冊中的圖片和視頻信息。當(dāng)選擇的是圖片信息時會使用語句:if (pathList.size() == 6) {Toast.makeText(AddEvent. This, "5張", Toast.LENGTH_SHORT).show();return;}來校驗圖片的數(shù)量。通過方法:. isCamera(true)判斷是否點擊了拍照按鈕。圖片和視頻添加完畢后,視頻顯示的是縮略圖樣式,內(nèi)容保存的是視頻路徑,然后循環(huán)上傳:if (pathList.size()>1) {for (int i=0; i 斷點續(xù)傳技術(shù)[12-14]指的是在下載或上傳時,將下載或上傳任務(wù)(一個文件或一個壓縮包)人為地劃分為幾個部分,每一個部分采用一個線程進行上傳或下載,如果遇到網(wǎng)絡(luò)故障,可以從已經(jīng)上傳或下載的部分開始繼續(xù)上傳下載未完成的部分,而不必從頭開始上傳下載。從而達到節(jié)省時間,提高速度的效果。 本系統(tǒng)使用OkHttp網(wǎng)絡(luò)框架實現(xiàn)斷點續(xù)傳技術(shù)。在APP端創(chuàng)建進度下載Progress Downloader類,通過構(gòu)造方法client=getProgressClient()實現(xiàn)在下載、暫停后的繼續(xù)下載中復(fù)用同一個client對象。通過RandomAccessFile randomAccessFile=null方法來隨機訪問文件,指定斷點續(xù)傳的起始位置。創(chuàng)建進度響應(yīng)ProgressResponseBody類來設(shè)置對外訪問的進度監(jiān)聽。創(chuàng)建斷點續(xù)傳BreakpointContinuinglyActivity類,在該類中使用breakPoints=totalBytes來存儲totalBytes即斷點位置,并用方法progressBar.setMax((int)(ContentLength/1024))記錄文件的總長度。ContentLength表示斷點續(xù)傳后剩余部分的長度。通過進度下載類Progress Downloader的復(fù)用client對象、進度響應(yīng)類ProgressResponseBody的進度監(jiān)聽、BreakpointContinuinglyActivity類的記錄斷點位置和progressBar.setMax方法記錄文件總長度,可以很好地實現(xiàn)傳輸過程中的斷點續(xù)傳功能。 APP首頁會實時顯示巡檢員用戶當(dāng)前所在位置(如圖4所示),并根據(jù)用戶的設(shè)定,每隔一定時間間隔刷新一次(默認時間間隔為30秒)。巡檢員用戶點擊首頁中的“添加事件”按鈕來進行事件的上傳。添加事件時需要選擇對應(yīng)的“事件類型”、添加相應(yīng)的“事件描述”和以拍照或錄像的方式添加“事件內(nèi)容”(如圖5所示)。 圖4 APP顯示巡檢員用戶當(dāng)前位置 圖5 巡檢員用戶在APP中添加事件 事件添加完畢后,巡檢員用戶點擊“發(fā)送事件”按鈕。在APP端和服務(wù)器端正常連接的條件下,事件信息將會上傳至服務(wù)器端并交由后臺管理系統(tǒng)處理。后臺管理系統(tǒng)在收到APP端巡檢員用戶上傳的事件信息后,會在地圖上顯示該用戶所在位置以及事件的信息。 事件信息包括用戶姓名、手機號、具體時間、GPS坐標位置以及事件的圖片或視頻。 后臺管理系統(tǒng)管理員根據(jù)事件處理權(quán)限將APP端巡檢員用戶上傳的事件交由相關(guān)部門處理。相關(guān)部門在收到待交辦事件信息后會在規(guī)定時間內(nèi)做出反饋。APP端巡檢員用戶可以在APP端查看已經(jīng)上傳服務(wù)器并保存到本地的事件信息,并通過點擊事件來查看事件的詳情信息。詳情信息中包括了事件的記錄人、記錄人手機號、發(fā)生時間、發(fā)生地點、事件類型、事件內(nèi)容、事件的圖片或視頻以及事件的交辦反饋進度。 后臺管理系統(tǒng)管理員可以實時查看當(dāng)前正在巡檢的人員數(shù)量和位置。對于每個巡檢員用戶,后臺管理員還可以查看其巡檢軌跡并回演該巡檢用戶在一段時間內(nèi)的巡檢軌跡。通過APP端事件信息的上傳、服務(wù)器端事件信息的接收和后臺管理系統(tǒng)對事件信息的處理并將處理結(jié)果反饋給APP端巡檢員用戶,社區(qū)的突發(fā)事件將形成閉環(huán)管理,從而提高社區(qū)管理工作的質(zhì)量和效率。 后臺管理系統(tǒng)管理員可以對任意時間段的巡檢人員巡檢路線以及發(fā)生的事件進行備份,同時可以導(dǎo)入備份文件,進行還原。 數(shù)據(jù)庫備份時間段的起止時間由后臺管理系統(tǒng)管理員根據(jù)需要選填,當(dāng)數(shù)據(jù)庫完成備份后,對應(yīng)時間段的數(shù)據(jù)也將會被刪除。 新冠肺炎疫情的防控經(jīng)驗告訴我們,信息是基層治理的基礎(chǔ),社區(qū)信息治理體系重構(gòu)要以社區(qū)為重,樹立數(shù)據(jù)服務(wù)生活、技術(shù)服務(wù)群眾、安全服務(wù)發(fā)展的信息治理理念,取之于社區(qū)、用之于社區(qū),通過社區(qū)內(nèi)各個治理主體的協(xié)同參與和全環(huán)節(jié)的流程再造,構(gòu)建基層社會治理體系中的信息治理共同體[15]。基于Android的社區(qū)巡檢系統(tǒng)的設(shè)計與實現(xiàn),進一步促進了社區(qū)信息治理體系的建設(shè)與發(fā)展。 通過巡檢系統(tǒng)對社區(qū)的各項數(shù)據(jù)進行收集,實現(xiàn)社區(qū)的全面監(jiān)測,大大降低了手工記錄的工作量,提高了工作效率。該系統(tǒng)目前已成功應(yīng)用于江蘇省徐州市銅山區(qū)漢王鎮(zhèn)的社區(qū)管理工作,取得了不錯的效果,并且應(yīng)用會越來越廣泛。3.4 傳輸過程中的斷點續(xù)傳
4 APP的實用效果
4.1 事件信息的上傳
4.2 事件信息的管理
4.3 巡檢信息的管理
4.4 數(shù)據(jù)的備份和恢復(fù)
5 結(jié)束語