首页

文章

Android BLE为什么首次连接蓝牙设备比较慢

发布网友 发布时间:2022-04-20 00:28

我来回答

3个回答

热心网友 时间:2023-08-19 07:23

光讲连接的话应该是不会出现这个问题的,你是不是做过保存连接的操作,所以第一次慢,以后快。追问连接后扫描服务慢

热心网友 时间:2023-08-19 07:23

第一次初始化服务需要时间

热心网友 时间:2023-08-19 07:24

一、关键概念:

Generic Attribute Profile (GATT)

通过BLE连接,读写属性类小数据的Profile通用规范。现在所有的BLE应用Profile都是基于GATT的。

Attribute Protocol (ATT)

GATT是基于ATT
Protocol的。ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据。每个属性都有一个唯一的UUID,属性将以characteristics and services的形式传输。

Characteristic

Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。

Descriptor

对Characteristic的描述,例如范围、计量单位等。

Service

Characteristic的集合。例如一个service叫做“Heart Rate
Monitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heart rate
measurement"的Characteristic。

二、角色和职责:

Android设备与BLE设备交互有两组角色:

中心设备和外围设备(Central vs. peripheral);

GATT server vs. GATT client.

Central vs. peripheral:

中心设备和外围设备的概念针对的是BLE连接本身。Central角色负责scan advertisement。而peripheral角色负责make
advertisement。

GATT server vs. GATT client:

这两种角色取决于BLE连接成功后,两个设备间通信的方式。

举例说明:

现 有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角
色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。

当 连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例如,如果活动追踪的BLE设备需要向
Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则
Android设备作为server端可能更合适。

三、权限及feature:

和经典蓝牙一样,应用使用蓝牙,需要声明BLUETOOTH权限,如果需要扫描设备或者操作蓝牙设置,则还需要BLUETOOTH_ADMIN权限:

<uses-permission
android:name="android.permission.BLUETOOTH"/>
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"/>

除了蓝牙权限外,如果需要BLE feature则还需要声明uses-feature:

<uses-feature android:name="android.hardware.bluetooth_le"
android:required="true"/>

按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备均可正常安装运行,需要在代码运行时判断设备是否支持BLE
feature:

// Use this check to determine whether BLE is supported on the device.
Then
// you can selectively disable BLE-related features.
if
(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE))
{
Toast.makeText(this, R.string.ble_not_supported,
Toast.LENGTH_SHORT).show();
finish();
}

四、启动蓝牙:

在使用蓝牙BLE之前,需要确认Android设备是否支持BLE
feature(required为false时),另外要需要确认蓝牙是否打开。

如果发现不支持BLE,则不能使用BLE相关的功能。如果支持BLE,但是蓝牙没打开,则需要打开蓝牙。

打开蓝牙的步骤:

1、获取BluetoothAdapter

BluetoothAdapter是Android系统中所有蓝牙操作都需要的,它对应本地Android设备的蓝牙模块,在整个系统中BluetoothAdapter是单例的。当你获取到它的示例之后,就能进行相关的蓝牙操作了。

获取BluetoothAdapter代码示例如下:

// Initializes Bluetooth adapter.
final BluetoothManager
bluetoothManager =
(BluetoothManager)
getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter =
bluetoothManager.getAdapter();

注:这里通过getSystemService获取BluetoothManager,再通过BluetoothManager获取BluetoothAdapter。BluetoothManager在Android4.3以上支持(API
level 18)。

2、判断是否支持蓝牙,并打开蓝牙

获取到BluetoothAdapter之后,还需要判断是否支持蓝牙,以及蓝牙是否打开。

如果没打开,需要让用户打开蓝牙:

private BluetoothAdapter mBluetoothAdapter;
...
// Ensures Bluetooth
is available on the device and it is enabled. If not,
// displays a dialog
requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null
|| !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

五、搜索BLE设备:

通过调用BluetoothAdapter的startLeScan()搜索BLE设备。调用此方法时需要传入 BluetoothAdapter.LeScanCallback参数。

因此你需要实现 BluetoothAdapter.LeScanCallback接口,BLE设备的搜索结果将通过这个callback返回。

由于搜索需要尽量减少功耗,因此在实际使用时需要注意:

1、当找到对应的设备后,立即停止扫描;

2、不要循环搜索设备,为每次搜索设置适合的时间*。避免设备不在可用范围的时候持续不停扫描,消耗电量。

搜索的示例代码如下:

