當前位置:首頁 » 安卓系統 » androidibeacon

androidibeacon

發布時間: 2023-08-31 02:16:16

A. android 藍牙室內定位 ibeacon 關於RSSI演算法

可以通過高斯權重法來對最終的位置進行加權計算。同時你也可以考慮採用濾波來進行修正。

B. android藍牙BLE(三) —— 廣播

​ 在藍牙開發中,有些情況是不需要連接的,只要外設廣播自己的數據即可,例如蘋果的 ibeacon 。自 Android 5.0 更新藍牙API後,手機可以作為外設廣播數據。

廣播包有兩種:

其中 廣播包是每個外設都必須廣播的,而響應包是可選的 。每個廣播包的長度必須是 31個位元組 ,如果不到 31個位元組 ,則剩下的全用 0 填充 補全,這部分的數據是無效的

廣播包中包含若干個廣播數據單元,廣播數據單元也稱為 AD Structure 。

廣播數據單元 = 長度值Length + AD type + AD Data。

長度值 Length 只佔 一個位元組 ,並且位於廣播數據單元的 第一個位元組

概念的東西有些抽象,先看看下面的廣播報文:

​ 0x代表這串字元串是十六進制的字元串。 兩位十六進制數代表一個位元組 。因為兩個字元組成的十六進制字元串最大為 FF ,即255,而Java中byte類型的取值范圍是-128到127,剛好可以表示一個255的大小。所以兩個十六進制的字元串表示一個位元組。

​ 繼續查看報文內容,開始讀取第一個廣播數據單元。讀取 第一個 位元組: 0x07 ,轉換為十進制就是7,即表示後面的7個位元組是這個廣播數據單元的數據內容。超過這7個位元組的數據內容後,表示是一個新的廣播數據單元。

​ 而第二個廣播數據單元,第一個位元組的值是 0x16 ,轉換為十進制就是22,表示後面22個位元組為第二個廣播數據單元。

​ 在廣播數據單元的 數據部分 中, 第一個位元組 代表 數據類型 (AD type),決定數據部分表示的是什麼數據。(即廣播數據單元第二個位元組為AD type)

AD Type 的類型如下:

​ 這bit 1~7分別代表著發送該廣播的藍牙晶元的物理連接狀態。當bit的值為1時,表示支持該功能。
例:

藍牙廣播的數據格式大致講了一下,有助於下面的廣播操作的理解。

先看看廣播設置( AdvertiseSettings )如何定義:

(1)、通過 AdvertiseSettings.Builder#setAdvertiseMode() 設置廣播模式。其中有3種模式:

(2)、通過 AdvertiseSettings.Builder#setAdvertiseMode() 設置廣播發射功率。共有4種功率模式:

(3)、通過 AdvertiseSettings.Builder#setTimeout() 設置持續廣播的時間,單位為毫秒。最多180000毫秒。當值為0則無時間限制,持續廣播,除非調用 BluetoothLeAdvertiser#stopAdvertising() 停止廣播。

(4)、通過 AdvertiseSettings.Builder#setConnectable() 設置該廣播是否可以連接的。

之前說過,外設必須廣播廣播包,掃描包是可選。但添加掃描包也意味著廣播更多得數據,即可廣播62個位元組。

可見無論是廣播包還是掃描包,其廣播的內容都是用 AdvertiseData 類封裝的。

(1)、 AdvertiseData.Builder#setIncludeDeviceName() 方法,可以設置廣播包中是否包含藍牙的名稱。

(2)、 AdvertiseData.Builder#setIncludeTxPowerLevel() 方法,可以設置廣播包中是否包含藍牙的發射功率。

(3)、 AdvertiseData.Builder#addService UUID (Parcel UUID ) 方法,可以設置特定的 UUID 在廣播包中。

(4)、 AdvertiseData.Builder#addServiceData(Parcel UUID ,byte[]) 方法,可以設置特定的 UUID 和其數據在廣播包中。

(5)、 AdvertiseData.Builder#addManufacturerData(int,byte[]) 方法,可以設置特定廠商Id和其數據在廣播包中。

