android BLE 蓝牙的连接(一)

前言

官方文档:

BLE,全称 Bluetooth Low Energy,即低功耗蓝牙。BLE关键术语和概念,可以查看官网介绍:

蓝牙低功耗概览  |  Android 开发者  |  Android Developers

关键术语——UUID

1、一个BLE设备包含多个服务,这些服务通过UUID来区分

2、一个服务包含1个或多个特征,这些特征也是通过UUID来区分

3、一个特征包含一个Value和多个描述符,一个描述符包含一个Value

核心对象

1、BluetoothDevice :蓝牙设备

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

2、BluetoothGatt:建立的连接

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

3、BluetoothGattCallback:连接回调

4、BluetoothGattService:服务

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

5、BluetoothGattCharacteristic:服务的特征

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

6、BluetoothGattDescriptor:特征的描述

一:主要步骤与思路

参考【Android -- 蓝牙】BLE 蓝牙开发入门_bluez gatt 发送数据-CSDN博客

1、权限问题:先判断手机是否满足android4.3以上版本,再判断手机是否开启蓝牙

主要涉及蓝牙权限和位置权限,注意不同android版本之间权限申请的差异,以及android权限动态申请和静态申请的区别

2、搜索蓝牙:搜索蓝牙,回调接口中查看ble设备相关信息,一定时间停止扫描

扫描设备是耗时的操作,一旦扫描结束,就要及时停止扫描。

3、连接蓝牙:首先获取到ble设备的mac地址,然后调用connect()方法进行连接

这里注意,连接之前一定要关闭扫描,否则会影响连接。BLE与经典蓝牙不同,经典蓝牙一旦建立连接,就可以进行数据通讯,而BLE建立连接之后,还需要发现系统服务,获取特定服务及读写特征

4、获取特征:蓝牙连接成功后,需要获取蓝牙的服务特征等,然后开启接收设置

一般,读特征是用来读取蓝牙设备发出来的数据,写特征是向蓝牙设备写入数据,其中,读特征一定要设置打开通知,否则接收不到消息

5、发送消息:writeCharacteristic()方法,发送数据给ble设备

mBluetoothGatt.writeCharacteristic()方法的返回值,并不能真正的表示数据是否发送成功,而是通过BluetoothGattCallback回调方法onCharacteristicWrite()来判断数据是否已成功写入底层

6、接收消息:通过蓝牙的回调接口中onCharacteristicRead()方法,接收蓝牙收的消息

接收的数据是直接通过BluetoothGattCallback回调方法onCharacteristicChanged()来获取的

7、释放资源:断开连接,关闭资源

BLE通讯结束之后,需要及时断开连接,并且在断开连接的回调处释放资源。否则会导致下一次执行连接操作时,导致133异常。所以,一般连接出现133异常,都是因为断开后及时释放资源

断开连接的结果是在BluetoothGattCallback回调方法onConnectionStateChange()来获取的。(可查看上面建立连接处的代码)

二:核心步骤与代码

三:我的项目使用实践

四:注意事项

1、注意Android的版本号

BLE是在Android 4.3(API 18)以后引入的,所以要进行BLE开发,必须在Android 4.3以上版本的机子上

2、MTU(最大传输单元)设置,即——分包

在Android BLE通信中,如果要发送的数据大小超过MTU(最大传输单元)的限制,就需要进行数据分包处理。BLE蓝牙一包数据最多为20字节,因此安卓系统下最好不要使用BLE蓝牙传输大量数据。以下是一种常见的方法来实现BLE数据分包发送:

获取MTU大小:

首先,通过调用BluetoothGatt对象的requestMtu()方法来请求MTU大小,例如:

val mtu = 20// 设置期望的MTU大小
bluetoothGatt.requestMtu(mtu)

数据分包发送:

由MTU大小将要发送的数据拆分成多个分包,并通过BluetoothGattCharacteristicsetValue()writeCharacteristic()方法进行发送

数据接收:

数据的接收端也需要对分包进行合并和处理,以确保正确接收和还原原始数据

五:参考文献

Android开发总结之低功耗蓝牙开发_android bluetoothgattcharacteristic.write_type_def-CSDN博客

【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)_安卓ble蓝牙-CSDN博客 【Android -- 蓝牙】BLE 蓝牙开发入门_bluez gatt 发送数据-CSDN博客

Android低功耗蓝牙(BLE)开发(二)_android 低功耗蓝牙-CSDN博客

避免133报错:

https://gitcode.csdn.net/65ed7ba11a836825ed79ae8e.html

https://pm-wsir.blog.csdn.net/article/details/90437218

当status出现非0错误码,解决方案如下:

https://blog.csdn.net/qq_38322527/article/details/121425886

六:连接失败分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值