# Bluetooth
**Repository Path**: coderfy/Bluetooth
## Basic Information
- **Project Name**: Bluetooth
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-06-02
- **Last Updated**: 2021-08-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Bluetooth
## 该库的特点
1. 内部集成了多种蓝牙芯片的操作,能兼容几乎市面上所有的蓝牙设备;
2. 支持低功耗蓝牙和传统蓝牙;
3. 支持设置低功耗蓝牙的高速传输模式;
4. 实现了蓝牙的重发机制;
5. 实现了蓝牙的同异步发送数据;
6. 实现了协议基类封装,开发者可以快速扩展自己的协议;
**注意:部分Android6.0以上的手机需要定位权限才能正常使用蓝牙功能**
## 库地址
[  ](https://bintray.com/luopeiqin/maven/bluetooth/1.0.2/link)
```
implementation 'com.stag:bluetooth:1.0.2'
```
## 蓝牙搜索自定义View
项目中增加了蓝牙搜素的自定义View,方便你快速的实现项目
### 自定义View包含的内容
1. 根据蓝牙的信号强度排序和显示;
2. 有搜素或连接的历史记录功能(做小部分配置即可实现);
## 蓝牙基本操作相关接口说明
> **调用的类为com.stag.bluetooth.BluetoothControl.java**
### 获取单例对象
```java
BluetoothController mController = BluetoothController.getController(this);
```
### 注册蓝牙状态监听
```java
mController.registerBluetoothStateChangeListener(new OnBluetoothStateChangeListener() {
@Override
public void onBluetoothOpen() {
LogUtils.i(TAG + "lpq", "onBluetoothOpen: 蓝牙打开");
}
@Override
public void onBluetoothClose() {
LogUtils.i(TAG + "lpq", "onBluetoothClose: 蓝牙关闭");
}
});
```
### 注册蓝牙连接状态变化监听
```java
mController.registerConnectStateChangeListener(new OnBluetoothConnectStateChangeListener() {
@Override
public void onBluetoothConnect(BluetoothDevice device, boolean isSuccess) {
if (isSuccess) {
LogUtils.i(TAG + "lpq", "onBluetoothConnect: 蓝牙已连接");
} else {
LogUtils.i(TAG + "lpq", "onBluetoothConnect: 蓝牙连接失败");
}
}
@Override
public void onBluetoothDisconnect(BluetoothDevice device) {
LogUtils.i(TAG + "lpq", "onBluetoothDisconnect: 蓝牙已断开");
}
});
```
### 切换蓝牙类型
```java
mController.setBluetoothType(BluetoothType.BLE); // 低功耗蓝牙
mController.setBluetoothType(BluetoothType.TRADITION); // 传统蓝牙
```
### 搜索蓝牙
```java
mController.startScan(new OnBluetoothScanListener() {
@Override
public void onBluetoothScanFindDevice(BluetoothDevice device, int rssi) {
LogUtils.i(TAG + "lpq", "onBluetoothScanFindDevice: " + device.getAddress());
}
@Override
public void onBluetoothScanFinish() {
LogUtils.i(TAG + "lpq", "onBluetoothScanFinish: ");
}
});
```
### 停止搜索蓝牙
```java
mController.stopScan();
```
### 连接蓝牙与断开蓝牙连接
```java
mController.connect("0C:B2:B7:3E:23:60"); //连接蓝牙,参数为蓝牙MAC地址
mController.disconnect(); //断开连接
```
### 低功耗蓝牙时开启高速模式
```java
mController.setBleHighSpeedMode(true);
```
不一定100%成功,由蓝牙设备与App设备蓝牙的最低MTU决定。
### 取消注册监听回调
```java
@Override
protected void onDestroy() {
super.onDestroy();
if (mController != null) {
mController.unregisterBluetoothStateChangeListener();
mController.unregisterConnectStateChangeListener();
}
}
```
## 蓝牙收发数据重点说明
### 方式一:继承蓝牙内置协议
```java
public abstract class Protocol {
public final static int BLE_MAX_SEND_INTERVAL = 500;
protected Context mContext;
private T mEventListener;
private Object mData;
private int mMaxBleSendInterval = BLE_MAX_SEND_INTERVAL;
/**
* 协议所特有的主动事件监听
*/
protected Protocol(Context context) {
this(context, null);
}
/**
* 协议所特有的主动事件监听
*/
protected Protocol(Context context, T listener) {
mContext = context.getApplicationContext();
mEventListener = listener;
}
/**
* 发送包处理成最终要发送的字节数据
*/
public abstract byte[] packetToBytes(E packet);
/**
* 解析收到的字节处理成结果
*/
public abstract ParseResult parse(byte[] data);
/**
* 获取协议类型
* */
public abstract int getType();
/**
* 是否设置了主动事件监听
* */
protected boolean haveSetEventListener(){
return mEventListener!=null;
}
······
}
```
#### 内置协议简要说明
上述抽象类中屏蔽了部分内容,我们主要看几个重点:
1. **packetToBytes** 和 **parse**是用户层面发送数据的最终端和接收数据的最初端,您可以根据自己蓝牙协议的需要来重写方法,创建自己的协议类;
2. **getType**是用来支持App需要同时支持多个蓝牙协议的情况的;
3. **mEventListener**用于接收蓝牙设备主动上报的一些状态;
#### 设置蓝牙传输协议
> 该方法是与蓝牙设备操作相关的方法,而且必须在连接蓝牙设备之前设置
```java
mController.setProtocol(new Protocol(this, this));
```
#### 创建异步发送数据任务
```java
BluetoothTask task = new BluetoothTask(new Packet(cmd, data), new BluetoothTask.OnDataResultListener() {
@Override
public void onResult(boolean isTimeout, byte[] data) {
//数据接收回调,异步时使用
}
});
task.setTimeout(2000); //设置超时时间
task.setTryCount(1); //设置重发次数
task.send(); //异步发送数据
```
#### 创建同步发送数据任务
```java
BluetoothTask task = new BluetoothTask(new Packet(cmd, data));
task.setTimeout(2000); //设置超时时间
task.setTryCount(1); //设置重发次数
byte[] result = task.sendBySync2(); //同步发送数据
```
### 方式二:原始数据收发
如果方式一没有办法满足你的要求,那么我也提供方式二来供你选择
#### 设置原始数据收发监听
```java
mController.registerTransmitListener(new OnBluetoothTransmitListener() {
@Override
public void onBluetoothSendData(byte[] data) {
// 发送数据
}
@Override
public void onBluetoothRecvData(byte[] data) {
// 接收数据
}
});
```
#### 发送数据
```java
mController.sendData(new byte[]{});
```