​ 從 AdvertiseData.Builder 的設置中可以看出,如果一個外設需要在不連接的情況下對外廣播數據,其數據可以存儲在 UUID 對應的數據中,也可以存儲在廠商數據中。但由於廠商ID是需要由Bluetooth SIG進行分配的,廠商間一般都將數據設置在廠商數據。

另外可以通過 BluetoothAdapter#setName() 設置廣播的名稱

先看一個例子,我們分別在 廣播包 掃描包 中設置 AdvertiseData.Builder 的 每一種廣播報文參數 ,得到一下報文內容:

(1)、Type = 0x01 表示設備LE物理連接。

(2)、Type = 0x09 表示設備的全名

(3)、Type = 0x03 表示完整的16bit UUID 。其值為0xFFF7。

(4)、Type = 0xFF 表示廠商數據。前兩個位元組表示廠商ID,即廠商ID為0x11。後面的為廠商數據,具體由用戶自行定義。

(5)、Type = 0x16 表示16 bit UUID 的數據,所以前兩個位元組為 UUID ,即 UUID 為0xF117,後續為 UUID 對應的數據,具體由用戶自行定義。

最後繼承 AdvertiseCallback 自定義廣播回調。

初始化完畢上面的對象後,就可以進行廣播:

​ 廣播主要是通過 BluetoothLeAdvertiser#startAdvertising() 方法實現,但在之前需要先獲取 BluetoothLeAdvertiser 對象。

BluetoothLeAdvertiser 對象存在兩個情況獲取為Null:

所以在調用 BluetoothAdapter#getBluetoothLeAdvertiser() 前,需要先調用判斷藍牙已開啟,並判斷在 BluetoothAdapter 中獲取的 BluetoothLeAdvertiser 是否為空(測試過某些華為手機 mBluetoothAdapter.() 為 false , 但是能發送ble廣播)。

​ 與廣播成對出現就是 BluetoothLeAdvertiser.stopAdvertising() 停止廣播了,傳入開啟廣播時傳遞的廣播回調對象,即可關閉廣播:

​ 雖然通過廣播告知外邊自身擁有這些Service,但手機自身並沒有初始化Gattd的Service。導致外部的中心設備連接手機後,並不能找到對應的 GATT Service 和 獲取對應的數據。

Service類型有兩個級別:

創建 BluetoothGattService 時,傳入兩個參數: UUID 和Service類型:

​ 我們都知道Gatt中, Service 的下一級是 Characteristic , Characteristic 是最小的通信單元,通過對 Characteristic 進行讀寫操作來進行通信。

​ 特徵屬性表示該 BluetoothGattCharacteristic 擁有什麼功能,即能對 BluetoothGattCharacteristic 進行什麼操作。其中主要有3種:

許可權屬性用於配置該特徵值所具有的功能。主要兩種:

Characteristic 下還有 Descriptor ,初始化 BluetoothGattDescriptor 時傳入: Descriptor UUID 和 許可權屬性

為 Service 添加 Characteristic ,為 Characteristic 添加 Descriptor :

​ 通過藍牙管理器 mBluetoothManager 獲取 Gatt Server ,用來添加 Gatt Service 。添加完 Gatt Service 後,外部中心設備連接手機時,將能獲取到對應的 GATT Service 和 獲取對應的數據

​ 定義 Gatt Server 回調。當中心設備連接該手機外設、修改特徵值、讀取特徵值等情況時,會得到相應情況的回調。

最後開啟廣播後,用nRF連接後看到的特徵值信息如下圖所示:(加多了一個只能都的特徵值)

android藍牙BLE(一) —— 掃描

android藍牙BLE(二) —— 通信

android藍牙BLE(三) —— 廣播

android藍牙BLE(四) —— 實戰

C. android上有沒有類似蘋果的locate beacon應用

