# EasyBluetoothFrame
**Repository Path**: 705174710/EasyBluetoothFrame
## Basic Information
- **Project Name**: EasyBluetoothFrame
- **Description**: 经典(传统)蓝牙快速开发框架,A fast develop frame of classic bluetooth
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2020-03-23
- **Last Updated**: 2023-10-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## EasyBluetoothFrame
这是一个适用于经典蓝牙通讯的快速开发框架。
### 框架适用范围
本框架只适用于支持蓝牙3.0协议的设备进行数据连接传输,也就是通常说的经典蓝牙,通常手机与手机之间的连接都属于经典蓝牙模式范畴,而一般连接外设耳机等设备,大多
属于BLE蓝牙(低功耗蓝牙),这两种蓝牙除了名字有相同之外,通信方式、原理、协议完全不一样。
### 导入
> **version=**[](https://jitpack.io/#AlexLiuSheng/EasyBluetoothFrame)
```
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
dependencies {
implementation 'com.github.AlexLiuSheng:EasyBluetoothFrame:version'
}
```
### 蓝牙连接流程
---
经典蓝牙采用C/S模式,所以同一个设备,只能作为Client端或者Server端的其中一个,
- 如果设备充当Server端,那么监听流程如下:
- 蓝牙权限获取
- 设置设备可被发现
- 设置监听UUID
- 注册为Server
- 等待配对、连接、传输数据
- 如果设备充当Client,本框架蓝牙的连接流程一般为:
- 蓝牙权限获取
- 扫描设备
- 配对、绑定设备
- 建立连接
- 传输数据
### 蓝牙权限获取
可以使用库`BluetoothPermissionHandler`来辅助获取蓝牙权限或者开发者自己动态获取权限,`BluetoothPermissionHandler`用法如下:
```
private val permissionCallBack=BluetoothPermissionHandler(this,this)
override fun onCreate(savedInstanceState: Bundle?) {
permissionCallBack.start();
}
override fun permissionFailed() {
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
permissionCallBack.onActivityResult(requestCode, resultCode, data)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
permissionCallBack.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
override fun onBlueToothEnabled() {
}
```
### 初始化以及相关方法
---
- 初始化操作可以放到任何地方
`BleManager.getInstance().init(application)`
- 使用前台service传输数据
`BleManager.getInstance().setForegroundService(true)`
- 如果使用ForegroundService模式,可自定义通知栏
`BleManager.getInstance().setNotification(notification)`
- 获取所有配对过的设备
`BleManager.getInstance().getPairedDevices()`
## 连接
不管是服务端还是客户端都需要获取蓝牙权限,并且进行初始化BleManager。如果使用`BluetoothPermissionHandler`,应该在`onBlueToothEnabled`回调中做
扫描连接等操作。
### 设置为Server端
---
#### 设置UUID
默认使用`00001101-0000-1000-8000-00805F9B34FB`,当然可以自定义
```
BleManager.getInstance().setConnectionUUID()
```
#### 设置设备可被扫描发现
传入参数为可被发现的时间,单位秒
```
BleManager.getInstance().enableDiscoverable(300)
```
#### 注册为Server
注册为Server端之后,当有设备连接成功后,会回调`connectSuccess`方法,我们可以保存回调回来的
`Connect`为全局,方便读写操作
```
BleManager.getInstance().registerServerConnection(object: ConnectResultlistner {
override fun connectSuccess(connect: Connect?) {
this@MainActivity.connect=connect
read()
}
override fun connectFailed(e: Exception?) {
}
})
```
### 设置为Client端
---
#### 扫描设备
配置扫描时间,然后扫描,在扫描回调中,通常操作是将回调的蓝牙设备添加到列表并显示,需要注意的是,回调的蓝牙设备可能会**重复**,因此需要手动去重
```
//配置扫描时间
val config=ScanConfig(5000)
BleManager.getInstance().scan(config,object :ScanResultListener{
override fun onDeviceFound(device: BluetoothDevice?) {
}
override fun onFinish() {
}
override fun onError() {
}
})
```
#### 设置UUID
默认使用`00001101-0000-1000-8000-00805F9B34FB`,当然可以自定义
```
BleManager.getInstance().setConnectionUUID()
```
#### 配对(如果已经配对,跳过此步)
如果没有配对,需要先进行设备配对,如果已经配对,那么可以直接进行连接操作
判断是否已经配对,可以用`BleManager.getInstance().getPairedDevices()`返回的集合进行判断
配对代码如下:
```
BleManager.getInstance().pin(data[p1],object:PinResultListener{
override fun paired(device: BluetoothDevice?) {
connect(context,data[p1])
}
override fun startPair(device: BluetoothDevice?) {
super.startPair(device)
}
override fun pairing(device: BluetoothDevice?) {
super.pairing(device)
}
override fun pairFailed(device: BluetoothDevice?) {
super.pairFailed(device)
}
})
```
#### 连接Server
当有设备连接成功后,会回调`connectSuccess`方法,我们可以保存回调回来的
`Connect`为全局,方便读写操作
```
BleManager.getInstance().connect(d, object : ConnectResultlistner {
override fun connectSuccess(connect: Connect?) {
}
override fun connectFailed(e: Exception?) {
}
})
```
### 传输数据
#### **NewFeature自定义一个完整数据包包头、包尾**
```
connect?.setReadPacketVerifyListener(object : PacketDefineListener {
override fun getPacketStart(): ByteArray {
return start
}
override fun getPacketEnd(): ByteArray {
return end
}
})
```
#### 读
```
connect?.read(object: TransferProgressListener {
override fun transferSuccess(bytes: ByteArray?) {
bytes?.let { it1 ->
tvReceive.text=String(it1)
}
CLog.e("read string")
}
override fun transferFailed(msg:String) {
t(msg)
}
override fun transfering(progress: Int) {
CLog.e("read progress:$progress")
}
})
```
#### 写
```
connect?.write(text.toByteArray(), object : TransferProgressListener {
override fun transferSuccess(bytes: ByteArray?) {
}
override fun transferFailed(msg:String) {
t(msg)
}
override fun transfering(progress: Int) {
CLog.e("write progress:$progress")
}
})
```
### 断开连接
```
BleManager.getInstance().destory()
```
## API Function
所有功能接口
```
void init(Context context);
void setConnectionUUID(String uuid);
boolean isSupported();
void setResultListener(ScanResultListener resultListener);
Set getPairedDevices();
void scan(ScanConfig scanConfig, ScanResultListener scanResultListener);
void stopSearch();
void connect(BluetoothDevice device, ConnectResultlistner connectResultlistner);
void destory();
void pin(BluetoothDevice device, PinResultListener resultListener);
void cancelPin(BluetoothDevice device, ResultListener resultListener);
void setServerConnectResultListener(ConnectResultlistner connectResultListener);
void registerServerConnection(ConnectResultlistner connectResultListener);
void setForegroundService(boolean foregroundService);
void setNotification(Notification notification);
void enableDiscoverable(long time);
```
## demo
## TODO
- [ ] 传输数据进度完善
## Last
- 详细适用请看demo,第一版可能还有些不完善,持续完善中
- 欢迎PR或Issues
- 如果使用过程中觉得还不错,请不要吝啬你的star,哈哈。
## License
---
Apache 2.0