• <big id="r05a9"><nobr id="r05a9"><big id="r05a9"></big></nobr></big>
      1. 嘉興專(zhuān)業(yè)的AI軟件外包與定制開(kāi)發(fā)、手機APP及小程序開(kāi)發(fā)服務(wù)公司
        聯(lián)系電話(huà): 13396739763 (微信同)
        探索最新AI技術(shù)與深度解決方案 | 獲取專(zhuān)業(yè)軟件開(kāi)發(fā)的經(jīng)驗智慧

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

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

        ?

        運用Beacon進(jìn)行博物館導覽

        ?

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

        ?

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

        ?

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

        ?

        綁定服務(wù),設定區域

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

        ?

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

        ?

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

        ?

        測定距離,更新范圍

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

        ?

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

        ?

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

        ?

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

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

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

        ?

        掃描配置又是什么?

        ? ? ? ?BeaconManager類(lèi)允許開(kāi)發(fā)者對APP進(jìn)行廣告數據包掃描時(shí)長(cháng)、活動(dòng)間歇時(shí)長(cháng)等參數進(jìn)行配置??梢栽诔跏即a中添加如下的代碼。

        ??

        圖4 – 掃描配置

        ?

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

        ?

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

        ?

        ? ? ? ?還需要考慮Beacon的廣播頻率。如果掃描頻率高于Beacon廣告,有時(shí)就會(huì )由于最近一次掃描活動(dòng)中的廣播數據包丟失而導致實(shí)際范圍內的Beacon沒(méi)有出現在A(yíng)PI回調的報告中。

        ?

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

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

        ?

        模糊的Beacon追蹤

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

        ?

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

        ?

        5 – GyboApplication.java中的Beacon緩存設置和使用

        ?

        6 –BeaconEvent類(lèi)別

        ?

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

        ?

        最后的最后,提醒用戶(hù)!

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

        ?

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

        ?

        圖8 –Beacon Information類(lèi)別

        ??

        圖9 –ThingOfInterest類(lèi)別

        ?

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

        ?

        圖10 – 安卓系統通知,提示附近發(fā)現Beacon

        ?

        下圖是安卓通知的代碼。

        ??

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

        ?

        partners
        partners
        partners
        partners
        partners
        partners
        partners
        partners
        三级国产国语三级在线蔓延|欧美人与动人物牲交|欧美A级毛欧美1级A大片免费播|国产无套乱子伦精彩|91香蕉高清国产线观看免费
      2. <big id="r05a9"><nobr id="r05a9"><big id="r05a9"></big></nobr></big>