如果你想在蓝牙连接失败或者超时的情况下去做

2019-09-30 15:32栏目:美高梅开户送58元官网
TAG:

图片 1

对BLE蓝牙感兴趣的朋友可以加入我们讨论群:

Android 4.3(API Level 18)开始引入Bluetooth Low Energy(BLE,低功耗蓝牙)的核心功能并提供了相应的 API, 应用程序通过这些 API 扫描蓝牙设备、查询 services、读写设备的 characteristics等操作。

上篇文章主要介绍了关于BLE的一些基础操作,我们能够大概了解到蓝牙操作的一些流程,上文末介绍了本人的一个BLE开源库,支持蓝牙一对多的连接方式,该库封装了蓝牙的开启、扫描、连接、断开、连接超时...一系列的操作流程,大大简化了开发者的负担,那么接下来将重点讲解该蓝牙库的用法。

QQ:494309361(Android蓝牙开发小纵队)

图片 2image

随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环、心率检测仪、以及各式各样的智能家具和玩具类产品。安卓4.3为BLE的核心功能提供平台支持和API,App可以利用它来发现设备、查询服务和读写特性。相比传统的蓝牙,BLE更显著的特点是低功耗。本文主要讲解Android低功耗蓝牙的api使用以及蓝牙扫描、连接、发送数据、接收数据等一系列操作,并主要介绍本人封装的BleLib蓝牙库,非常适合蓝牙初学者使用,只需要一行代码注入就OK了,而且用法也极其简单,下面会专门讲解BleLib库的使用。


废话不说,先来看下Demo中的效果图:

图片 3Demo预览图.gif

在BLE协议中,有两个角色,周边(Periphery)和中央;周边是数据提供者,中央是数据使用/处理者,一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央。首先使用蓝牙就不得不说BluetoothGatt和BluetoothGattCallback这两个类,该类继承自BluetoothProfile,BluetoothGatt作为中央来使用和处理数据,通过BluetoothGatt可以连接设备,发现服务(discoverServices),并把相应地属性返回到BluetoothGattCallback,BluetoothGattCallback返回中央的状态和周边提供的数据。

Android BLE 使用的蓝牙协议是 GATT 协议,有关该协议的详细内容可以参见蓝牙官方文档。以下我引用一张官网的图来大概说明 Android 开发中我们需要了解的一些 Bluetooth Low Energy 的专业术语。

图片 4图片 5结构.png

1. 蓝牙开发流程:

我们蓝牙操作的主要目的就是为了拿到中央BluetoothGatt这个对象,进而进行接下来的所有一系列操作,如下:

1.先拿到BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);2.再拿到BluetoothAdapt btAdapter = bluetoothManager.getAdapter();3.开始扫描:btAdapter.startLeScan( BluetoothAdapter.LeScanCallback);4.从LeScanCallback中得到BluetoothDevice public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {…..}5.用BluetoothDevice得到BluetoothGatt:gatt = device.connectGatt(this, true, gattCallback);

这时总算拿到中央BluetoothGatt了,它有很多的方法,调用这些方法,你就可以通过BluetoothGattCallback和周边BluetoothGattServer交互了。

图片 6蓝牙协议图

这里先不讲解iQppCallback和QppApi两个类,这两个类暂时并未用到,后期维护时会详细讲解。

