当前位置:首页 » 安卓系统 » 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%的电量。

热点内容
php获取当前年 发布:2025-02-02 01:50:41 浏览:155
sqlbrowser服务 发布:2025-02-02 01:32:14 浏览:730
jeecg源码下载 发布:2025-02-02 01:08:47 浏览:365
多台电脑能共用一个服务器吗 发布:2025-02-02 01:08:44 浏览:26
oppo云存储空间怎么清理 发布:2025-02-02 00:59:31 浏览:263
项目编译啥意思 发布:2025-02-02 00:25:13 浏览:223
逐鹿中原怎样做挂机脚本 发布:2025-02-02 00:23:39 浏览:28
安卓系统跟踪在哪里 发布:2025-02-02 00:23:38 浏览:899
安卓uc浏览器怎么安装油猴 发布:2025-02-02 00:23:38 浏览:299
中商情报网数据库 发布:2025-02-02 00:09:26 浏览:533