蘋果的iBeacon協議是專為其iOS設備而開發的,不過Android設備在安裝適當的軟體後,也能很好地使用iBeacon。根據Aislelabs公司的一項研究,在考慮電池使用時長方面,Android手機可能更適合iBeacon。
在室內,手機信號經常會收到阻隔,GPS也是同樣,而Beacon硬體就是室內數據的解決方案,它通過低功耗藍牙技術可以進行十分精確的微定位。這一技術的應用場景之一就是智能家居,多個Beacon能構成信息服務網路,實現家庭智能化。比如檢測到房間有人,就會自動開燈,打開空調。聯繫到Google收購智能家居公司Nest,以及近日三星收購家居自動化平台SmartThings,Beacon技術會越來越普通。
理論上,任何支持低功耗藍牙(BLE)的設備都能通過開源的Altbeacon等協議連接到Beacon(信號塔)設備,不過多數Beacon設備都採用蘋果的iBeacon 標准。iBeacon 是蘋果隨iOS 7一同發布的開發者工具,不過Android開發者也能使用這一協議為其他平台開發應用和函數庫。

Aislelabs 發現,相比於Android 設備,iOS設備更少受附近iBeacons設備數量的影響,不過後者在掃描設備中,電量消耗的更快,這是因為蘋果使用了不同的藍牙硬體。測試使用了6台設備,其中較廉價的Moto G在用電方面表現最好,所有三台Android設備在掃描Beacon設備時,用電都比iPhone要小。數據都是按比例計算的,因為一般來說Android設備的電池比較大。
Moto G使用了「beacon取樣」(beacon sampling)技術,可減少需要處理的藍牙信號數目,如果有100個Beacon設備進行廣播,它只會解碼其中一部分,這樣可以顯著減少用電量。而且由於Beacon設備會進行多次廣播,信號內容有重復,所以減少處理量不會造成信息損失。
另一方面,蘋果對廣播信號范圍進行了設定,所有發送到iPhone的信號都需要進行解碼,以確定其是否在允許的范圍之內,而這會造成少量的電量損失。看來,盡管蘋果根據開源藍牙技術開發了自己的iBeacon規格,但並不意味著iPhone就最適合這一技術。

D. iBeacon到底在ios和android上消耗多少電量

報告還顯示新的iPhone會在電量上更加節約,這很可能是新的iPhone採用了更加高性能的藍牙晶元:圖片顯示了iPhone 4S消耗了大部分電量而iphone 5S明顯優化了。隨著Beacon增加,手機消耗更多電量。如果一顆beacon,並且持續掃描,4S多消耗5.75%電量,而5s是4.25%。雖者beacon數量增加,4S消耗11%而5S為4.75%,可以看出在10顆beacon下,5S僅僅消耗了4S一半的電量。


而android設備看起來在實驗里表現得更加優秀,報告指出可能是由於與ios採用了稍微不同的beacon掃描方式。ios支允許後台掃描指定uuid的beacon,而android不限制,看起來這種方式ios更加省電,但android的新一代設備採用了對beacon的更加自動的采樣掃描技術,比如Moto G,這樣相對ios手動去添加掃描列表的省電方式更加有效。


報告聲明實驗室進行每秒鍾間隔連續掃描,連續一小時,但在實際應用中是不可能的,因為掃描頻率不會高,實際情況估計也就是在12小時內消耗不多於1%的電量。

熱點內容
安卓什麼軟體測試手機電池 發布:2025-02-02 04:28:52 瀏覽:991
手機上傳快 發布:2025-02-02 04:27:46 瀏覽:305
電腦配置詳解圖解都有哪些 發布:2025-02-02 04:26:27 瀏覽:713
景區應該有什麼配置 發布:2025-02-02 04:09:08 瀏覽:119
c語言與java工作 發布:2025-02-02 03:59:57 瀏覽:282
qq買什麼不要支付密碼 發布:2025-02-02 03:50:29 瀏覽:495
android讀取視頻 發布:2025-02-02 03:46:57 瀏覽:826
手機號序列碼的密碼在哪裡 發布:2025-02-02 03:29:34 瀏覽:878
安卓怎麼換回鴻蒙系統 發布:2025-02-02 03:24:35 瀏覽:513
完美國際鄰水鎮箱子密碼是多少 發布:2025-02-02 03:17:04 瀏覽:625