宮雨欣,戶 國,蒿特祺,王 易,應 悅
(上海工程技術大學 城市軌道交通學院,上海 201620)
國內大部分高校仍然使用教師課堂點名簽到的方式統計學生課堂出勤信息,該模式會占用正常的教學時間,影響正常的教學進度,存在諸多缺陷。
無線通信技術包括超寬頻(Ultra Wie Band, UBW)、ZigBee技術、射頻識別(Radio Frequency Identification, RFID)、無線寬帶(Wi-Fi)、4G通信技術等[1]。眾多分布于不同位置的路由器所發射出的無線信號是構成無線局域網的首要條件,每個無線信號所在的發射裝置都有一個獨立的設備編號(MAC地址),用戶可以使用自己的設備連接這些無線信號,從而登入互聯網。用戶登錄后,用戶的設備便可以通過JS獲取MAC地址,或通過后臺代碼獲取設備的MAC地址。基于此,只要讓手機根據本地IP獲取周邊路由器的MAC地址,在數據庫中搜索與該路由器相匹配的數據,即可實現定位功能。
隸屬于美國的SkyhookWireless公司首次提出了Wi-Fi定位以及相關技術,通過不斷改善,Wi-Fi定位技術日趨成熟,其原理為:根據Wi-Fi熱點具有的位置不變性的性質,不同的Wi-Fi熱點在通電的情況下,就會向周圍空間發射其所產生的信號,并且此信號具有全球唯一性,并將該信號命名為ID—MAC地址,通過偵控一定范圍內的AP(即Wi-Fi熱點)的MAC地址,將該地址傳送到服務器內,服務器可根據已經儲存在數據庫中的MAC地址,運用相關算法,獲得客戶端具體位置。
本文基于MAC地址探測的相關原理開發校園簽到與定位系統,通過獲取校園內不同地點的MAC地址,實現用戶在校園內的打卡與定位的功能。該軟件的前端開發集成工具是Android Studio 3.0版本,后端數據庫是MySQL數據庫,服務器使用的是阿里云,服務器容器使用的是Tomcat。手機應用程序可以高效的實現校園內的精確定位和打卡功能,具有易操作、易實現,實用性強的特點。
系統主要由4個模塊構成:數據通信模塊、Wi-Fi探測模塊、后端校驗模塊和返回數據模塊,軟件的整體架構如圖1所示。首先使用Wi-Fi探測模塊,利用終端設備探測周圍的MAC地址;數據通信模塊會借助網絡將探測到的MAC地址傳輸到后臺服務器,并通過Tomcat容器發送請求;后臺校驗模塊會將在MySQL數據庫中尋找到的相應站點的MAC地址與反饋的MAC地址相比對,校驗結果會通過系統的返回數據模塊,若反饋的結果與后臺數據庫中相應站點的MAC地址存在重疊,顯示打卡成功;若不存在重疊,系統則會顯示使用者打卡不成功。

圖1 基于MAC地址的校園簽到與定位軟件整體架構
軟件開發可分為前端與后端兩個部分。前端的操作系統為Windows 10操作系統,編譯環境為Android Studio 3.0;搭建后端時,可兼容Windows 10系統與Linux系統,利用IntelliJ ideal(2017.03.05)在麥文(Marven)平臺上進行編譯,最大程度地優化了APP功能并提高其運行效率。本項目使用Tomcat作為儲存容器,租借阿里云服務器并使用Navicat Premium作為后端數據庫,通過xUtils網絡請求來完成前端與后端的數據傳輸。
為保證軟件定位和簽到功能的正常運行,要創建數據庫存儲、統計學生的基本信息、校內服務器中相應地點的MAC地址等數據。由于校園范圍過大,軟件開發初期先以特定站點為中心,反復多次探測該范圍內的MAC地址,將所測數據傳入后臺數據庫中[2]。
Android系統開發中有File存儲數據、Shared Preferences存儲數據、Content Provider存儲數據和SQLite數據庫存儲數據4種常見的數據存儲方式。其中,SQLite是一款輕量級數據庫,占用資源低,較于其它數據庫處理速度快,具有獨立性、隔離性、安全性等多種特征,但其并不適用于大數據量的情況[3]。小型的手機應用程序,其定位和簽到功能簡單,僅局限于校園內,數據量較小,師生訪問量不高,且要求讀取速度快,故采用SQLite作為數據庫。關鍵數據結構包括:用戶注冊登錄信息表、用戶簽到信息表、打卡地點MAC地址信息表。其中,用戶注冊登錄信息包含序號、學院、密碼、學生學號、學生姓名,見表1;用戶簽到信息包含序號、創建時間、設備ID、打卡位置、MAC地址、學生學號,見表2;MAC地址信息包含序號、MAC地址、地址名稱、父輩代號、子輩代號,見表3。用Java API編寫數據庫應用程序。