/**
* Activity for scanning and displaying available BLE
devices.
*/
public class DeviceScanActivity extends ListActivity
{

private BluetoothAdapter mBluetoothAdapter;
private boolean
mScanning;
private Handler mHandler;

// Stops scanning after
10 seconds.
private static final long SCAN_PERIOD = 10000;

...
private void scanLeDevice(final boolean enable) {
if
(enable) {
// Stops scanning after a pre-defined scan
period.
mHandler.postDelayed(new Runnable() {

@Override
public void run() {

mScanning = false;

mBluetoothAdapter.stopLeScan(mLeScanCallback);
}

}, SCAN_PERIOD);

mScanning = true;

mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {

mScanning = false;

mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
...

}
...
}

如果你只需要搜索指定UUID的外设,你可以调用 startLeScan(UUID[],
BluetoothAdapter.LeScanCallback)方法。

其中UUID数组指定你的应用程序所支持的GATT Services的UUID。

BluetoothAdapter.LeScanCallback的实现示例如下:

private LeDeviceListAdapter mLeDeviceListAdapter;
...
// Device scan
callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =

new BluetoothAdapter.LeScanCallback() {
@Override
public void
onLeScan(final BluetoothDevice device, int rssi,
byte[]
scanRecord) {
runOnUiThread(new Runnable() {

@Override
public void run() {

mLeDeviceListAdapter.addDevice(device);

mLeDeviceListAdapter.notifyDataSetChanged();
}
});

}
};

注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。

六、连接GATT Server:

两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。

连接GATT Server,你需要调用BluetoothDevice的connectGatt()方法。此函数带三个参数:Context、autoConnect(boolean)和BluetoothGattCallback对象。调用示例:

mBluetoothGatt = device.connectGatt(this, false,
mGattCallback);

函数成功,返回BluetoothGatt对象,它是GATT
profile的封装。通过这个对象,我们就能进行GATT Client端的相关操作。BluetoothGattCallback用于传递一些连接状态及结果。

BluetoothGatt常规用到的几个操作示例:

connect() :连接远程设备。

discoverServices() : 搜索连接设备所支持的service。

disconnect():断开与远程设备的GATT连接。

close():关闭GATT Client端。

readCharacteristic(characteristic) :读取指定的characteristic。

setCharacteristicNotification(characteristic, enabled)
:设置当指定characteristic值变化时,发出通知。

getServices() :获取远程设备所支持的services。

等等。

注:

1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。

2、一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调函数中返回。例如
discoverServices与onServicesDiscovered回调,readCharacteristic与
onCharacteristicRead回调,setCharacteristicNotification与
onCharacteristicChanged回调等。

http://www.blogjava.net/zh-weir/archive/2014/04/02/407373.html
玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 求一个可以抓包的手机Wifi软件 如何用安卓抓包工具shark进行抓包 安卓手机软件权限如何设置呀! 立信大华会计师事务所怎样,待遇如何? 大华会计师事务所怎么样? 大华会计师事务所转正要考试吗 大华会计事务所浙江万邦工资怎么样 中兴华和大华会计师事务所选择哪个? 大华会计师事务所陕西分所工资怎么样 大华会计师事务所怎么样 大华会计师事务所郑州分所和般若资咨公司是什么关系? 大华会计师事务所员工都是重点大学毕业吗? 大华会计师事务所广州分所,审计助理的待遇,听说试... 大华会计师事务所属于什么企业 CAD图布局时怎么让它变得无限大? 大华会计师事务所云南分所怎么样 大华会计师事务所(特殊普通合伙)电话是多少? CAD图布局时怎么让它变得无限大 安徽大华会计事务所工资 在大华会计师事务所上班是一种什么样的体验? 如何用Fiddler对Android应用进行抓包 怎么申请创业贷款? 怎么申请创业贷款 个人创业贷款怎么办理? 大学生创业贷款怎么申请 申请创业贷款条件是什么? 个人如何申请创业贷款? 创业没钱,创业贷款如何申请? 创业贷款需要什么条件? 申请创业贷款需要什么条件? 想创业怎么申请贷款 如何申请个人创业贷款 大学生创业贷款怎么申请? 个人如何成功申请创业贷款? 创业贷款条件申请及流程 如何申请创业贷款,详细! 创业贷款流程以及申请流程 个人创业贷款去哪里申请 申请创业贷款需要哪些条件 创业贷款在什么地方申请
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com