田林青,,余成波,,孔慶達,王艷麗
?。ㄖ貞c理工大學 遠程測試與控制研究所,,重慶市400054)
摘要:互聯(lián)網(wǎng)和移動終端的普及推動著LBS向ILBS發(fā)展,而藍牙與移動終端良好的契合使其成為室內定位技術的首選,。分析了基于藍牙技術的推送系統(tǒng)的原理,,實現(xiàn)了以藍牙節(jié)點、移動終端,、服務器為三大模塊的推送系統(tǒng)。實驗結果表明,,以藍牙4.0設備發(fā)射信號,、BluetoothAdapter掃描搜索、HttpURLConnection傳輸數(shù)據(jù),、JPush推送信息,、Sae云平臺移植組成的室內定位推送系統(tǒng)具有開發(fā)周期短、消息推送實時性強,、穩(wěn)定性好等優(yōu)點,。基于此構建的藍牙技術的推送系統(tǒng)在室內定位方面具有很大的市場價值,。
關鍵詞:藍牙,;ILBS;信息推送
中圖分類號:TP393.0文獻標識碼:ADOI: 10.19358/j.issn.1674 7720.2016.20.017
引用格式:田林青,余成波,,孔慶達,,等. 基于藍牙技術的推送系統(tǒng)的設計和實現(xiàn)[J].微型機與應用,2016,35(20):61 64.
0引言
近幾年,,LBS(基于位置信息服務)技術已經在人們生活中得到廣泛應用,,比如通過GPS來獲得位置信息。然而,,互聯(lián)網(wǎng)和移動終端的普及和發(fā)展,,推動著LBS向ILBS(基于室內位置服務)過渡。一些景點,、商場,、博物館、機場等公共場所需要室內定位來提供精確的位置信息,,而GPS等室外定位技術由于信號在室內衰減快,,不能用于室內定位。室內定位技術主要有藍牙,、ZigBee,、WiFi、射頻識別,、超寬帶等,。由于藍牙和移動終端的良好契合以及藍牙4.0版本推出以來的低功耗、低成本,、高性價比等優(yōu)點,,使得藍牙技術成為移動終端室內定位技術的首選。本文基于藍牙技術,,選取藍牙4.0設備作為信號發(fā)射節(jié),,BluetoothAdapter用來掃描搜索各節(jié)點信息,HttpURLConnection用來傳輸采集到的所需信息,,JPush用來向終端推送消息,,以及最后將本地服務器端程序部署到Sae云平臺,從而完成整個推送系統(tǒng)的設計,。
1推送系統(tǒng)分析
1.1推送系統(tǒng)工作原理
推送系統(tǒng)工作原理圖如圖1所示,。在室內環(huán)境根據(jù)所需部署一定數(shù)量的藍牙節(jié)點AP,攜帶安裝相應APP的移動終端進入定位區(qū)域采集各節(jié)點發(fā)出的信息[1-2],。APP接收各藍牙節(jié)點發(fā)出的設備名和信號強度等信息并將其發(fā)送至服務器端,,服務器端結合室內定位算法訪問離線建立的數(shù)據(jù)庫從而得到終端具體位置。最后通過得到的具體位置調用第三方推送服務器完成消息的推送[3],。系統(tǒng)核心部分包括采集模塊,、傳輸模塊和推送模塊。而訪問數(shù)據(jù)庫和調用第三方推送服務器的操作都集成在服務器中。
1.2硬件選型
推送系統(tǒng)的硬件部分主要是對藍牙發(fā)射節(jié)點的選取,。藍牙4.0是2012年最新藍牙版本,,是藍牙3.0的升級版本,較3.0版本具有更省電,、成本低,、3 ms低延遲、超長有效連接距離,、AES128加密等優(yōu)點,。與4.0以后的版本比較,4.0的優(yōu)勢則在于其成熟的技術已經得到廣泛的應用以及具有更高的性價比,,因此藍牙4.0設備是實驗首選的藍牙發(fā)射節(jié)點,。本系統(tǒng)采用CC2540作為核心芯片,尺寸為41×41×21(mm),,采用電池CR2477(1000 mAh),,采用工作時間能持續(xù)一年以上的iBeacon作為藍牙發(fā)射節(jié)點。其能提供空曠地大于50 m以上的信號接收以及500 ms的廣播頻率和-0 dBm的廣播功率,,滿足系統(tǒng)所需要求,。產品如圖2所示。通過產品表面USB接口旁邊的開關即可打開設備,。
2采集模塊
持有相應APP的移動終端進入藍牙節(jié)點覆蓋區(qū)域,,當用戶打開APP并且根據(jù)用戶名和密碼登錄成功之后便可以進行定位。而定位的觸發(fā)是通過定位按鈕來進行開啟定位的,。這樣APP就會自動接收來自藍牙節(jié)點的信息,,這些信息包括UUID、NAME,、RSSI,、Major、Minor,、MAC等,。而采集模塊要做的就是根據(jù)接收到的多個藍牙節(jié)點數(shù)據(jù),從中獲得所需數(shù)據(jù),,然后將有用的數(shù)據(jù)打包以進行傳輸。通常的做法是利用Android四大組件之一的Broadcast Receiver[4],。先對Receiver進行注冊,,然后再在實例化的Receiver中根據(jù)filter過濾廣播。由于實例化的Receiver是一個條件循環(huán)語句,,因此便能在其內部處理多個節(jié)點發(fā)過來的信息,,從而對有用數(shù)據(jù)進行整理打包。但此方法的弊端在于廣播接收器本身就是一個子線程,而這個子線程持續(xù)的時間不長便會自動結束,,因此不能在其中加入訪問網(wǎng)絡等耗時操作,,否則子線程關閉時會強制結束在其中加入的操作。然而此系統(tǒng)的定位本身就是一個訪問服務器的網(wǎng)絡耗時操作,,還涉及數(shù)據(jù)庫的訪問和消息推送,,因此這種方法并不可取。
針對搜索BLE低功耗藍牙設備,,Android官方提供了一種專門掃描藍牙設備的方法startLeScan,。這種方法通過藍牙適配器BluetoothAdapter啟動,并且需要傳入BluetoothAdapter.LeScanCallback類型參數(shù),,這里將其命令為Scancallback,。而其內部的onLeScan方法實現(xiàn)了核心數(shù)據(jù)的接收和處理。核心代碼如下:
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
int startByte = 2;
boolean patternfound = false;
//尋找iBeacon
while (startByte <= 5) {
if (((int) scanRecord[startByte + 2] & 0xff) == 0x02 &&((int) scanRecord[startByte + 3] & 0xff) == 0x15) {
patternfound = true;
break;
}
startByte++;
}
//如果找到藍牙設備
if (patternfound) {
//此處限于篇幅,,獲得所需的設備名和信號強度值即可
ibeaconName = device.getName();
mrssi = rssi;
}
}
在onLeScan方法內部就能拿到所需的節(jié)點發(fā)送信息,。由于Scancallback是一個循環(huán),設備會不斷地搜索來自附近的藍牙節(jié)點發(fā)出的信息,,并且不會自動關閉此掃描,,因此能夠在此循環(huán)中加入耗時操作,很好地解決了室內定位的耗時問題,。
3傳輸模塊
經過APP搜索得到的藍牙節(jié)點的有用信息要通過聯(lián)網(wǎng)耗時操作傳輸?shù)椒掌鞫?,然后服務器根?jù)搜索到的信息來進行相應處理。Android通過HTTP訪問網(wǎng)絡通常有兩種方式:Apache的HttpClient和Java的HttpURLConnection[5],。前者是Android SDK集成了Apache的模塊,,后者是Java的JDK中自帶的類。盡管HttpClient更加豐富,、高效,,但是考慮到實時定位要多次地訪問服務器,因此這里選擇性能和穩(wěn)定性更好的HttpURLConnection進行訪問傳輸[6],。核心代碼如下:
//定義訪問服務器地址
String request_url="";
//定義傳輸?shù)膮?shù),,即采集模塊中得到的數(shù)據(jù)
String params="";
//拼接
URL url = new URL(request_url + params);
//開啟連接
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
//連接超時時限設置(根據(jù)需要設置)
connection.setConnectTimeout(5*1000);
//POST方式較GET方式更安全
connection.setRequestMethod("POST");
//表示訪問網(wǎng)絡時需要傳入?yún)?shù)
connection.setDoInput(true);
//利用狀態(tài)碼判斷訪問服務器是否成功
if (connection.getResponseCode() == 200) {
//構造方法,傳入?yún)?shù),。從服務器端拿到相應json數(shù)據(jù)
returninputStream2String(connection.getInputStream());
}
4推送模塊
服務器將傳輸來的數(shù)據(jù)結合數(shù)據(jù)庫和室內定位算法進行處理,,得到位置坐標,此處用x和y表示,,然后根據(jù)此坐標進行相應的消息推送,。PUSH(推送)技術相對于PULL(拉取)技術而言,,其獲得信息的實時性和針對性更強,,是一種由服務器主動推送消息的服務機制,。實現(xiàn)推送的方式大致分為四類:C2DM(谷歌提供)、MQTT協(xié)議(非開源),、XMPP協(xié)議,、第三方推送平臺[7]??紤]到資源的可利用性以及第三方平臺的逐漸成熟,、免費、開發(fā)周期短等優(yōu)點,,選擇極光推送JPush作為第三方推送服務器進行消息推送,。利用JPush實現(xiàn)服務器向客戶端推送消息需要部署兩個核心點:Android端和服務器端。而這種部署方式在JPush官方文檔中已經做了大致說明,,現(xiàn)將其總結如下,。
(1)Android端
①導入官網(wǎng)提供的的推送所需jar包和3個so文件,;so文件需在main目錄下新建一個名為jniLibs的文件夾用來存放,,這樣jar包才能通過文件名讀取so文件。
?、谙駻PP的配置文件AndroidManifest.xml中加入推送所需權限,;應用程序包名package應和官方創(chuàng)建應用時的包名一致;配置文件中name="JPUSH_APPKEY"一項的value值應該填入官網(wǎng)創(chuàng)建應用后生成的AppKey,,這樣JPush服務器才會根據(jù)此key值推送消息到嵌入此key值的客戶端,。
③在應用程序根目錄下創(chuàng)建繼承application的類,,在其方法中加入JPushInterface.init(this)語句來初始化JPush的SDK,。
(2)服務器端
①導入相應jar包和3個依賴包,。
?、谠诜掌鞫藢懭胂鄳鄳壿嫛jP鍵在于創(chuàng)建JPushClient對象,,傳入創(chuàng)建應用時產生的參數(shù)AppKey和Master Secret,;再創(chuàng)建PushPayload對象,傳入想傳輸?shù)南essage,;最后通過jpushClient.sendPush(payload)即可以通過服務器向JPush服務器推送消息,,此消息再經過JPush服務器推送到客戶端APP。
5本地服務器搭建測試和云部署
相應邏輯和室內定位算法的實現(xiàn)幾乎全在服務器端,。服務器是收發(fā)消息的中轉站,,訪問數(shù)據(jù)庫并調用JPush推送消息。項目最初是通過搭建本地服務器進行調試,,調試成功之后再將項目代碼部署到云服務器上,。
5.1本地服務器搭建測試
搭建:MyEclipse10.7+MySQL5.6+TomCat7.0構成本地服務器核心環(huán)境;連接數(shù)據(jù)庫時注意數(shù)據(jù)庫的用戶名,、密碼和訪問端口應與安裝MySQL服務器中一致,。
測試:服務器端邏輯采用基本的MVC模式。室內定位算法擬采用基于藍牙4.0的接近度分類室內定位算法進行實現(xiàn)[8-9],。這種非參數(shù)化的室內定位算法需要事先在定位范圍內采集數(shù)據(jù)并放入數(shù)據(jù)庫中,,然后設置好數(shù)據(jù)庫的連接,用TomCat啟動程序即可,。定位范圍擬采用6 m×6 m空間,,在空間內4個角布置4個藍牙節(jié)點,客戶端根據(jù)需要設置固定時間間隔訪問服務器進行定位,。為方便觀察定位結果,,將接收的信號強度值、設備名稱和定位坐標分開調試并輸出到服務器控制臺顯示,。調試結果分別如圖3和圖4所示,。
其中flag作為登錄和定位的標識,而返回的json作為是否訪問成功的標識,,結果為1表示訪問成功,。調試結果表明能夠根據(jù)所搭建環(huán)境和擬采用的算法進行實時定位。
5.2云部署
應用要得到廣泛的應用,,其應用范圍就要不受距離的限制,。將本地服務器代碼部署到云服務器上,讓所有安裝相應APP的用戶能夠通過網(wǎng)絡就能獲得相應服務是必然的選擇[10],。Sae是新浪提供的云服務器,,其在國內云提供商中發(fā)展時間最長,功能相對完善,,文檔全面完整,,且支持PHP、Python,、Java等語言,。
(1)工程文件上傳:將本地寫好的工程文件利用MyEclipse導出war包,,且war包名要和Sae官網(wǎng)創(chuàng)建的應用名稱相同,,這里用bluetooth表示。注意本地JDK版本的匹配,,選1.6最好,。
(2)數(shù)據(jù)庫連接配置:云服務器自帶數(shù)據(jù)庫服務,這和本地MySQL類似,,一樣可以利用JDBC進行訪問,,修改其中的用戶名,、密碼和端口號即可。
//URL中的AppName需要替換成相應的AppName
URL="jdbc:mysql://w.rdc.sae.sina.com.cn:3307/app_AppName";
USERNAME="SaeUserInfo.getAccesskey()";
PASSWORD="SaeUserInfo.getSecretkey()";
AppName="SaeUserInfo.getAppName()";
其中SaeUserInfo類需要到Sae官網(wǎng)去下載,。代碼上傳后,,利用Web端網(wǎng)頁進行用戶名、密碼登錄測試,。當成功訪問云服務器數(shù)據(jù)庫后應該返回json格式的數(shù)據(jù)1,,測試結果如圖5所示。
在URL處輸入所要訪問的鏈接來檢驗代碼是否上傳成功,。通過訪問所傳war包中的登錄模塊,,返回json={“result”:1},結果與圖3,、圖4中的本地服務器測試返回的json一致,,因此代碼上傳成功。
6系統(tǒng)測試與效果分析
設計app,,實現(xiàn)基本的登錄,、注冊功能,并在登錄成功后提供定位推送功能,,通過登錄成功界面的定位按鈕進行定位,。
為了更加清楚地觀察收發(fā)過程核心數(shù)據(jù)的變化,設計一個界面(圖6所示)作為點擊定位按鈕后來實時地顯示藍牙節(jié)點數(shù)據(jù),。圖6中接收的數(shù)據(jù)會傳輸?shù)椒掌鞫?,經過提前寫好的室內定位算法并且訪問數(shù)據(jù)庫從而完成相應的推送(圖7所示)。
推送的結果是源于對定位區(qū)域6 m×6 m的四等分,。經多次定位區(qū)域內隨機測試,,客戶端能根據(jù)終端位置變化實時地接收到推送的消息。
7結論
本文研制了一種基于藍牙4.0技術的推送系統(tǒng),。該系統(tǒng)主要由藍牙節(jié)點,、移動端APP、服務器Server三大部分組成,。并且根據(jù)系統(tǒng)的核心難點對各部分的關鍵模塊做了分析,,其中包括采集模塊、傳輸模塊和推送模塊,。最后將寫好的本地服務器代碼部署到云服務器,,完成了整個系統(tǒng)的設計。經測試,,該推送系統(tǒng)具有良好的穩(wěn)定性和實時性,,能夠依賴于室內定位算法提供較準確的定位,在室內定位應用領域具有巨大的市場價值,。
參考文獻
?。?] 石志京,徐鐵峰,劉太君,,等.基于iBeacon基站的室內定位技術研究[J].移動通信,2012,39(7):88-91.
?。?] RIDA M E,, Liu Fuqiang, JADI Y, et al.Indoor location position based on Bluetooth signal strength[C].2015 2nd International Conference on Information Science and Control Engineering,2015:769-773.
[3] 劉平.Android手機訪問服務器的一種數(shù)據(jù)交互方法[J].通信與網(wǎng)絡,2010,18(9):96-98.
?。?] SMITH D, FRIESEN J. Android recipes:a problemsolution approach (Second Edition)[M].New York: Apress Media,2012.
[5] 馬昭征.基于HTTP的安卓與服務器交互方法的實現(xiàn)[J].無線互聯(lián)科技,2015(3):92-96,114.
?。?] 李寧.Android開發(fā)完全講義[M].北京:中國水利水電出版社,2012.
?。?] 田雷.基于移動終端的旅游信息推送服務系統(tǒng)關鍵技術研究[D].杭州:浙江大學,2010.
[8] 莫倩,熊碩.基于藍牙4.0的接近度分類室內定位算法[J].宇航計測技術,2014,,34(6):66-70.
?。?] LEE S W,KOO B H,,JIN M G,, et al. Rangefree indoor positioning system using smartphone with Bluetooth capability [J]. 2014 IEEE/ION Position, Location and Navigation Symposium, PLANS 2014, 2014:657-662.
?。?0] 張愛玉,周衛(wèi)東,夏吉廣,,等.云平臺搭建的關鍵技術研究[J]. 中國安防,2012(9):88-94.