MCPcopy Index your code
hub / github.com/SunOfBeach2/EasyBluetoothFrame

github.com/SunOfBeach2/EasyBluetoothFrame @1.0.4

Chat with this repo
repository ↗ · DeepWiki ↗ · release 1.0.4 ↗ · + Follow
177 symbols 351 edges 28 files 25 documented · 14% updated 4y ago1.0.4 · 2019-08-27★ 1047 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

EasyBluetoothFrame

这是一个适用于经典蓝牙通讯的快速开发框架。

框架适用范围

本框架只适用于支持蓝牙3.0协议的设备进行数据连接传输,也就是通常说的经典蓝牙,通常手机与手机之间的连接都属于经典蓝牙模式范畴,而一般连接外设耳机等设备,大多 属于BLE蓝牙(低功耗蓝牙),这两种蓝牙除了名字有相同之外,通信方式、原理、协议完全不一样。

导入

version=

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<BluetoothDevice> 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

Extension points exported contracts — how you extend this code

BleFunction (Interface)
@author AllenLiu @date 2019/5/8 [2 implementers]
classicbt/src/main/java/com/allenliu/classicbt/listener/BleFunction.java
PacketDefineListener (Interface)
@author AllenLiu @date 2019/8/26 [1 implementers]
classicbt/src/main/java/com/allenliu/classicbt/listener/PacketDefineListener.java
BluetoothPermissionCallBack (Interface)
@author AllenLiu @version 1.0 @date 2019/5/27 [1 implementers]
classicbt/src/main/java/com/allenliu/classicbt/listener/BluetoothPermissionCallBack.java
TransferProgressListener (Interface)
author : AllenLiu date : 2019/5/10 5:49 PM desc : [1 implementers]
classicbt/src/main/java/com/allenliu/classicbt/listener/TransferProgressListener.java
ConnectResultlistner (Interface)
@author AllenLiu @version 1.0 @date 2019/5/8 [1 implementers]
classicbt/src/main/java/com/allenliu/classicbt/listener/ConnectResultlistner.java

Core symbols most depended-on inside this repo

getInstance
called by 13
classicbt/src/main/java/com/allenliu/classicbt/BleManager.java
e
called by 11
classicbt/src/main/java/com/allenliu/classicbt/CLog.java
cancel
called by 6
classicbt/src/main/java/com/allenliu/classicbt/Connect.java
start
called by 6
classicbt/src/main/java/com/allenliu/classicbt/ConnectService.java
t
called by 5
app/src/main/java/com/allenliu/btdemo/Loading.kt
handleFailed
called by 4
classicbt/src/main/java/com/allenliu/classicbt/ConnectedThread.java
afterGrantedPermissions
called by 4
classicbt/src/main/java/com/allenliu/classicbt/BluetoothPermissionHandler.java
setTransferProgressListener
called by 3
classicbt/src/main/java/com/allenliu/classicbt/ConnectedThread.java

Shape

Method 142
Class 19
Interface 9
Function 7

Languages

Java79%
Kotlin21%

Modules by API surface

classicbt/src/main/java/com/allenliu/classicbt/BleManager.java25 symbols
app/src/main/java/com/allenliu/btdemo/MainActivity.kt22 symbols
classicbt/src/main/java/com/allenliu/classicbt/listener/BleFunction.java17 symbols
classicbt/src/main/java/com/allenliu/classicbt/ConnectedThread.java13 symbols
classicbt/src/main/java/com/allenliu/classicbt/ConnectService.java9 symbols
classicbt/src/main/java/com/allenliu/classicbt/BluetoothPermissionHandler.java9 symbols
app/src/main/java/com/allenliu/btdemo/MyAdapter.kt9 symbols
classicbt/src/main/java/com/allenliu/classicbt/ConnectThread.java8 symbols
classicbt/src/main/java/com/allenliu/classicbt/Connect.java8 symbols
classicbt/src/main/java/com/allenliu/classicbt/BtReceiver.java7 symbols
classicbt/src/main/java/com/allenliu/classicbt/listener/PinResultListener.java5 symbols
classicbt/src/main/java/com/allenliu/classicbt/scan/ScanTimer.java4 symbols

For agents

$ claude mcp add EasyBluetoothFrame \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact