Android蓝牙BLE开发详解

更新时间:2023-05-23 05:45:40 阅读: 评论:0

Android蓝⽛BLE开发详解
1.介绍
蓝⽛是⼀种短距离的⽆线通信技术,可以实现固定设备、移动设备之间的数据交换。⼀般将蓝⽛分为两⼤类,蓝⽛3.0规范之前的版本称为传统蓝⽛,蓝⽛4.0规范之后的版本称为低功耗蓝⽛,也就是常说的BLE(Bluetooth Low Energy)。
本⽂主要讲解的是Android设备与BLE设备之间的通信,Android 从4.3版本(API Level 18)开始⽀持BLE通信。
2.开发流程
看图说话:
⾸先要判断当前的Android设备是否⽀持蓝⽛,如果⽀持则再判断当前蓝⽛是否处于开启状态,如果未开启则发送⼴播通知系统开启蓝⽛,蓝⽛开启后开始搜索周围的蓝⽛设备,注意搜索⼀定要设置超时处理,搜索到指定蓝⽛设备后停⽌搜索任务。
此时可以以列表的形式供⽤户选择需要连接的设备,或者内部⾃动连接特定的设备,连接成功后,搜索此蓝⽛设备提供的服务(特性、描述符的集合),搜索完成后设置⼀些对应的参数,即可与蓝⽛设
备进⾏通信了。
3.相关API
看下我们在开发过程中需要⽤到的⼀些API:
1.BluetoothAdapter
本地蓝⽛适配器,⽤于⼀些蓝⽛的基本操作,⽐如判断蓝⽛是否开启、搜索蓝⽛设备等。
2.BluetoothDevice
蓝⽛设备对象,包含⼀些蓝⽛设备的属性,⽐如设备名称、mac地址等。
3.BluetoothProfile
⼀个通⽤的蓝⽛规范,设备之间按照这个规范来收发数据。
4.BluetoothGatt
蓝⽛通⽤属性协议,定义了BLE通讯的基本规则,是BluetoothProfile的实现类,Gatt是Generic Attribute Profile的缩写,⽤于连接设备、搜索服务等操作。
5.BluetoothGattCallback
蓝⽛设备连接成功后,⽤于回调⼀些操作的结果,必须连接成功后才会回调。
6.BluetoothGattService
蓝⽛设备提供的服务,是蓝⽛设备特征的集合。
7.BluetoothGattCharacteristic
蓝⽛设备特征,是构建GATT服务的基本数据单元。
8.BluetoothGattDescriptor
蓝⽛设备特征描述符,是对特征的额外描述。
4.代码实现
需⽤⽤到的权限:
<us-permission android:name="android.permission.BLUETOOTH" />
<us-permission android:name="android.permission.BLUETOOTH_ADMIN" />
Demo中把蓝⽛的相关操作写在了Service中,这样即使应⽤退出也不会影响蓝⽛的连接,在Service中通过⼴播的⽅式通知Activity做相应的处理,看下Service:
public class BleService extends Service {
private final String TAG = SimpleName();
private BluetoothGatt mBluetoothGatt;
// 蓝⽛连接状态
private int mConnectionState = 0;
// 蓝⽛连接已断开
private final int STATE_DISCONNECTED = 0;
// 蓝⽛正在连接
partnumberprivate final int STATE_CONNECTING = 1;
// 蓝⽛已连接
private final int STATE_CONNECTED = 2;
// 蓝⽛已连接
public final static String ACTION_GATT_CONNECTED = "com.yl.ble.ACTION_GATT_CONNECTED";
cerel// 蓝⽛已断开
public final static String ACTION_GATT_DISCONNECTED = "com.yl.ble.ACTION_GATT_DISCONNECTED";
// 发现GATT服务
public final static String ACTION_GATT_SERVICES_DISCOVERED = "com.yl.ble.ACTION_GATT_SERVICES_DISCOVERED";
// 收到蓝⽛数据
public final static String ACTION_DATA_AVAILABLE = "com.yl.ble.ACTION_DATA_AVAILABLE";
// 连接失败
public final static String ACTION_CONNECTING_FAIL = "com.yl.ble.ACTION_CONNECTING_FAIL";
// 蓝⽛数据
public final static String EXTRA_DATA = "com.yl.ble.EXTRA_DATA";
// 服务标识
private final UUID SERVICE_UUID = UUID.fromString("0000ace0-0000-1000-8000-00805f9b34fb");
// 特征标识(读取数据)
private final UUID CHARACTERISTIC_READ_UUID = UUID.fromString("0000ace0-0001-1000-8000-00805f9b34fb");
// 特征标识(发送数据)
private final UUID CHARACTERISTIC_WRITE_UUID = UUID.fromString("0000ace0-0003-1000-8000-00805f9b34fb");
private final UUID CHARACTERISTIC_WRITE_UUID = UUID.fromString("0000ace0-0003-1000-8000-00805f9b34fb"); // 描述标识
private final UUID DESCRIPTOR_UUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
// 服务相关
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
cleverpublic BleService getService() {
return BleService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
relea();
Unbind(intent);
}
/**
* 蓝⽛操作回调
* 蓝⽛连接状态才会回调
*/
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
o b
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
// 蓝⽛已连接
mConnectionState = STATE_CONNECTED;
ndBleBroadcast(ACTION_GATT_CONNECTED);
// 搜索GATT服务
mBluetoothGatt.discoverServices();
} el if (newState == BluetoothProfile.STATE_DISCONNECTED) {
// 蓝⽛已断开连接
mConnectionState = STATE_DISCONNECTED;
ndBleBroadcast(ACTION_GATT_DISCONNECTED);
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
// 发现GATT服务
if (status == BluetoothGatt.GATT_SUCCESS) {
tBleNotification();
回复英语}
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
// 收到数据
ndBleBroadcast(ACTION_DATA_AVAILABLE, characteristic);
}
};
职称英语试题
/**
* 发送通知
*
* @param action ⼴播Action
*/
private void ndBleBroadcast(String action) {
thenewyorktimes
private void ndBleBroadcast(String action) {
Intent intent = new Intent(action);
ndBroadcast(intent);
}
泰语翻译在线/**
* 发送通知
*
* @param action        ⼴播Action
* @param characteristic 数据
*/
private void ndBleBroadcast(String action, BluetoothGattCharacteristic characteristic) {        Intent intent = new Intent(action);
if (CHARACTERISTIC_READ_UUID.Uuid())) {
intent.putExtra(EXTRA_DATA, Value());
}
ndBroadcast(intent);
}
/**
* 蓝⽛连接
*
* @param bluetoothAdapter BluetoothAdapter
* @param address          设备mac地址
* @return true:成功 fal:
*/
public boolean connect(BluetoothAdapter bluetoothAdapter, String address) {
if (bluetoothAdapter == null || TextUtils.isEmpty(address)) {
return fal;
}
BluetoothDevice device = RemoteDevice(address);
if (device == null) {
return fal;
}
mBluetoothGatt = tGatt(this, fal, mGattCallback);
mConnectionState = STATE_CONNECTING;
return true;
}
/**
* 蓝⽛断开连接
*/
public void disconnect() {
if (mBluetoothGatt == null) {
return;
}
mBluetoothGatt.disconnect();
}
/**
* 释放相关资源
*/
public void relea() {
if (mBluetoothGatt == null) {
return;
}
mBluetoothGatt.clo();
mBluetoothGatt = null;
}
/**
* 设置蓝⽛设备在数据改变时,通知App
*/
exhaustedpublic void tBleNotification() {
if (mBluetoothGatt == null) {
if (mBluetoothGatt == null) {
ndBleBroadcast(ACTION_CONNECTING_FAIL);
return;
}
// 获取蓝⽛设备的服务
BluetoothGattService gattService = Service(SERVICE_UUID);
if (gattService == null) {
ndBleBroadcast(ACTION_CONNECTING_FAIL);
return;
}
// 获取蓝⽛设备的特征
BluetoothGattCharacteristic gattCharacteristic = Characteristic(CHARACTERISTIC_READ_UUID);
if (gattCharacteristic == null) {
ndBleBroadcast(ACTION_CONNECTING_FAIL);
return;
}
// 获取蓝⽛设备特征的描述符
BluetoothGattDescriptor descriptor = Descriptor(DESCRIPTOR_UUID);
descriptor.tValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
if (mBluetoothGatt.writeDescriptor(descriptor)) {
// 蓝⽛设备在数据改变时,通知App,App在收到数据后回调onCharacteristicChanged⽅法
mBluetoothGatt.tCharacteristicNotification(gattCharacteristic, true);
}
}
/**
* 发送数据
*
* @param data 数据
* @return true:发送成功 fal:发送失败
*/
public boolean ndData(byte[] data) {
// 获取蓝⽛设备的服务
BluetoothGattService gattService = null;
if (mBluetoothGatt != null) {
gattService = Service(SERVICE_UUID);
}
if (gattService == null) {
return fal;
}
// 获取蓝⽛设备的特征
BluetoothGattCharacteristic gattCharacteristic = Characteristic(CHARACTERISTIC_WRITE_UUID);
if (gattCharacteristic == null) {
return fal;
}
// 发送数据
gattCharacteristic.tValue(data);
return mBluetoothGatt.writeCharacteristic(gattCharacteristic);
消防工程师证报考条件及考试科目
}
}
当蓝⽛连接成功后,会回调BluetoothGattCallback中的onConnectionStateChange⽅法,但是此时还不能与蓝⽛设备进⾏通信,还需要调⽤BluetoothGatt中的discoverServices⽅法搜索蓝⽛设备提供的服务,也就是我们上⽂中提到的BluetoothGattService,搜索完成后会回调BluetoothGattCallback中的onServicesDiscovered⽅法,这时就轮到tBleNotification⽅法⼤显⾝⼿了。
⾸先通过⼀个UUID获取到蓝⽛设备提供的服务(BluetoothGattService),这个UUID是由硬件程序定义的,开发的过程中看⽂档就可以了,获取到服务后,再通过⼀个UUID获取到蓝⽛设备的特征(BluetoothGattCharacteristic),然后再获取设备特征的描述符(BluetoothGattDescriptor),设置在蓝⽛设备数据改变时,主动通知App,此时回调BluetoothGattCallback中的onCharacteristicChanged⽅法,通过Value()可以获取到通知的数据。

本文发布于:2023-05-23 05:45:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/119195.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:connect造句
标签:设备   搜索   服务   连接   特征   数据   开发
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图