区别
低功耗蓝牙又叫ble蓝牙,本文会用ble代替低功耗蓝牙(偷懒)
通用配置
要申请的权限
注意:android6.0以上还需要申请运行时权限
初始代码
传统蓝牙
简介
传统蓝牙的操作很像平时用的Socket通讯。连接需要验证uuid和设备配对(可选),当服务端和客户端在同一 RFCOMM 通道上分别拥有已连接的 BluetoothSocket 时,二者将被视为彼此连接。 这种情况下,每台设备都能获得输入和输出流式传输,并且可以开始传输数据,传输数据主要就是读写BluetoothSocket的输入输出流。如果两台设备之前尚未配对,则在连接过程中,Android 框架会自动向用户显示配对请求通知或对话框。因此,在尝试连接设备时,您的应用无需担心设备是否已配对。 您的 RFCOMM 连接尝试将被阻塞,直至用户成功完成配对或配对失败。
——参考Android开发文档
作为客户端
扫描设备
|
|
客户端获取BluetoothSocket
|
|
服务端
打开可被发现
|
|
监听连接状态获取BluetoothSocket
通过调用accept()开始监听连接请求。
这一个阻塞调用。在一个连接被接受或一个异常出现时,它将会返回。只有当一个远程设备使用一个UUID发送了一个连接请求,并且该UUID和正在监听的服务器socket注册的UUID相匹配时,一个连接才会被接受。成功后,accept() 将会返回一个已连接的 BluetoothSocket。
调用close(),除非你想要接受更多的连接。这将释放服务器socket和它所有的资源,但是不会关闭 accept()返回的已连接的 BluetoothSocket。不同于TCP/IP,RFCOMM仅仅允许每一个通道上在某一时刻只有一个已连接的客户端,因此在大多数情况下在接受一个已连接的socket后,在BluetoothServerSocket上调用 close() 是非常必要的。
accept() 不应该再主活动UI线程上执行,因为它是一个阻塞调用,并且将会阻止任何与应用的交互行为。它通常在你的应用管理的一个新的线程中使用一个BluetoothServerSocket 或 BluetoothSocket 来完成所有工作。为了中止一个阻塞调用,例如accept(),从你的其他线程里在BluetoothServerSocket (或 BluetoothSocket) 上调用 close() ,然后阻塞调用就会立即返回。注意在 BluetoothServerSocket 或 BluetoothSocket 上所有的方法都是线程安全的。
——参考Android开发文档
数据传输部分
|
|
BLE
简介
作为ble客户端系统需要android 4.3,而作为服务端则需要android5.0以上。ble的mac不是固定的。
GATT(通用属性配置)定义了一系列程序用来发现服务、特征、服务之间的关系 ,以及用来读取和写入特征值。
参数 | 说明 |
---|---|
规范(Profile) | 规范是由一个或多个服务构成结合成实现某一个特定的功能 |
服务(Service) | 服务是一种或多种特征的集合,服务可分为两种类型:主要服务和次要服务。主要服务主要用来公开这个设备的基本可用功能。次要服务仅用来被主要服务其它次要服务所引用,为设备提供额外功能, |
特征(Characteristic) | 特征是一种或多种属性的集合,特征定义包括特征声明(Properties)、特征值(Value)也可以包含一个或多个特征描述符(Descriptor) |
特征声明(Properties) | 特征说明用来表面特征的相关属性 UUID 属性等 |
特征值(Value) | 该特征返回的数据 |
特征描述符(Descriptor) | 用来描述特征值的权限,计量单位等 |
客户端
扫描设备
|
|
连接设备
|
|
服务端
广播数据
|
|
开启服务
|
|
总结
相对于传统蓝牙 ble google官方文档和例子都感觉没讲的很清楚。坑比较多在此记录下。
2019年新年快乐~