2. 主要类的大致理解:
  • BluetoothProfile: 一个通用的规范,按照这个规范来收发数据。

  • BluetoothManager:通过BluetoothManager来获取BluetoothAdapter

    如:BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    
  • BluetoothAdapter:一个Android系统只有一个BluetoothAdapter ,通过BluetoothManager 获取

    BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();
    
  • BluetoothGattDescriptor:可以看成是描述符,对Characteristic的描述,包括范围、计量单位等。

  • BluetoothGattService:服务,Characteristic的集合。

  • BluetoothGattCallback:已经连接上设备,对设备的某些操作后返回的结果。这里必须提醒下,已经连接上设备后的才可以返回,没有返回的认真看看有没有连接上设备。

    private BluetoothGattCallback GattCallback = new BluetoothGattCallback() { // 这里有9个要实现的方法,看情况要实现那些,用到那些就实现那些 public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState){}; public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status){ }; }; BluetoothDevice device = mBluetoothAdapter.getRemoteDevice; BluetoothGatt gatt = device.connectGatt(this, false, mGattCallback);
    

一个低功耗蓝牙设备可以定义许多 Service, Service 可以理解为一个功能的集合。设备中每一个不同的 Service 都有一个 128 bit 的 UUID 作为这个 Service 的独立标志。蓝牙核心规范制定了两种不同的UUID,一种是基本的UUID,一种是代替基本UUID的16位UUID。所有的蓝牙技术联盟定义UUID共用了一个基本的UUID:0x0000xxxx-0000-1000-8000-00805F9B34FB为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。例如,心率测量特性使用0X2A37作为它的16位UUID,因此它完整的128位UUID为:0x00002A37-0000-1000-8000-00805F9B34FB

第一个类BleDevice,该类的主要是来描述并记录蓝牙的属性和状态,如记录蓝牙名称、蓝牙MAC地址、蓝牙别名、蓝牙连接状态等。

3. 上面所说的9个要实现的方法,所对应蓝牙交互的主要对应关系:

图片 7image

notification对应onCharacteristicChanged;

gatt.setCharacteristicNotification(characteristic, true);

该方法一般是在发现服务后,进行设置的,设置该方法的目的是让硬件在数据改变的时候,发送数据给app,app则通过onCharacteristicChanged方法回调给用户,从参数中可获取到回调回来的数据。

readCharacteristic对应onCharacteristicRead;

gatt.readCharacteristic(characteristic);

writeCharacteristic对应onCharacteristicWrite;

gatt.wirteCharacteristic(mCurrentcharacteristic);

连接蓝牙或者断开蓝牙 对应 onConnectionStateChange;

bluetoothDevice.connectGatt(this, false, mGattCallback);或gatt.disconnect();(断开连接后务必记得gatt.close

readDescriptor对应onDescriptorRead;

gatt.readDescriptor(descriptor);

writeDescriptor对应onDescriptorWrite;

gatt.writeDescriptor(descriptor);

readRemoteRssi对应onReadRemoteRssi;

gatt.readRemoteRssi();

executeReliableWrite对应onReliableWriteCompleted;

 gatt.executeReliableWrite();

discoverServices对应onServicesDiscovered

gatt.discoverServices();

在 Service 下面,又包括了许多的独立数据项,我们把这些独立的数据项称作 Characteristic。同样的,每一个 Characteristic 也有一个唯一的 UUID 作为标识符。在 Android 开发中,建立蓝牙连接后,我们说的通过蓝牙发送数据给外围设备就是往这些 Characteristic 中的 Value 字段写入数据;外围设备发送数据给手机就是监听这些 Charateristic 中的 Value 字段有没有变化,如果发生了变化,手机的 BLE API 就会收到一个监听的回调。

第二个类BleConfig,该类是蓝牙配置类,里面包含了蓝牙服务的UUID、蓝牙特征的UUID、描述的UUID、以及蓝牙状态的静态常量值的标记等等,其中蓝牙相关的UUID的设置是对外提供了接口的,用的时候可以自行传入特定的UUID即可。

开启蓝牙所具备的权限:
 <uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

如果 android.hardware.bluetooth_le设置为false,可以安装在不支持的设备上使用,判断是否支持蓝牙4.0用以下代码就可以了,如:

 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, “设备不支持蓝牙4.0”, Toast.LENGTH_SHORT).show(); finish(); }

对蓝牙的启动关闭操作:

1、利用系统默认开启蓝牙对话框

if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); }

2、后台打开蓝牙,不做任何提示,这个也可以用来自定义打开蓝牙对话框啦

mBluetoothAdapter.enable();

3、后台关闭蓝牙

mBluetoothAdapter.disable();
  • ###### 最简洁的植入

图片 8image

