《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 業(yè)界動態(tài) > 手把手教你如何開發(fā)AltBeacon安卓APP

手把手教你如何開發(fā)AltBeacon安卓APP

2015-08-03
作者:Martin Woolley

       第一篇文章我介紹了Beacon的一些基礎(chǔ)知識,以及AltBeacon和它的藍(lán)牙廣告形式,。今天將用一個(gè)實(shí)際的開發(fā)案例,,指導(dǎo)讀者學(xué)習(xí)如何用AltBeacon安卓API開發(fā)Beacon原型APP

運(yùn)用Beacon進(jìn)行博物館導(dǎo)覽

       將Beacon應(yīng)用于博物館導(dǎo)覽,,這樣當(dāng)游客靠近展品時(shí),APP可以提示該展品的相關(guān)信息,,走過路過就再也不會錯(cuò)過!想象一下,,如果故宮有了這款A(yù)PP, 當(dāng)游客走到一個(gè)不明覺厲的青銅方樽面前,,只要拿起手機(jī)就能快速了解它的主人,、出土信息和花紋的寓意,再也不用擔(dān)心被人嘲笑沒文化了,。

       這個(gè)設(shè)計(jì)的設(shè)想是:首先,博物館內(nèi)安裝的所有的Beacon基站都在APP能夠探測到的范圍內(nèi),,而且APP能夠默默地在后臺運(yùn)行并探測附近的Beacon,,但只有當(dāng)游客與Beacon基站的距離靠近至2米范圍內(nèi)時(shí)才會跳出彈窗,,提示與這一Beacon相關(guān)的展品信息;其次,,針對同一展品,,APP不會不識趣地反復(fù)跳出提示窗,;最后,還能夠查閱APP系統(tǒng)日志底層Beacon相關(guān)事件,。下面請看實(shí)地操作,!

       如果你也是第一次創(chuàng)建Beacon應(yīng)用APP,,看這里!

綁定服務(wù),,設(shè)定“區(qū)域”

       對于首次建立應(yīng)用程序類別的開發(fā)者,以下幾點(diǎn)需要注意:首先,,用AltBeacon API BeaconManager將APP與后臺運(yùn)行的AltBeacon庫中的服務(wù)綁定,。另外,要著手設(shè)定一個(gè)或多個(gè)“區(qū)域”,。這里所說的“區(qū)域”是指一個(gè)或一組Beacon,由AltBeacon Beacon ID 域值來規(guī)定,。Beacon ID域?qū)?0個(gè)八位字節(jié)的標(biāo)識域分成1個(gè)16字節(jié)的主ID,、1個(gè)2字節(jié)的二級ID,、1個(gè)2字節(jié)的三級ID,。在我的這個(gè)APP中,,主Beacon是我所關(guān)注的,因此只設(shè)定了主ID,,因此我將二級和三級ID設(shè)為空值,。

圖片2.png

                                  圖1 – 基本初始化步驟

      更多干貨往下看,!

APP程序類別

      針對不同的顯示界面(包括主要展品信息界面、Beacon事件日志界面)的活動類別,、以及其他一些輔助性的Java類別,這個(gè)APP包括一個(gè)自定義應(yīng)用程序類和一個(gè)Actiivity類別,。AltBeacon API自身就是一個(gè)庫,,它負(fù)責(zé)APP后臺運(yùn)行彈出,并提供一系列接口來支持與Beacon探測相關(guān)的回調(diào)函數(shù),。這些都通過自定義應(yīng)用程序類“GyboApplication.java”執(zhí)行,。

圖片3.png

                                 圖2 – AltBeacon API 關(guān)鍵接口

