田林青,余成波,孔慶達(dá),王艷麗
(重慶理工大學(xué) 遠(yuǎn)程測(cè)試與控制研究所,重慶市400054)
?
基于藍(lán)牙技術(shù)的推送系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)*
田林青,余成波,孔慶達(dá),王艷麗
(重慶理工大學(xué) 遠(yuǎn)程測(cè)試與控制研究所,重慶市400054)
互聯(lián)網(wǎng)和移動(dòng)終端的普及推動(dòng)著LBS向ILBS發(fā)展,而藍(lán)牙與移動(dòng)終端良好的契合使其成為室內(nèi)定位技術(shù)的首選。分析了基于藍(lán)牙技術(shù)的推送系統(tǒng)的原理,實(shí)現(xiàn)了以藍(lán)牙節(jié)點(diǎn)、移動(dòng)終端、服務(wù)器為三大模塊的推送系統(tǒng)。實(shí)驗(yàn)結(jié)果表明,以藍(lán)牙4.0設(shè)備發(fā)射信號(hào)、BluetoothAdapter掃描搜索、HttpURLConnection傳輸數(shù)據(jù)、JPush推送信息、Sae云平臺(tái)移植組成的室內(nèi)定位推送系統(tǒng)具有開發(fā)周期短、消息推送實(shí)時(shí)性強(qiáng)、穩(wěn)定性好等優(yōu)點(diǎn)?;诖藰?gòu)建的藍(lán)牙技術(shù)的推送系統(tǒng)在室內(nèi)定位方面具有很大的市場(chǎng)價(jià)值。
藍(lán)牙;ILBS;信息推送
近幾年,LBS(基于位置信息服務(wù))技術(shù)已經(jīng)在人們生活中得到廣泛應(yīng)用,比如通過GPS來獲得位置信息。然而,互聯(lián)網(wǎng)和移動(dòng)終端的普及和發(fā)展,推動(dòng)著LBS向ILBS(基于室內(nèi)位置服務(wù))過渡。一些景點(diǎn)、商場(chǎng)、博物館、機(jī)場(chǎng)等公共場(chǎng)所需要室內(nèi)定位來提供精確的位置信息,而GPS等室外定位技術(shù)由于信號(hào)在室內(nèi)衰減快,不能用于室內(nèi)定位。室內(nèi)定位技術(shù)主要有藍(lán)牙、ZigBee、WiFi、射頻識(shí)別、超寬帶等。由于藍(lán)牙和移動(dòng)終端的良好契合以及藍(lán)牙4.0版本推出以來的低功耗、低成本、高性價(jià)比等優(yōu)點(diǎn),使得藍(lán)牙技術(shù)成為移動(dòng)終端室內(nèi)定位技術(shù)的首選。本文基于藍(lán)牙技術(shù),選取藍(lán)牙4.0設(shè)備作為信號(hào)發(fā)射節(jié),BluetoothAdapter用來掃描搜索各節(jié)點(diǎn)信息,HttpURLConnection用來傳輸采集到的所需信息,JPush用來向終端推送消息,以及最后將本地服務(wù)器端程序部署到Sae云平臺(tái),從而完成整個(gè)推送系統(tǒng)的設(shè)計(jì)。
1.1 推送系統(tǒng)工作原理
推送系統(tǒng)工作原理圖如圖1所示。在室內(nèi)環(huán)境根據(jù)所需部署一定數(shù)量的藍(lán)牙節(jié)點(diǎn)AP,攜帶安裝相應(yīng)APP的移動(dòng)終端進(jìn)入定位區(qū)域采集各節(jié)點(diǎn)發(fā)出的信息[1-2]。APP接收各藍(lán)牙節(jié)點(diǎn)發(fā)出的設(shè)備名和信號(hào)強(qiáng)度等信息并將其發(fā)送至服務(wù)器端,服務(wù)器端結(jié)合室內(nèi)定位算法訪問離線建立的數(shù)據(jù)庫(kù)從而得到終端具體位置。最后通過得到的具體位置調(diào)用第三方推送服務(wù)器完成消息的推送[3]。系統(tǒng)核心部分包括采集模塊、傳輸模塊和推送模塊。而訪問數(shù)據(jù)庫(kù)和調(diào)用第三方推送服務(wù)器的操作都集成在服務(wù)器中。
圖1 推送系統(tǒng)工作原理圖
1.2 硬件選型
推送系統(tǒng)的硬件部分主要是對(duì)藍(lán)牙發(fā)射節(jié)點(diǎn)的選取。藍(lán)牙4.0是2012年最新藍(lán)牙版本,是藍(lán)牙3.0的升級(jí)版本,較3.0版本具有更省電、成本低、3 ms低延遲、超長(zhǎng)有效連接距離、AES-128加密等優(yōu)點(diǎn)。與4.0以后的版本比較,4.0的優(yōu)勢(shì)則在于其成熟的技術(shù)已經(jīng)得到廣泛的應(yīng)用以及具有更高的性價(jià)比,因此藍(lán)牙4.0設(shè)備是實(shí)驗(yàn)首選的藍(lán)牙發(fā)射節(jié)點(diǎn)。本系統(tǒng)采用CC2540作為核心芯片,尺寸為41×41×21(mm),采用電池CR2477(1000 mAh),采用工作時(shí)間能持續(xù)一年以上的iBeacon作為藍(lán)牙發(fā)射節(jié)點(diǎn)。其能提供空曠地大于50 m以上的信號(hào)接收以及500 ms的廣播頻率和-0 dBm的廣播功率,滿足系統(tǒng)所需要求。產(chǎn)品如圖2所示。通過產(chǎn)品表面USB接口旁邊的開關(guān)即可打開設(shè)備。
圖2 藍(lán)牙節(jié)點(diǎn)
持有相應(yīng)APP的移動(dòng)終端進(jìn)入藍(lán)牙節(jié)點(diǎn)覆蓋區(qū)域,當(dāng)用戶打開APP并且根據(jù)用戶名和密碼登錄成功之后便可以進(jìn)行定位。而定位的觸發(fā)是通過定位按鈕來進(jìn)行開啟定位的。這樣APP就會(huì)自動(dòng)接收來自藍(lán)牙節(jié)點(diǎn)的信息,這些信息包括UUID、NAME、RSSI、Major、Minor、MAC等。而采集模塊要做的就是根據(jù)接收到的多個(gè)藍(lán)牙節(jié)點(diǎn)數(shù)據(jù),從中獲得所需數(shù)據(jù),然后將有用的數(shù)據(jù)打包以進(jìn)行傳輸。通常的做法是利用Android四大組件之一的Broadcast Receiver[4]。先對(duì)Receiver進(jìn)行注冊(cè),然后再在實(shí)例化的Receiver中根據(jù)filter過濾廣播。由于實(shí)例化的Receiver是一個(gè)條件循環(huán)語句,因此便能在其內(nèi)部處理多個(gè)節(jié)點(diǎn)發(fā)過來的信息,從而對(duì)有用數(shù)據(jù)進(jìn)行整理打包。但此方法的弊端在于廣播接收器本身就是一個(gè)子線程,而這個(gè)子線程持續(xù)的時(shí)間不長(zhǎng)便會(huì)自動(dòng)結(jié)束,因此不能在其中加入訪問網(wǎng)絡(luò)等耗時(shí)操作,否則子線程關(guān)閉時(shí)會(huì)強(qiáng)制結(jié)束在其中加入的操作。然而此系統(tǒng)的定位本身就是一個(gè)訪問服務(wù)器的網(wǎng)絡(luò)耗時(shí)操作,還涉及數(shù)據(jù)庫(kù)的訪問和消息推送,因此這種方法并不可取。
針對(duì)搜索BLE低功耗藍(lán)牙設(shè)備,Android官方提供了一種專門掃描藍(lán)牙設(shè)備的方法startLeScan。這種方法通過藍(lán)牙適配器BluetoothAdapter啟動(dòng),并且需要傳入BluetoothAdapter.LeScanCallback類型參數(shù),這里將其命令為Scancallback。而其內(nèi)部的onLeScan方法實(shí)現(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++;
}
//如果找到藍(lán)牙設(shè)備
if (patternfound) {
//此處限于篇幅,獲得所需的設(shè)備名和信號(hào)強(qiáng)度值即可
ibeaconName = device.getName();
mrssi = rssi;
}
}
在onLeScan方法內(nèi)部就能拿到所需的節(jié)點(diǎn)發(fā)送信息。由于Scancallback是一個(gè)循環(huán),設(shè)備會(huì)不斷地搜索來自附近的藍(lán)牙節(jié)點(diǎn)發(fā)出的信息,并且不會(huì)自動(dòng)關(guān)閉此掃描,因此能夠在此循環(huán)中加入耗時(shí)操作,很好地解決了室內(nèi)定位的耗時(shí)問題。
經(jīng)過APP搜索得到的藍(lán)牙節(jié)點(diǎn)的有用信息要通過聯(lián)網(wǎng)耗時(shí)操作傳輸?shù)椒?wù)器端,然后服務(wù)器根據(jù)搜索到的信息來進(jìn)行相應(yīng)處理。Android通過HTTP訪問網(wǎng)絡(luò)通常有兩種方式:Apache的HttpClient和Java的HttpURLConnection[5]。前者是Android SDK集成了Apache的模塊,后者是Java的JDK中自帶的類。盡管HttpClient更加豐富、高效,但是考慮到實(shí)時(shí)定位要多次地訪問服務(wù)器,因此這里選擇性能和穩(wěn)定性更好的HttpURLConnection進(jìn)行訪問傳輸[6]。核心代碼如下:
//定義訪問服務(wù)器地址
String request_url="";
//定義傳輸?shù)膮?shù),即采集模塊中得到的數(shù)據(jù)
String params="";
//拼接
URL url = new URL(request_url + params);
//開啟連接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//連接超時(shí)時(shí)限設(shè)置(根據(jù)需要設(shè)置)
connection.setConnectTimeout(5*1000);
//POST方式較GET方式更安全
connection.setRequestMethod("POST");
//表示訪問網(wǎng)絡(luò)時(shí)需要傳入?yún)?shù)
connection.setDoInput(true);
//利用狀態(tài)碼判斷訪問服務(wù)器是否成功
if (connection.getResponseCode() == 200) {
//構(gòu)造方法,傳入?yún)?shù)。從服務(wù)器端拿到相應(yīng)json數(shù)據(jù)
return inputStream2String(connection.getInputStream());
}
服務(wù)器將傳輸來的數(shù)據(jù)結(jié)合數(shù)據(jù)庫(kù)和室內(nèi)定位算法進(jìn)行處理,得到位置坐標(biāo),此處用x和y表示,然后根據(jù)此坐標(biāo)進(jìn)行相應(yīng)的消息推送。PUSH(推送)技術(shù)相對(duì)于PULL(拉取)技術(shù)而言,其獲得信息的實(shí)時(shí)性和針對(duì)性更強(qiáng),是一種由服務(wù)器主動(dòng)推送消息的服務(wù)機(jī)制。實(shí)現(xiàn)推送的方式大致分為四類:C2DM(谷歌提供)、MQTT協(xié)議(非開源)、XMPP協(xié)議、第三方推送平臺(tái)[7]。考慮到資源的可利用性以及第三方平臺(tái)的逐漸成熟、免費(fèi)、開發(fā)周期短等優(yōu)點(diǎn),選擇極光推送JPush作為第三方推送服務(wù)器進(jìn)行消息推送。利用JPush實(shí)現(xiàn)服務(wù)器向客戶端推送消息需要部署兩個(gè)核心點(diǎn):Android端和服務(wù)器端。而這種部署方式在JPush官方文檔中已經(jīng)做了大致說明,現(xiàn)將其總結(jié)如下。
(1)Android端
①導(dǎo)入官網(wǎng)提供的的推送所需jar包和3個(gè)so文件;so文件需在main目錄下新建一個(gè)名為jniLibs的文件夾用來存放,這樣jar包才能通過文件名讀取so文件。
②向APP的配置文件AndroidManifest.xml中加入推送所需權(quán)限;應(yīng)用程序包名package應(yīng)和官方創(chuàng)建應(yīng)用時(shí)的包名一致;配置文件中name="JPUSH_APPKEY"一項(xiàng)的value值應(yīng)該填入官網(wǎng)創(chuàng)建應(yīng)用后生成的AppKey,這樣JPush服務(wù)器才會(huì)根據(jù)此key值推送消息到嵌入此key值的客戶端。
③在應(yīng)用程序根目錄下創(chuàng)建繼承application的類,在其方法中加入JPushInterface.init(this)語句來初始化JPush的SDK。
(2)服務(wù)器端
①導(dǎo)入相應(yīng)jar包和3個(gè)依賴包。
②在服務(wù)器端寫入相應(yīng)相應(yīng)邏輯。關(guān)鍵在于創(chuàng)建JPushClient對(duì)象,傳入創(chuàng)建應(yīng)用時(shí)產(chǎn)生的參數(shù)AppKey和Master Secret;再創(chuàng)建PushPayload對(duì)象,傳入想傳輸?shù)南essage;最后通過jpushClient.sendPush(payload)即可以通過服務(wù)器向JPush服務(wù)器推送消息,此消息再經(jīng)過JPush服務(wù)器推送到客戶端APP。
相應(yīng)邏輯和室內(nèi)定位算法的實(shí)現(xiàn)幾乎全在服務(wù)器端。服務(wù)器是收發(fā)消息的中轉(zhuǎn)站,訪問數(shù)據(jù)庫(kù)并調(diào)用JPush推送消息。項(xiàng)目最初是通過搭建本地服務(wù)器進(jìn)行調(diào)試,調(diào)試成功之后再將項(xiàng)目代碼部署到云服務(wù)器上。
5.1 本地服務(wù)器搭建測(cè)試
搭建:MyEclipse10.7+MySQL5.6+TomCat7.0構(gòu)成本地服務(wù)器核心環(huán)境;連接數(shù)據(jù)庫(kù)時(shí)注意數(shù)據(jù)庫(kù)的用戶名、密碼和訪問端口應(yīng)與安裝MySQL服務(wù)器中一致。
測(cè)試:服務(wù)器端邏輯采用基本的MVC模式。室內(nèi)定位算法擬采用基于藍(lán)牙4.0的接近度分類室內(nèi)定位算法進(jìn)行實(shí)現(xiàn)[8-9]。這種非參數(shù)化的室內(nèi)定位算法需要事先在定位范圍內(nèi)采集數(shù)據(jù)并放入數(shù)據(jù)庫(kù)中,然后設(shè)置好數(shù)據(jù)庫(kù)的連接,用TomCat啟動(dòng)程序即可。定位范圍擬采用6 m×6 m空間,在空間內(nèi)4個(gè)角布置4個(gè)藍(lán)牙節(jié)點(diǎn),客戶端根據(jù)需要設(shè)置固定時(shí)間間隔訪問服務(wù)器進(jìn)行定位。為方便觀察定位結(jié)果,將接收的信號(hào)強(qiáng)度值、設(shè)備名稱和定位坐標(biāo)分開調(diào)試并輸出到服務(wù)器控制臺(tái)顯示。調(diào)試結(jié)果分別如圖3和圖4所示。
圖3 調(diào)試1
圖4 調(diào)試2
其中flag作為登錄和定位的標(biāo)識(shí),而返回的json作為是否訪問成功的標(biāo)識(shí),結(jié)果為1表示訪問成功。調(diào)試結(jié)果表明能夠根據(jù)所搭建環(huán)境和擬采用的算法進(jìn)行實(shí)時(shí)定位。
5.2 云部署
應(yīng)用要得到廣泛的應(yīng)用,其應(yīng)用范圍就要不受距離的限制。將本地服務(wù)器代碼部署到云服務(wù)器上,讓所有安裝相應(yīng)APP的用戶能夠通過網(wǎng)絡(luò)就能獲得相應(yīng)服務(wù)是必然的選擇[10]。Sae是新浪提供的云服務(wù)器,其在國(guó)內(nèi)云提供商中發(fā)展時(shí)間最長(zhǎng),功能相對(duì)完善,文檔全面完整,且支持PHP、Python、Java等語言。
(1)工程文件上傳:將本地寫好的工程文件利用MyEclipse導(dǎo)出war包,且war包名要和Sae官網(wǎng)創(chuàng)建的應(yīng)用名稱相同,這里用bluetooth表示。注意本地JDK版本的匹配,選1.6最好。
(2)數(shù)據(jù)庫(kù)連接配置:云服務(wù)器自帶數(shù)據(jù)庫(kù)服務(wù),這和本地MySQL類似,一樣可以利用JDBC進(jìn)行訪問,修改其中的用戶名、密碼和端口號(hào)即可。
//URL中的AppName需要替換成相應(yīng)的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)頁進(jìn)行用戶名、密碼登錄測(cè)試。當(dāng)成功訪問云服務(wù)器數(shù)據(jù)庫(kù)后應(yīng)該返回json格式的數(shù)據(jù)1,測(cè)試結(jié)果如圖5所示。
圖5 云部署測(cè)試
在URL處輸入所要訪問的鏈接來檢驗(yàn)代碼是否上傳成功。通過訪問所傳war包中的登錄模塊,返回json={“result”:1},結(jié)果與圖3、圖4中的本地服務(wù)器測(cè)試返回的json一致,因此代碼上傳成功。
設(shè)計(jì)app,實(shí)現(xiàn)基本的登錄、注冊(cè)功能,并在登錄成功后提供定位推送功能,通過登錄成功界面的定位按鈕進(jìn)行定位。
為了更加清楚地觀察收發(fā)過程核心數(shù)據(jù)的變化,設(shè)計(jì)一個(gè)界面(圖6所示)作為點(diǎn)擊定位按鈕后來實(shí)時(shí)地顯示藍(lán)牙節(jié)點(diǎn)數(shù)據(jù)。圖6中接收的數(shù)據(jù)會(huì)傳輸?shù)椒?wù)器端,經(jīng)過提前寫好的室內(nèi)定位算法并且訪問數(shù)據(jù)庫(kù)從而完成相應(yīng)的推送(圖7所示)。
圖6 顯示界面
圖7 推送界面
推送的結(jié)果是源于對(duì)定位區(qū)域6 m×6 m的四等分。經(jīng)多次定位區(qū)域內(nèi)隨機(jī)測(cè)試,客戶端能根據(jù)終端位置變化實(shí)時(shí)地接收到推送的消息。
本文研制了一種基于藍(lán)牙4.0技術(shù)的推送系統(tǒng)。該系統(tǒng)主要由藍(lán)牙節(jié)點(diǎn)、移動(dòng)端APP、服務(wù)器Server三大部分組成。并且根據(jù)系統(tǒng)的核心難點(diǎn)對(duì)各部分的關(guān)鍵模塊做了分析,其中包括采集模塊、傳輸模塊和推送模塊。最后將寫好的本地服務(wù)器代碼部署到云服務(wù)器,完成了整個(gè)系統(tǒng)的設(shè)計(jì)。經(jīng)測(cè)試,該推送系統(tǒng)具有良好的穩(wěn)定性和實(shí)時(shí)性,能夠依賴于室內(nèi)定位算法提供較準(zhǔn)確的定位,在室內(nèi)定位應(yīng)用領(lǐng)域具有巨大的市場(chǎng)價(jià)值。
[1] 石志京,徐鐵峰,劉太君,等.基于iBeacon基站的室內(nèi)定位技術(shù)研究[J].移動(dòng)通信,2012,39(7):88-91.
[2] 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手機(jī)訪問服務(wù)器的一種數(shù)據(jù)交互方法[J].通信與網(wǎng)絡(luò),2010,18(9):96-98.
[4] SMITH D, FRIESEN J. Android recipes:a problem-solution approach (Second Edition)[M].New York: Apress Media,2012.
[5] 馬昭征.基于HTTP的安卓與服務(wù)器交互方法的實(shí)現(xiàn)[J].無線互聯(lián)科技,2015(3):92-96,114.
[6] 李寧.Android開發(fā)完全講義[M].北京:中國(guó)水利水電出版社,2012.
[7] 田雷.基于移動(dòng)終端的旅游信息推送服務(wù)系統(tǒng)關(guān)鍵技術(shù)研究[D].杭州:浙江大學(xué),2010.
[8] 莫倩,熊碩.基于藍(lán)牙4.0的接近度分類室內(nèi)定位算法[J].宇航計(jì)測(cè)技術(shù),2014,34(6):66-70.
[9] LEE S W, KOO B H, JIN M G, et al. Range-free indoor positioning system using smartphone with Bluetooth capability [J]. 2014 IEEE/ION Position, Location and Navigation Symposium, PLANS 2014, 2014:657-662.
[10] 張愛玉,周衛(wèi)東,夏吉廣,等.云平臺(tái)搭建的關(guān)鍵技術(shù)研究[J]. 中國(guó)安防,2012(9):88-94.
Design and implementation of push system based on Bluetooth technology
Tian Linqing,Yu Chengbo,Kong Qingda,Wang Yanli
(Institute of Remote Test and Control, Chongqing University of Technology, Chongqing 400054, China)
The popularity of the Internet and mobile terminal promotes the development of LBS to ILBS. A good combination with mobile terminal makes it the first choice of indoor positioning technology for Bluetooth. This paper analyses principle of push system based on Bluetooth technology, and realises the push system consisting of Bluetooth node, mobile terminal and server. The experimental results shows that indoor positioning push system consisting of lanching signal with Bluetooth 4.0 equipment,scanning signal with BluetoothAdapter, transmiting data with HttpURLConnection,pushing message with JPush and deploying on Sae Cloud platforms has the advantages of short development cycle,high real-time of pushing message,good stability and so on.Push system based on this design pattern has great market value in indoor positioning.
Bluetooth; ILBS; information push
國(guó)家自然科學(xué)基金資助項(xiàng)目(61402063);重慶市科技人才培養(yǎng)計(jì)劃(新產(chǎn)品研發(fā)團(tuán)隊(duì))資助項(xiàng)目(CSJC2013KJRC-TDJS40012);重慶市高校優(yōu)秀成果轉(zhuǎn)化資助項(xiàng)目(KJZH14213)
TP393.0
A
10.19358/j.issn.1674- 7720.2016.20.017
田林青,余成波,孔慶達(dá),等. 基于藍(lán)牙技術(shù)的推送系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2016,35(20):61-64.
2016-06-21)
田林青(1991-),男,碩士研究生,主要研究方向:基于藍(lán)牙低功耗的室內(nèi)定位技術(shù)、無線傳感網(wǎng)絡(luò)。
余成波(1965-),通信作者,男,博士,教授,主要研究方向:遠(yuǎn)程測(cè)試與控制技術(shù)、信號(hào)與信息處理。E-mail:yuchengbo@cqut.edu.cn。
網(wǎng)絡(luò)安全與數(shù)據(jù)管理2016年20期