表1 用戶注冊登錄信息表

表2 用戶簽到信息表

表3 打卡地點MAC地址信息表
校園簽到定位系統需要采集校園內不同地點的MAC地址,為降低其它設備(如手機等)對采集的影響,需采用多次測量排異的方法,即在不同時段采集同一地點的數據,確認某一地點的MAC地址時,采取類似“投票表決”的機制,該機制的主要流程如圖2所示。將第一次探測得到的MAC地址匯總成列表A,往后的每一次探測,均先定義一張空列表B,并將探測得到的結果匯總到列表B中,從列表B中不重復地取出一個MAC地址,若該地址未在列表A中,則將該地址添加至列表A中;若該地址已經在列表A中,則該地址可能性加1。如此循環,最后取可能性最大的地址名稱為該地點的MAC地址,將其導入到服務器中。

圖2 “投票表決”機制的流程圖
定位功能使用手機自帶的GPS模塊獲取用戶的實時位置,確定用戶所處的校區并顯示。
Android系統對地理位置的操作進行了封裝,其中 LocationManager 提供了獲取地理位置信息的接口,LocationProvider可以提供各種定位技術,在其中進行指定和設置,讓 LocationManager 利用當前 LocationProvider 來獲得地理位置信息,再依據 Criteria 來設定精度標準。
確定用戶在校園內的準確位置則采取投票機制,依賴于MAC地址信息模塊,取可能性最大的MAC地址名稱上傳至服務器,與數據庫中已存儲的MAC地址進行比對,從而判斷用戶的實時位置,并將結果反饋給手機應用程序。
為了更好的組織手機應用程序的各個模塊,采用分層結構設計,明確每一個層次系統的功能和作用形成一個良好的層次系統,層與層之間是松耦合關系,下層模塊為上層模塊提供服務。
手機應用程序的軟件結構從上到下主要由用戶界面層、用戶功能層、中間件層和操作系統層這4個部分組成,如圖3所示,其中中間件層又分為核心功能層與基礎功能層。

圖3 軟件層次結構圖
在此結構中,下層為上層提供服務接口以供上層調用,但層與層之間隱瞞內部實現,當某一層的實現產生變化時,只要接口不變,就不會影響其它層次的功能實現。層與層之間相互聯系,各層次內的模塊又相互獨立,不同模塊間通過接口調用,盡量滿足高內聚低耦合的原則[4]。
在分層結構的基礎上,將上述各功能模塊獨立的安置在每一層中,如圖4所示。以Android操作系統為例,中間件層的基礎功能層提供網絡通信、數據儲存、第三方應用等基礎服務。核心功能層提供數據訪問、數據比對、MAC地址偵測、消息推送和定位服務。用戶功能層依賴核心功能層所提供的服務來實現用戶所需要的功能。

圖4 模塊功能
本文為手機應用程序設計了非常豐富的功能,不僅能精確完成日常定位打卡的操作,為日常教學增添了許多的便利之處。
本文設計了一款基于MAC地址的校園簽到與定位系統。采集并確認校園內不同地點的MAC地址數據,并將這些數據錄入到后臺數據庫中;使用時系統將先采集和確認用戶所在地點的MAC地址,并將這一地址傳輸到后臺數據庫進行比對,從而實現在校園內的精準定位。測試表明該系統操作便捷,準確度高、靈活度高、可延展性強,能實現學生在校園內的精準定位和打卡功能,并能幫助教師統計學生的出勤信息。