一、简介:
此文档主要是介绍蓝牙双向通讯sdk的调用方法以及蓝牙双向传输的核心功能逻辑,用户可以根据需要自定义协议进行蓝牙双向通讯
二、SDK接入步骤:
1: 增加sdk库依赖:
a)libs文件夹下增加sdk依赖库
b)应用app目录下gradle文件增加如下代码:

2:权限申请
//要申请的权限
private String[] mPermissions = {Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
3: 蓝牙基本信息初始化:
a)参数:
参数1. 上下文环境
参数2. 回调callback
参数3.是否是作为被连接端(true ? 被连接端 :连接端)
b)callback回调
callback result -> 获取初始化默认蓝牙连接的状态
callback notify -> 获取实时可搜索到的蓝牙设备信息

4: 蓝牙连接:
a) 参数
参数1:蓝牙Mac地址,可从上面方法的列表项获取
参数2:回调callback【蓝牙连接成功与否】

5: 蓝牙数据接收
5.1【蓝牙设备作为主动连接端】
a)串口持续接收所有数据【前提是蓝牙连接成功】

b) 解析有效数据【数据域】--> 数据类型可自定义

c)有效数据的传输类型【根据需要自定义】,例如,如下这样形式:

5.2:【 蓝牙设备作为被连接端】
a) 初始化方法最后一个参数要传入true

b) 蓝牙被连接【方法和5.1不一样,但回调里面的处理(5.1.a/5.1.b/5.1.c)一致】

7: 蓝牙数据发送:
a)参数
参数1:需要发送的数据【String类型】
参数2:发送数据传输的类型【自定义】【和上面接收端的类型相互协定匹配好即可】

b) 数据源的监听:【可不加】【方便调试】

三、Sdk核心功能介绍:
Sdk核心功能主要包含:蓝牙设备获取、蓝牙连接、蓝牙数据发送(封包)、蓝牙数据接收(解包)
1.蓝牙设备获取:
a)注册蓝牙相关的广播

b) 监听
BluetoothDevice.
ACTION_FOUND

2.蓝牙连接:
android 蓝牙之间可以通过SDP协议建立连接进行通信,通信方式类似于平常使用socket。
蓝牙连接分为连接端和被连接端,这两边的处理有一定区别:
a)连接端:
关键在于获取BluetoothSocket,而不同平台或不同芯片厂商的获取方式有一定区别,但无外乎以下两种:
(1)mBtSocket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid);
(2)mBtSocket = (BluetoothSocket) bluetoothDevice.getClass().getMethod(
"createRfcommSocket",new Class[]{int.class}).invoke(bluetoothDevice, 1);
除此之外,socket的连接方法需要放到新的线程处理,不然会有很大概率被串口占用,导致连接失败

下面是蓝牙连接方法:

b)被连接端【或服务端】:
需要注意被连接端与连接端的处理机制有所区别,被连接端的蓝牙的socket获取方法如下:
{
BluetoothAdapter中提供了两种创建BluetoothServerSocket 方式,
如下注释的为创建安全的RFCOMM Bluetooth socket,该连接是安全的需要进行配对。
而通过listenUsingInsecureRfcommWithServiceRecord创建的
RFCOMM Bluetooth socket是不安全的,连接时不需要进行配对。
其中的uuid需要服务器端和客户端进行统一
}

mServerSocket通过accept()等待客户端的连接(阻塞),直到连接成功或失败。
最终需要拿到的是上图的mBtSocket.
3.蓝牙数据发送:
蓝牙发送的核心在于拿到蓝牙连接成功后的Socket,然后获取输入、输出流。
通过输入流的write方法进行写入;
但为了数据的合理解析,需要增加封包的过程【与解包相对应】;
a)发送接口方法:

b)封包:
封包就是将数据源通过和接收端商量协定好规则,根据一定的格式进行数据封装

封包方法:【7E头、数据长度(占两个字节)、数据类型、数据域、7E尾】

4.蓝牙数据接收:
通过输入流的read方法进行写入,通过协议规则进行解包【与封包相对应】;
a)接收接口方法:

b)解包方法:【最终解析出数据域以及数据类型】


c)数据域解析
最终释放一个<key,value>的哈希值给用户,用户通过协议规则通过数据类型进行解析有效数据:

d) 根据数据类型处理有效数据:

demo 以及 sdk下载链接:
链接:
https://pan.baidu.com/s/1RL2EMKi253TYXmgOTxnMYw
提取码:x4f9
提取码:x4f9