測定距離,更新范圍

        AltBeacon API支持“監(jiān)測”與“測距”功能,。監(jiān)測功能會在APP進(jìn)入某一個(gè)或某一組Beacon區(qū)域時(shí)生成事件,。這其實(shí)是一個(gè)二進(jìn)制的概念,,因?yàn)橹挥袃煞N可能——APP在區(qū)域內(nèi),、APP不在區(qū)域內(nèi)。測距功能可以追蹤游客距離某一組Beacon的距離,,當(dāng)兩者近到一定程度時(shí),,就可以觸發(fā)功能。

       我們還必須對應(yīng)用程序類別執(zhí)行的RangeNotifier接口中的單實(shí)例對象方法“didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region)”進(jìn)行編碼,。AltBeacon庫的后臺藍(lán)牙掃描進(jìn)程能夠發(fā)現(xiàn)附近的Beacon,,而“didRangeBeaconsInRegion”每秒鐘調(diào)用一次,并提供當(dāng)次掃描到的Beacon列表。APP絕大多數(shù)功能都在此基礎(chǔ)上實(shí)現(xiàn),。

       Beacon分類則代表物理意義上的Beacon, 它有著一系列屬性,,包括:Beacon類型標(biāo)示、藍(lán)牙MAC地址和名稱,、接收信號強(qiáng)度指示器RSSI(Received Signal Strength Indicator),、(制造過程中設(shè)定的)校準(zhǔn)傳輸?shù)腂eacon發(fā)射功率、與Beacon相對距離的估算值(以米為單位計(jì)量,、通過RSSI和Beacon發(fā)射功率計(jì)算得出),。

定義最近的Beacon,判斷信息推送時(shí)間

       有了Beacon列表以及每個(gè)Beacon與游客的距離估算值,,要推算出哪個(gè)Beacon離游客最近應(yīng)該是不成問題的,。但是在測試過程中也有一些問題。有的Beacon明知道就在范圍內(nèi),,卻沒有出現(xiàn)在didRangeBeaconsInRegion方法獲取的Beacon列表中,,到底哪里出了問題?經(jīng)分析,,原因可能是Beacon廣播頻率與安卓APP掃描的頻率和持續(xù)時(shí)間不匹配,,導(dǎo)致有時(shí)掃描過程無法接收到實(shí)際范圍內(nèi)所有Beacon的廣告數(shù)據(jù)包。這就引出了另一個(gè)問題:如何控制安卓APP里的這些參數(shù),?

       當(dāng)APP收到范圍更新時(shí),,就要判斷是否需要執(zhí)行相應(yīng)的功能。具體來說,,就是看哪個(gè)Beacon離游客最近,、有沒有近到需要向游客提示Beacon所對應(yīng)的展品信息。如果最近的Beacon發(fā)生了變化,,游客會收到提示信息,。例如,游客離開剛剛駐足的展品,,下一次范圍更新之后,,離他最近的Beacon可能就不是之前那一個(gè)(組)了。當(dāng)然,,還要判斷距離最近的Beacon是近到什么程度,,才能向游客發(fā)送通知信息。實(shí)驗(yàn)中的APP把這一數(shù)值設(shè)定為2米,。當(dāng)然你也可以允許用戶手動設(shè)置,、自定義這一類配置。

掃描配置又是什么,?

       BeaconManager類允許開發(fā)者對APP進(jìn)行廣告數(shù)據(jù)包掃描時(shí)長,、活動間歇時(shí)長等參數(shù)進(jìn)行配置,。可以在初始代碼中添加如下的代碼,。

圖片4.png

                                  圖4 – 掃描配置

       想要做好適合APP的掃描配置,,需要考慮很多方面。掃描過程的電量消耗是很大的,,因此掃描頻次過高或時(shí)長過長就會增加電池電量的消耗,。但如果掃描頻次跟不上,Beacon探測結(jié)果的更新就會延遲,,進(jìn)而影響用戶體驗(yàn),。

       因此,根據(jù)實(shí)際應(yīng)用場景的需要,,我們必須在耗電水平和用戶體驗(yàn)之間進(jìn)行權(quán)衡取舍,。例如,一個(gè)用來探測路途中經(jīng)過的店鋪的APP,,就需要比博物館導(dǎo)覽APP擁有更快的Beacon廣告探測和反應(yīng)速度,。

       還需要考慮Beacon的廣播頻率。如果掃描頻率高于Beacon廣告,,有時(shí)就會由于最近一次掃描活動中的廣播數(shù)據(jù)包丟失而導(dǎo)致實(shí)際范圍內(nèi)的Beacon沒有出現(xiàn)在API回調(diào)的報(bào)告中,。

