Android蓝牙客户端,支持经典蓝牙和低功耗蓝牙BLE,增加协程Flow扩展版本

BluetoothClient

Android蓝牙客户端,支持经典蓝牙和低功耗蓝牙BLE,增加协程Flow扩展版本CoroutineClient,适配最新Android系统版本

  • 支持蓝牙权限自动检测、申请
  • 支持失败自动重连、重发、重读
  • 支持设置重试次数(协程版本暂不支持)
  • 支持设置超时时间
  • 支持连接设备后指定serviceUid,修改mtu
  • 支持BLE设置多个notifyUid监听数据
  • 支持ChannelFlow

Demo

Compose版蓝牙助手,基于当前库开发: https://github.com/zhzc0x/BluetoothAssistant

使用

添加gradle依赖

repositories {
    mavenCentral()
}

dependencies {
    implementation("com.zhzc0x.bluetooth:client-android:1.0.1")
}

代码示例

val bluetoothClient = BluetoothClient(context, ClientType.BLE\ClientType.CLASSIC, serviceUid)
bluetoothClient.startScan(30000, onEndScan={
    //子线程
    ......
}){ device ->
    //子线程
    ......
}
bluetoothClient.connect(device, mtu){ connectState ->
    //子线程
    if(connectState == ConnectState.CONNECTED){
        ......
    }  
}
//协程版本
val bluetoothClient = CoroutineClient(context, ClientType.BLE\ClientType.CLASSIC, serviceUid)
lifecycleScope.launch {
     bluetoothClient.startScan(30000, onEndScan={
         //主线程
        ......
     }).collect{ device ->
        //此处线程取决于FLow.collect所在的线程
        ......
    }
}
lifecycleScope.launch {
    bluetoothClient.connect(device, 85, 15000).collect{ connectState ->
         //此处线程取决于FLow.collect所在的线程
        if(connectState == ConnectState.CONNECTED){
            ......
        }                                                   
    }          
}

API说明

/**                                                          
 * 检查设备蓝牙状态                                                  
 * @param toNext: true 如无蓝牙权限则继续请求权限,如设备蓝牙未开启则继续请求打开,如未开启定位开关(Android12以下需要)则前往设置;
 *                false 无操作
 * @return ClientState: NOT_SUPPORT, NO_PERMISSIONS, LOCATION_DISABLE, ENABLE, DISABLE                                       
 * @see com.zhzc0x.bluetooth.client.ClientState              
 * */                                                        
fun checkState(toNext: Boolean = true): ClientState

/** 设置蓝牙开关状态通知 */                                             
fun setSwitchReceive(turnOn: () -> Unit, turnOff: () -> Unit)

/**                                                                                
 * 开关蓝牙                                                                            
 * 此系统方法在 API 级别 33 中已弃用。从 Build.VERSION_CODES.TIRAMISU 开始,不允许应用程序启用/禁用蓝牙并总是返回false
 * */                                                                              
fun switch(enable: Boolean): Boolean

/**                                                                                                 
 * 开始扫描设备                                                                                           
 * @param timeMillis:扫描时长                                                                           
 * @param onEndScan:扫描结束回调                                                                          
 * @param deviceCallback:ScanDeviceCallback.call(Device):                                           
 * @See com.zhzc0x.bluetooth.client.Device                                                          
 * @See com.zhzc0x.bluetooth.client.ScanDeviceCallback                                              
 *                                                                                                  
 * */                                                                                               
@JvmOverloads                                                                                       
fun startScan(timeMillis: Long, onEndScan: (() -> Unit)? = null, deviceCallback: ScanDeviceCallback)

/** 停止扫描设备 */         
fun stopScan()

/**                                                                                           
 * 连接蓝牙设备                                                                                     
 * @param device: startScan返回的Device                                                          
 * @param mtu: IntRange(23..512)                                                              
 * @param timeoutMillis: 连接超时时间,默认6000ms,超时后回调ConnectState.CONNECT_TIMEOUT                    
 * @param reconnectCount: 失败重连次数,默认3次,0不重连                                                    
 * @param stateCallback: 回调ConnectState                                                       
 *                                                                                            
 * @throws IllegalArgumentException("The mtu value must be in the 23..512 range") 
 * */                                                                                         
@JvmOverloads                                                                                 
fun connect(device: Device, mtu: Int = 0, timeoutMillis: Long = 6000, reconnectCount: Int = 3, stateCallback:       ConnectStateCallback)

/**                                    
 * 修改mtu                               
 * @param mtu: IntRange(23..512)       
 *                                     
 * @return Boolean: true修改成功, false修改失败
 *                                     
 * @throws IllegalArgumentException("The mtu value must be in the 23..512 range")
 * */                                  
fun changeMtu(mtu: Int): Boolean

/**                    
 * 获取支持的 services      
 *                     
 * @return List<Service
 * @seecom.zhzc0x.bluetooth.client.Service  
 * */                  
fun supportedServices(): List<Service>

/**                                
 * 指定 Service                      
 * @param service 通过supportedServices()方法返回的Service
 * @see com.zhzc0x.bluetooth.client.Service
 *                                 
 * */                              
fun assignService(service: Service)

/**                                                                                      
 * 设置写特征类型                                                                               
 * @param type:默认-1不设置,其他值同 WRITE_TYPE_DEFAULT, WRITE_TYPE_NO_RESPONSE, WRITE_TYPE_SIGNED
 * @see android.bluetooth.BluetoothGattCharacteristic                                    
 *                                                                                       
 * */                                                                                    
fun setWriteType(type: Int)

/**                                                                                       
 * 设置数据接收                                                                                 
 * @param uuid:低功耗蓝牙传入包含notify特征的uuid,经典蓝牙不需要传                                            
 * @param onReceive(ByteArray)                                                            
 *                                                                                        
 * @return Boolean:true设置成功,false设置失败                                                     
 * */                                                                                     
@JvmOverloads                                                                             
fun receiveData(uuid: UUID? = null, @WorkerThread onReceive: (ByteArray) -> Unit): Boolean

/**                                                                          
 * 发送数据                                                                      
 * @param uuid:低功耗蓝牙传入包含write特征的uuid,经典蓝牙不需要传                                
 * @param data: ByteArray                                                    
 * @param timeoutMillis: 发送超时时间,默认3000ms                                     
 * @param resendCount: 失败重发次数,默认3次,0不重发                                      
 * @param callback: 回调发送结果DataResultCallback.call(Boolean,ByteArray)         
 * @see com.zhzc0x.bluetooth.client.DataResultCallback                       
 *                                                                           
 * */                                                                        
@JvmOverloads                                                                
fun sendData(uuid: UUID? = null, data: ByteArray, timeoutMillis: Long = 3000, resendCount: Int = 3, callback:       DataResultCallback)

/**                                                                               
 * 读取数据                                                                           
 * @param uuid:低功耗蓝牙传入包含read特征的uuid,经典蓝牙不需要传                                      
 * @param timeoutMillis: 读取超时时间,默认3000ms                                          
 * @param rereadCount: 失败重读次数,默认3次,0不重读                                           
 * @param callback: 回调读取结果DataResultCallback.call(Boolean,ByteArray)              
 * @see com.zhzc0x.bluetooth.client.DataResultCallback                            
 *                                                                                
 * */                                                                             
@JvmOverloads                                                                     
fun readData(uuid: UUID? = null, timeoutMillis: Long = 3000, rereadCount: Int = 3, callback: DataResultCallback)

/** 断开蓝牙设备 */           
fun disconnect()

/** 释放资源 */        
fun release()

欢迎大家点赞评论,多提Issues github.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容