private void initBle() { mBle = Ble.options() .setLogBleExceptions//设置是否输出打印蓝牙日志(非正式打包请设置为true,以便于调试) .setThrowBleException//设置是否抛出蓝牙异常 .setAutoConnect//设置是否自动连接 .setConnectFailedRetryCount .setConnectTimeout(10 * 1000)//设置连接超时时长(默认10*1000 ms) .setScanPeriod(12 * 1000)//设置扫描时长(默认10*1000 ms) .setUuid_service(UUID.fromString("0000fee9-0000-1000-8000-00805f9b34fb"))//主服务的uuid .setUuid_write_cha(UUID.fromString("d44bc439-abfd-45a2-b575-925416129600"))//可写特征的uuid .create(getApplicationContext; } 
  • ###### 最大程度简化了代码量

图片 9image

有对比才有伤害,那就来看下原生api调用蓝牙流程和该库之间的对比:

更详细的内容可以参见GATT Profile 简介通用属性配置文件及其服务,特性与属性介绍GATT specificationGATT Services蓝牙协议介绍

第三个类BleLisenter,该类提供了蓝牙各个状态的接口,此处做成了抽象类,目的是为了可以让用户有条件的去实现想要实现的方法,比如说客户想要在蓝牙扫描开始的时候添加一些动画效果,那么你就可以实现onStart()方法,然后在其中做你想做的事情,默认是不需要实现的,如果你想要在蓝牙设备返回数据时做出反应,那就去实现onRead()方法,如果你想在蓝牙连接失败或者超时的情况下去做特殊的处理,你就去实现onError()或者onConnectTimeOut()方法等等。

例如扫描设备

BluetoothAdapterBluetoothAdapter 拥有基本的蓝牙操作,例如开启蓝牙扫描,使用已知的 MAC 地址 (BluetoothAdapter#getRemoteDevice)实例化一个 BluetoothDevice 用于连接蓝牙设备的操作等等。

第四个类BleManager,该类提供了几乎所有你需要用到的方法,包括蓝牙扫描、连接、断开、蓝牙当前连接状态等等,管理了蓝牙操作的所有接口和方法。

原生API写法:
private void scanLeDevice(final boolean enable) { if  { // 经过预定扫描期后停止扫描 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); } ... } 然后在mLeScanCallback的回调中拿到扫描结果: // 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() { ... } }); } 

BluetoothDevice代表一个远程蓝牙设备。这个类可以让你连接所代表的蓝牙设备或者获取一些有关它的信息,例如它的名字,地址和绑定状态等等。

第五个类BluetoothLeService,该类是最重要的一个类,主要是蓝牙操作中用到的各个方法的实现类。

BleLib中扫描的写法:
mBle.startScan(scanCallback);回调结果:BleScanCallback<BleDevice> scanCallback = new BleScanCallback<BleDevice>() { @Override public void onLeScan(final BleDevice device, int rssi, byte[] scanRecord) { ... } } };
  • ###### 提供了独一无二的OTA升级接口(即蓝牙硬件进行更新升级的接口)
这绝对是其他蓝牙库所没有的,具体API请看下面的库使用步骤

compile 'cn.com.superLei:blelibrary:2.5.2-beta'

BluetoothGatt这个类提供了 Bluetooth GATT 的基本功能。例如重新连接蓝牙设备,发现蓝牙设备的 Service 等等。

首先要现在AndroidManifest文件中加入蓝牙操作所需要的一些权限,此处不再赘述,大致流程可参考Android BLE蓝牙详细解读,接下来我们一步一步来详细讲解用法。

1. 初始化蓝牙(动态授权蓝牙操作权限、打开蓝牙、判断设备是否支持蓝牙等操作请看DEMO)
 private void initBle() { mBle = Ble.options() .setLogBleExceptions//设置是否输出打印蓝牙日志(非正式打包请设置为true,以便于调试) .setThrowBleException//设置是否抛出蓝牙异常 .setAutoConnect//设置是否自动连接 .setConnectFailedRetryCount//设置连接失败的重试次数 .setConnectTimeout(10 * 1000)//设置连接超时时长(默认10*1000 ms) .setScanPeriod(12 * 1000)//设置扫描时长(默认10*1000 ms) .setUuid_service(UUID.fromString("0000fee9-0000-1000-8000-00805f9b34fb"))//主服务的uuid .setUuid_write_cha(UUID.fromString("d44bc439-abfd-45a2-b575-925416129600"))//可写特征的uuid .create(getApplicationContext; } 

BluetoothGattService这一个类通过 BluetoothGatt#getService 获得,如果当前服务不可见那么将返回一个 null。这一个类对应上面说过的 Service。我们可以通过这个类的 getCharacteristic(UUID uuid) 进一步获取 Characteristic 实现蓝牙数据的双向传输。

1. 初始化蓝牙(包含了动态授权蓝牙操作权限、打开蓝牙、判断设备是否支持蓝牙)
 private void initBle() { try { mManager = BleManager.getInstance; mManager.registerBleListener(mLisenter); boolean result = false; if (mManager != null) { result = mManager.startService(); if (!mManager.isBleEnable {//蓝牙未打开 mManager.turnOnBlueTooth; } else {//已打开 requestPermission(new String[]{Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.ACCESS_COARSE_LOCATION}, getString(R.string.ask_permission), new GrantedResult() { @Override public void onResult(boolean granted) { if  { finish(); } else { //开始扫描 mManager.scanLeDevice; } } }); } } if  { Logger.e; if (mManager != null) { mManager.startService(); } } } catch (Exception e) { e.printStackTrace(); }}

如果没有打开蓝牙,当点击打开蓝牙的提示框后,会在

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // User chose not to enable Bluetooth. if (requestCode == BleManager.REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) { finish(); return; } else { if (mManager != null) { mManager.scanLeDevice; } } super.onActivityResult(requestCode, resultCode, data); }

该方法中收到回调信息,打开后则开启扫描,否则则根据你自己的需要进行操作。

2. 扫描周边设备
mBle.startScan(scanCallback);//扫描回调BleScanCallback<BleDevice> scanCallback = new BleScanCallback<BleDevice>() { @Override public void onLeScan(final BleDevice device, int rssi, byte[] scanRecord) { ... //获取到蓝牙设备对象,根据自身需求进行操作(库中已进行相同设备的过滤) } };

BluetoothGattCharacteristic这个类对应上面提到的 Characteristic。通过这个类定义需要往外围设备写入的数据和读取外围设备发送过来的数据。

2. 通过注册监听的方式,这里我们可以看到我们把lisenter的实例传进去,那么我们就会在这里得到蓝牙的所有回调监听,从而在此处进行各种操作。如下图(注:下面回调方法大多数都可以根据你的需要选择性实现,不需要可以不用实现):
 private BleLisenter mLisenter = new BleLisenter() { @Override public void onStart() { ... //可以选择性实现该方法 不需要则不用实现 } @Override public void onStop() { ... } @Override public void onConnectTimeOut() { ... } @Override public void onLeScan(final BleDevice device, int rssi, byte[] scanRecord) { ... } @Override public void onConnectionChanged(final BleDevice device) { ... } @Override public void onServicesDiscovered(BluetoothGatt gatt) { ... } @Override public void onReady(BluetoothDevice device) { ... } @Override public void onChanged(BluetoothGattCharacteristic characteristic) { Logger.e("data===" + Arrays.toString(characteristic.getValue; //可以选择性实现该方法 不需要则不用实现 //硬件mcu 返回数据 } @Override public void onWrite(BluetoothGatt gatt) { ... } @Override public void onRead(BluetoothDevice device) { ... } @Override public void onDescriptorWriter(BluetoothGatt gatt) { ... } };
3.开始连接
mBle.connect(device, connectCallback); //连接回调private BleConnCallback<BleDevice> connectCallback = new BleConnCallback<BleDevice>() { @Override public void onConnectionChanged(BleDevice device) { if (device.isConnected { //连接成功之后设置通知 setNotify; } Log.e(TAG, "onConnectionChanged: " + device.isConnected; } @Override public void onConnectException(BleDevice device, int errorCode) { super.onConnectException(device, errorCode); Toast.makeText(BleActivity.this, "连接异常,异常状态码:" + errorCode, Toast.LENGTH_SHORT).show(); } };

连接异常状态码可参阅该项目的wiki

<uses-permission android:name="android.permission.BLUETOOTH"/> 使用蓝牙所需要的权限<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 使用扫描和设置蓝牙的权限(申明这一个权限必须申明上面一个权限)
3. 这里对几个重要的回调做解读,当我们收到onLeScan()回调时,则说明已经扫描到设备,只需要加入到你的设备列表中即可,当收到onConnectionChanged()方法时,说明蓝牙连接状态已经改变,则只需要判断BleDevice的状态即可,当收到onServicesDiscovered()回调时,说明已经搜索到蓝牙服务,这时可以根据自己的需求去设置通知Notify,如下图:
 //设置通知数组 private void displayGattServices(final String address, List<BluetoothGattService> gattServices) { if (gattServices == null) return; String uuid = null; // Loops through available GATT Services. for (BluetoothGattService gattService : gattServices) { uuid = gattService.getUuid().toString(); Log.d(TAG, "displayGattServices: " + uuid); if (uuid.equals(BleConfig.UUID_SERVICE_TEXT)) { Log.d(TAG, "service_uuid: " + uuid); List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics(); for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) { uuid = gattCharacteristic.getUuid().toString(); if (uuid.equals(BleConfig.UUID_CHARACTERISTIC_TEXT)) { Log.e("mWriteCharacteristic", uuid); mWriteCharacteristicMap.put(address,gattCharacteristic); //通知特性 } else if (gattCharacteristic.getProperties() == BluetoothGattCharacteristic.PROPERTY_NOTIFY) { mNotifyCharacteristics.add(gattCharacteristic); Log.e("mNotifyCharacteristics", "PROPERTY_NOTIFY"); } } //真正设置通知 if (mNotifyCharacteristics != null && mNotifyCharacteristics.size { Log.e("setCharaNotification", "setCharaNotification"); setCharacteristicNotification(address, mNotifyCharacteristics.get(mNotifyIndex++), true); } } } }

根据服务的UUID来进行过滤,然后根据服务获取到特征的UUID,然后在进行过滤,然后再从特征中取出通知的UUID,这时设置通知为true就可以了。

当收到onChanged()回调时,则说明蓝牙设备的数据发生改变了,通知程序作出改变。还有很多回调,他们对应的情况不懂得可以参考上篇。

4.设置通知及回调
private void setNotify(BleDevice device) { /*连接成功后,设置通知*/ mBle.startNotify(device, new BleNotiftCallback<BleDevice>() { @Override public void onChanged(BleDevice device, BluetoothGattCharacteristic characteristic) { Log.e(TAG, "onChanged: 表示返回硬件MCU发来的数据"+Arrays.toString(characteristic.getValue; } @Override public void onReady(BleDevice device) { Log.e(TAG, "onReady: 表示一切准备就绪,可以进行读写(发送数据或者读取数据)的标志"); } @Override public void onServicesDiscovered(BluetoothGatt gatt) { Log.e(TAG, "onServicesDiscovered is success "); } @Override public void onNotifySuccess(BluetoothGatt gatt) { Log.e(TAG, "onNotifySuccess is success "); } }); }

当收到onChanged(BluetoothGattCharacteristic characteristic)回调时,则说明蓝牙设备的数据发生改变了,通知程序作出改变。还有很多回调,他们对应的情况不懂得可以参考上面的原生API的详细讲解。

在Android5.0之前,是默认申请GPS硬件功能的。而在Android 5.0 之后,需要在manifest 中申明GPS硬件模块功能的使用。

4. 发送数据到蓝牙设备

这里可以通过调用BleManager中的sendData()方法即可,只需要传入指定的蓝牙设备地址以及需要发送的二进制数据即可,返回值是发送成功或者失败的布尔值。

上面的所有情况是针对特定的蓝牙设备,针对发送通知和收发数据的形式,具体还要看硬件的协议,看是否需要设置通知,想详细进行了解的可以去下载本人的github上面的DEMO进行详细了解。

附DEMO下载地址

androidstudio依赖地址: compile ‘cn.com.superLei:blelibrary:1.0.1’

5.读取远程Rssi
mBle.readRssi(mBle.getConnetedDevices, new BleReadRssiCallback<BleDevice>() { @Override public void onReadRssiSuccess { super.onReadRssiSuccess; Log.e(TAG, "onReadRssiSuccess: " + rssi); Toast.makeText(BleActivity.this, "onReadRssiSuccess:"+ rssi, Toast.LENGTH_SHORT).show;
 <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. --> <uses-feature android:name="android.hardware.location.gps" />

QQ:494309361(Android蓝牙开发小纵队)

6.主动读取数据
public void read(BleDevice device) { boolean result = mBle.read(device, new BleReadCallback<BleDevice>() { @Override public void onReadSuccess(BluetoothGattCharacteristic characteristic) { super.onReadSuccess(characteristic); byte[] data = characteristic.getValue(); Log.w(TAG, "onReadSuccess: " + Arrays.toString; } }); if  { Log.d(TAG, "读取数据失败!"); }

在 Android 6.0 及以上,还需要打开位置权限。如果应用没有位置权限,蓝牙扫描功能不能使用(其它蓝牙操作例如连接蓝牙设备和写入数据不受影响)。

7.写入数据
boolean result = mBle.write(device, changeLevelInner(), new BleWriteCallback<BleDevice>() { @Override public void onWriteSuccess(BluetoothGattCharacteristic characteristic) { Toast.makeText(BleActivity.this, "发送数据成功", Toast.LENGTH_SHORT).show; if  { Log.e(TAG, "changeLevelInner: " + "发送数据失败!"); }
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
8.发送大数据包
try { //获取整个文件的总字节 byte[]data = toByteArray(getAssets().open("WhiteChristmas.bin")); //发送大数据量的包(参数请查阅Demo Code) mBle.writeEntity(mBle.getConnetedDevices, data, 20, 50, new BleWriteEntityCallback<BleDevice>() { @Override public void onWriteSuccess() { L.e("writeEntity", "onWriteSuccess"); } @Override public void onWriteFailed() { L.e("writeEntity", "onWriteFailed"); } }); } catch (IOException e) { e.printStackTrace(); }

在建立蓝牙连接之前,需要确认设备支持 BLE。如果支持,再确认蓝牙是否开启。如果蓝牙没有开启,可以使用 BLuetoothAdapter 类来开启蓝牙。

9.设置MTU
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ //此处第二个参数 不是特定的 比如你也可以设置500 但是如果设备不支持500个字节则会返回最大支持数 mBle.setMTU(mBle.getConnetedDevices.getBleAddress(), 250, new BleMtuCallback<BleDevice>() { @Override public void onMtuChanged(BleDevice device, int mtu, int status) { super.onMtuChanged(device, mtu, status); ToastUtil.showToast("最大支持MTU:"+mtu); } }); }else { ToastUtil.showToast("设备不支持MTU"); }
  1. 获取 BluetoothAdapter
10.OTA升级
//找到你需要升级文件的路径(一般情况都是保存再服务器上,一旦有更新会自动提示,然后APP下载并保存到本地,生成对应的file对象)File file = new File;//读写SD卡权限,此处略(6.0及以上需添加)OtaManager mOtaManager = new OtaManager(BleActivity.this);boolean result = mOtaManager.startOtaUpdate(file, (BleDevice) mBle.getConnetedDevices, mBle);Log.e("OTA升级结果:", result + "");

分析之前先来张BleLib库API的结构图供大家参考(下图是1.x库的结构,API名称部分与当前有点不同):

图片 10BleLib库结构图.png图片 11image

版权声明:本文由美高梅开户送58元官网发布于美高梅开户送58元官网,转载请注明出处:如果你想在蓝牙连接失败或者超时的情况下去做