現(xiàn)實(shí)世界中的Beacon探測

       不得不承認(rèn),現(xiàn)實(shí)世界總是不完美的,。為了讓APP能夠更好的為人民服務(wù),,程序猿編寫代碼時(shí)也不得不考慮現(xiàn)實(shí)中的問題種種。在測試過程中,,盡管我們很認(rèn)真地設(shè)置了掃描配置,,Beacon掃描偶爾還是會有漏網(wǎng)之魚。現(xiàn)實(shí)中,,由于游客和Beacon之間的物理屏障(如人群,、其他物品等)、或Beacon配置與之前設(shè)想的不同,,也會出現(xiàn)一些紕漏,。物理屏障的存在會導(dǎo)致游客在展廳內(nèi)行走時(shí),APP數(shù)據(jù)回報(bào)出現(xiàn)短暫的異常,。因此,,Beacon應(yīng)用不應(yīng)當(dāng)僅根據(jù)最近一次的數(shù)據(jù)回報(bào)就立刻作出回應(yīng)。認(rèn)識到這一點(diǎn)讓我們收獲頗多:與其中規(guī)中矩地根據(jù)AltBeacon庫回調(diào)的數(shù)據(jù)行事,,不如對算法進(jìn)行適度的“模糊”處理,,也許能改善Beacon APP的表現(xiàn)。為了改善算法,,我們決定采用更復(fù)雜一些的方法來追蹤范圍內(nèi)的Beacon,。

模糊的Beacon追蹤

       我們的方法簡單而有效——保留了最近15秒的報(bào)告中提示位于范圍內(nèi)的Beacon的相關(guān)數(shù)據(jù)緩存,以及每個(gè)Beacon最近一次被探測到的精確時(shí)間,。通過計(jì)時(shí)器任務(wù),,把最近15秒內(nèi)沒有被探測到的Beacon視為“過期”、移除緩存,。

       在可以稱得上“重中之重”的didRangeBeaconsInRegion方法中,我們更新了Beacon數(shù)據(jù)緩存和回調(diào)的Beacon對象列表,,然后評估全部的緩存數(shù)據(jù),以判定目前距離最近的Beacon,。于是測試的結(jié)果有了改善,。這類似于數(shù)據(jù)平滑處理,相關(guān)代碼片段如下圖,。

圖片5.png

                       圖5 – GyboApplication.java中的Beacon緩存設(shè)置和使用

圖片6.png

                                圖6 –BeaconEvent類別

圖片7.png

                        圖7 –負(fù)責(zé)終止BeaconEvent對象的計(jì)時(shí)器任務(wù)

最后的最后,,提醒用戶!

       一旦實(shí)際執(zhí)行了獲取范圍內(nèi)Beacon報(bào)告的代碼,、采取了某種方式追蹤Beacon,、并根據(jù)獲得的數(shù)據(jù)判斷哪一個(gè)Beacon離游客最近,那么就只剩最后一步了:在合適的情況下提示游客Beacon所關(guān)聯(lián)的展品信息,。怎樣判斷是否“合適”呢,?主要看最后一次生成的通知是否為同一Beacon相關(guān)的,因?yàn)闆]有必要反復(fù)提示用戶同一個(gè)展品的信息,。還需要將估算的Beacon距離與既設(shè)的(觸發(fā)行為的)最小距離值進(jìn)行對比,,判斷游客是否足夠靠近Beacon(也就是展品),然后決定是否發(fā)送展品信息,。

       如果APP是在前臺運(yùn)行,,提示游客的方法就很簡單:更新主要展覽信息頁面、顯示最近的展品介紹,。我們使用內(nèi)存中有關(guān)Beacon及其對應(yīng)展品的數(shù)據(jù)結(jié)構(gòu),,每個(gè)Beacon都有自己的ID,就可以分別對應(yīng)各自的展品信息,,并在APP本地映射了這些數(shù)據(jù)的對應(yīng)關(guān)系,,但正如第一篇中所講到的,對于除了原型以外的任何APP,,最好從遠(yuǎn)程服務(wù)器上獲取相關(guān)數(shù)據(jù),,根據(jù)位置或其他信息配置Beacon。

圖片8.png

                           圖8 –Beacon Information類別

圖片9.png

                             圖9 –ThingOfInterest類別

       通知列表下拉菜單中的通知,,并將其鏈接到定義展品信息頁面的Activity,。

 

圖片10.png

                            圖10 – 安卓系統(tǒng)通知,提示附近發(fā)現(xiàn)Beacon

       下圖是安卓通知的代碼,。

圖片11.png

                                  圖11 – 創(chuàng)建通知


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請及時(shí)通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。