曾森烽,楊楓,王艷乾,邱樹偉
(韓山師范學院計算機與信息工程學院,潮州 521041)
基于WiFi指紋的室內定位技術是當前室內定位的主流技術,該技術在智慧樓宇建設中有著極其重要的作用。對智慧樓宇中的WiFi設備進行定位是實現各項基于位置的服務的重要基礎。
當前,基于WiFi的室內定位技術已有較為成熟的研究與開發案例。潘有順等[1]設計了基于WiFi室內定位的樓宇智能照明控制系統,該系統通過無線信號測距技術對人員進行定位,同時向照明設備分發開啟/關閉等控制指令,實現對照明設備的智能控制。朱正偉等[2]針對WiFi信號強度容易受室內環境變化以及多徑效應的影響這一問題,采用網格法劃分定位區域,用奇異譜分析方法消除采集數據中的波動和干擾。同時,采用高斯過程回歸算法構建指紋數據庫,提高了定位精度。祝文飛等[3]指出,全球定位系統和蜂窩網絡系統無法滿足高精度的室內定位需求。為解決這一問題,該文提出基于位置指紋的WiFi定位技術,通過引入與AP信號強弱相關的目標函數,提高了定位精度。為提高出行效率,陳婷婷等[4]開發基于WiFi定位的地鐵到站提醒系統。該系統通過App實時監測地鐵Wi Fi信號的MAC地址,實現地鐵定位和到站提醒服務。為提高地下停車位的利用率,陳曉玉等[5]基于WiFi位置指紋設計了一套地下停車場車輛定位系統。通過與App相結合,該系統能夠準確定位車輛位置,方便用戶及時查看停車場空位信息,提高了地下車位的利用率。此外,為分析室內大型活動人群的移動軌跡,徐洋等[6]提出了一種基于混合三邊測量和RSSI(re?ceived signal strength indication,RSSI)的 定 位方法,該方法可實現人員定位、人流量分析和人群劃分等功能,為大型室內場館的管理人員提供決策支持。
上述技術方案主要以“服務端+移動App”架構為主,尚缺乏對小程序的支持。為了彌補這一空白,本文設計了基于Spring Boot和小程序的Wi Fi室內定位系統。本系統前端采用微信小程序進行開發,服務端采用Spring Boot+MyBatis+Spring MVC進行開發。基于本系統,用戶可通過微信小程序采集周圍WiFi信號的強度并將其傳輸給服務端,服務端實時地將用戶的位置計算出來,并將位置信息發送到前端進行渲染和顯示。本系統的開發和應用有助于提高WiFi室內定位服務的便捷性。
系統的總體框架采用分層設計,主要包括運行環境、數據庫、數據層、業務層、表示層以及微信小程序。上述前四層運行于服務端,后兩層運行于前端。系統的總體框架如圖1所示。

圖1 系統的總體框架
系統工作流程主要包含兩個階段。
(1)建立WiFi指紋庫。在定位功能實現之前,需要先建立目標區域中所選定的參考點的WiFi指紋庫,為后續位置估算奠定基礎。
(2)實時定位。用戶在目標區域中的某個地點實時獲取各WiFi信號的RSSI并將這些RSSI數據傳輸到服務端。服務端通過與指紋數據庫交互并調用定位算法(見1.2節)計算出用戶當前的位置,然后將位置信息傳送到前端進行渲染和顯示。
本系統的核心是實現定位功能。定位功能位于本系統的業務層,該層包括用戶管理、WiFi指紋庫建設、位置計算以及誤差統計,具體內容如下:
(1)用戶管理。包括用戶注冊以及用戶授權登錄。
(2)Wi Fi指紋庫建設。在目標區域中,先選取一些預定的參考點,然后對每個參考點所在的位置進行多次WiFi信號采集,再對這些信號進行處理(如取平均值、取中位數或取眾數等),最后將處理后的信號存入WiFi指紋數據庫。
以(xi,yi)表示第i個參考點所在的位置,以R S Sij表示在位置i所獲得的第j個Wi Fi的信號強度信息,i=1,2,…,m;j=1,2,…,n。則所獲得的指紋數據庫可以表示為如下m×(n+1)矩陣:

其中,第1列表示m個參考點的位置坐標,第2至n+1列表示m個參考點所對應的n個WiFi的信號強度值。建立好WiFi指紋庫之后,后續將以其為依據計算用戶的實時位置。
(3)位置計算。系統采用KNN(K-Nearest Neighbor)進行位置計算,具體算法如下。
1)定位算法:KNN
2)算法輸入:當前位置的Wi Fi信號強度向量R=(R1,R2,…,Rn)。
3)算法輸出:當前位置的坐標(a,b)。
①計算各參考點與當前位置的WiFi信號強度的距離,計算公式為:

②根據d i(i=1,2,…,m)的值進行升序排序,并選取前K個值所對應的參考點坐標。
③計算所選取的K個參考點的權值ω,計算公式為:

該權值反映了不同距離對位置估算結果的貢獻度,即貢獻大的距離其權值較大,而貢獻小的距離其權值較小。
④估算當前位置(a,b),計算公式為:

其中,(xi,yi)為從指紋庫中所選取的K個參考點之一,i=1,2,…,K。
(4)誤差統計。誤差為實際坐標(x,y)和所估算的坐標(a,b)之間的距離,于是,兩者之間的誤差為:

系統服務端采用Spring Boot+MyBatis+Spring MVC框架進行開發。開發工具采用IDEA 2019.3.3,編程語言為Java,運行環境為JDK 1.8。系統由config、controller、dao、model、service以及resources共六個包組成,這些包所包含的子包、類、資源文件和配套文件及其作用見表1。

表1 服務端程序結構
如前所述,用戶可通過微信小程序進入本系統主頁面并進行注冊和登錄。用戶登錄成功之后,可以進行如下3種操作:建立WiFi指紋庫、實時定位和誤差統計。小程序的實現主要采用微信開發者工具,編程語言采用HTML、CSS和JavaScript。同時,采用微信小程序所提供的API進行開發,主要API見表2。

表2 微信小程序API
此外,小程序端的核心JS文件為culWifi.js和wifi.js,其中,culWifi.js文件主要實現了計算WiFi信號強度的平均值、中位數、眾數的函數;wifi.js文件實現了獲取WiFi列表的函數。
系統的實驗環境位于本單位的工程中心,該中心已有WiFi接入點一個,其周邊存在10個以上WiFi接入點,這些接入點的位置未知。實驗過程中小程序從這些Wi Fi接入點采集RSSI數據作為指紋數據庫,并利用指紋數據庫進行實時定位。實驗環境的布局如圖2所示。

圖2 實驗環境平面圖和參考點示意圖
4.2.1 建立WiFi指紋庫
首先,在工程中心選取20個參考點,相鄰參考點之間相距1 m。所選取的參考點如圖2所示。然后,由實驗人員在各個參考點所在位置采集Wi Fi信號強度。分兩輪進行,在第一輪中,每個參考點采集信號的次數為5次,在第二輪則采集20次,采集間隔為0.5 s。接著,對所采集到的WiFi信號強度進行計算。系統采用三種計算方法,分別為:取平均值、取中位數和取眾數。最后,將計算結果發送到服務端進行存儲。建立指紋庫的界面如圖3所示。

圖3 建立指紋庫界面
4.2.2 實時定位
(1)由實驗人員在目標區域中任意選取一個點,再通過小程序采集該點所接收到的WiFi信號強度。與建立指紋庫的過程類似,定位實驗也是分兩輪進行,第一輪和第二輪分別采集5次和20次。
(2)對所采集到的WiFi信號分別取平均值、取中位數和取眾數。
(3)將計算結果發送到服務端與WiFi指紋數據庫進行匹配和估算。所采用的定位算法為KNN,且K的取值為3。在得到實時坐標值之后,該坐標值會自動返回到小程序界面并顯示所定位的位置。定位界面如圖4所示(紅點為實際位置,黑色點為服務端返回的位置)。

圖4 定位界面
4.2.3 誤差分析
服務端得到定位坐標之后,計算與實際坐標之間的距離,即可得到定位誤差。為了更客觀地反映定位誤差,本文分別對“取平均值”“取中位數”和“取眾數”等多種WiFi信號強度值處理方法進行了誤差分析,同時,對不同數據采集次數(如5次和20次)也進行了定位和誤差分析。
本文對所設計的定位系統進行多方面的測試,主要從RSSI值的計算方法和RSSI采集次數兩方面進行實驗,每一種實驗的次數為10次,在得到每次實驗的誤差之后,取誤差的平均值作為平均誤差。實驗結果見表3。

表3 實驗結果
由表3的實驗數據可知,定位方法1的平均誤差最低,為277.304 cm,而定位方法3的平均誤差最高,為500.31 cm。定位方法1和3的可視化效果如圖5和圖6所示(五角星表示實際坐標,圓形表示定位坐標,圖中僅顯示5個實驗點)。

圖5 定位方法1的可視化效果

圖6 定位方法3的可視化效果
值得說明的是,在實驗過程中,誤差相對較大的點主要集中于障礙物(如桌子、墻體等)的位置附近,而在相對比較空曠的位置則誤差較小。
目前,已有的WiFi室內定位系統主要以“服務端+App”架構為主,對小程序的支持不足。針對這一問題,本文設計和實現基于Spring Boot和小程序的WiFi室內定位系統,該系統前端采用了微信開發者工具進行開發,服務端采用Spring Boot+MyBatis+Spring MVC集成框架進行開發。系統采用KNN定位算法,定位過程中WiFi的RSSI處理方法分別采用“取平均數”“取中值”和“取眾數”等。實驗結果表明,系統的平均定位誤差介于277.304 cm~500.31 cm之間,可滿足大型室內場館定位服務的需求。本系統在保證較高定位精度的同時,極大地提高了用戶享受WiFi室內定位服務的便捷性。