Android蓝牙ble编程,蓝牙防丢器实现安卓的BLE接口编程

本文详细介绍了如何利用安卓BLE接口编程实现蓝牙防丢器的功能,包括设备端的TXP特性、告警服务和链路损失服务的设置,以及通过GATTprofile进行数据交互。在安卓4.3及以上版本,通过BluetoothAdapter类进行蓝牙操作,扫描设备,连接GATT,读取和设置Characteristic,以及获取RSSI值。在连接后不断读取RSSI以实时计算距离,确保防丢功能的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原标题:蓝牙防丢器实现安卓的BLE接口编程

3768757e0fefee0064a14649756491f1.png

蓝牙防丢profile

1.TXP(txpower) Characteristic, 设备端需要通过主机控制接口HCI来获得发射功率参数,并以read属性提供给master。

2.IAS(immediate alter service), write属性,供master写告警级别。当master写入新的值时,设备端会收到write的回调,其根据告警级别进行相应告警。

3. LLS(link loss service),write/read属性,供master设置链路断开情况下默认的告警级别。

RSSI通过接收端的接口来获得,并不需要设备端提供service。

以上Characteristic都通过GATT profile提供服务,在蓝牙通信协议上,每个Characteristic都会对应一个UUID。

android蓝牙BLE接口编程

androidBLE接口在android4.3版本以上提供。

1. 判断当前系统是否支持BLE

getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)

返回真表示支持。

2. 获得蓝牙适配器类

用户通过统一的蓝牙适配器类BluetoothAdapter来使用BLE API。

先获得蓝牙管理器:

BluetoothManagerbluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE);

再获得蓝牙适配器实例(单体对象):

BluetoothAdaptermBluetoothAdapter = bluetoothManager.getAdapter();

3. 启动手机蓝牙硬件功能(相当于在设置界面开启蓝牙功能)

mBluetoothAdapter.enable();

4. 开始扫描

BluetoothAdapter.startLeScan(android.bluetooth.BluetoothAdapter.LeScanCallbackcallback)

callback是当扫描到蓝牙设备时的回调接口。实现callback中的onLeScan接口:

@Override

public void onLeScan(finalBluetoothDevice device, int rssi, byte[] scanRecord)

其中,device代表扫描到的设备,可以获得其MAC地址、设备名等等;rssi即信号强度,这是未连接时获取RSSI的方法;scanRecord代表扫描设备得到的响应参数,ibeacon即通过该参数来获得广播内容。

假设String bluetoothAddress = device.getAddress(),获取蓝牙48位MAC地址

5. 连接GATT,获取设备端的UUID服务,并进行数据通信交互

通过MAC地址获得代表设备端的蓝牙设备类

BluetoothDevicedevice = mBluetoothAdapter.getRemoteDevice(bluetoothAddress);

连接GATT

BluetoothGatt mBluetoothGatt = device.connectGatt(android.content.Context context, booleanautoConnect, android.bluetooth.BluetoothGattCallback callback);

Callback是连接GATT之后,所有数据交互的回调入口。分别包括:

1)设备服务发现

@Override

publicvoid onServicesDiscovered(BluetoothGatt gatt, int status)

mBluetoothGatt.getServices()代表设备服务集合,

for (BluetoothGattService gattService : mBluetoothGatt.getServices())

对于每个服务service,用getUuid()可以获得服务的UUID,getCharacteristics()代表该服务的Characteristic集合。

for(BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics)

对于每个Characteristic,getUuid()获得UUID,getPermissions()获得属性权限,getValue()获得属性值。

在该回调中我们只提取感兴趣的三个Characteristic的UUID,对于其他的如电池、设备服务等UUID可以不管。

gattCharacteristic_char5_TXP=gattCharacteristic;

2)连接状态改变

@Override

public voidonConnectionStateChange(BluetoothGatt gatt, int status,intnewState)

有两种状态,BluetoothProfile.STATE_CONNECTED代表连接,BluetoothProfile.STATE_DISCONNECTED代表断开连接。

3)读回调

@Override

public voidonCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristiccharacteristic, intstatus)

其对应手机端发出读请求后,当收到设备端的数据时的回调。如

mBluetoothGatt.readCharacteristic(gattCharacteristic_char5_TXP)

4)设备端数据变化回调

这里对应设备的characteristic的属性是notify或者indication,即相当手机端订阅这个characteristic的值变更服务,当设备端的characteristic发生变化时,设备端会主动发出通知给手机端。

@Override

public voidonCharacteristicChanged(BluetoothGatt gatt,

BluetoothGattCharacteristiccharacteristic)

在回调中获得新的值characteristic.getValue()。

5)获取到RSSI值的回调

RSSI在扫描时可以通过扫描回调接口获得,但是在连接之后要不断地使用

mBluetoothGatt.readRemoteRssi()向底层驱动发出读取RSSI请求,当底层获取到新的RSSI后会进行以下回调:

@Override

public voidonReadRemoteRssi(BluetoothGatt gatt, int rssi, int status)

rssi即是新的信号强度值。

连接后,由于手机和设备端的距离在发生变化,因此要不断地读取RSSI,实时计算两者之间的距离才能保证防丢功能的实现。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值