Android藍(lán)牙客戶端,支持經(jīng)典藍(lán)牙和低功耗藍(lán)牙BLE,增加協(xié)程Flow擴(kuò)展版本

BluetoothClient

Android藍(lán)牙客戶端,支持經(jīng)典藍(lán)牙和低功耗藍(lán)牙BLE,增加協(xié)程Flow擴(kuò)展版本CoroutineClient,適配最新Android系統(tǒng)版本

  • 支持藍(lán)牙權(quán)限自動檢測、申請
  • 支持失敗自動重連、重發(fā)、重讀
  • 支持設(shè)置重試次數(shù)(協(xié)程版本暫不支持)
  • 支持設(shè)置超時時間
  • 支持連接設(shè)備后指定serviceUid,修改mtu
  • 支持BLE設(shè)置多個notifyUid監(jiān)聽數(shù)據(jù)
  • 支持ChannelFlow

Demo

Compose版藍(lán)牙助手,基于當(dāng)前庫開發(fā): 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){
        ......
    }  
}
//協(xié)程版本
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說明

/**                                                          
 * 檢查設(shè)備藍(lán)牙狀態(tài)                                                  
 * @param toNext: true 如無藍(lán)牙權(quán)限則繼續(xù)請求權(quán)限,如設(shè)備藍(lán)牙未開啟則繼續(xù)請求打開,如未開啟定位開關(guān)(Android12以下需要)則前往設(shè)置;
 *                false 無操作
 * @return ClientState: NOT_SUPPORT, NO_PERMISSIONS, LOCATION_DISABLE, ENABLE, DISABLE                                       
 * @see com.zhzc0x.bluetooth.client.ClientState              
 * */                                                        
fun checkState(toNext: Boolean = true): ClientState

/** 設(shè)置藍(lán)牙開關(guān)狀態(tài)通知 */                                             
fun setSwitchReceive(turnOn: () -> Unit, turnOff: () -> Unit)

/**                                                                                
 * 開關(guān)藍(lán)牙                                                                            
 * 此系統(tǒng)方法在 API 級別 33 中已棄用。從 Build.VERSION_CODES.TIRAMISU 開始,不允許應(yīng)用程序啟用/禁用藍(lán)牙并總是返回false
 * */                                                                              
fun switch(enable: Boolean): Boolean

/**                                                                                                 
 * 開始掃描設(shè)備                                                                                           
 * @param timeMillis:掃描時長                                                                           
 * @param onEndScan:掃描結(jié)束回調(diào)                                                                          
 * @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)

/** 停止掃描設(shè)備 */         
fun stopScan()

/**                                                                                           
 * 連接藍(lán)牙設(shè)備                                                                                     
 * @param device: startScan返回的Device                                                          
 * @param mtu: IntRange(23..512)                                                              
 * @param timeoutMillis: 連接超時時間,默認(rèn)6000ms,超時后回調(diào)ConnectState.CONNECT_TIMEOUT                    
 * @param reconnectCount: 失敗重連次數(shù),默認(rèn)3次,0不重連                                                    
 * @param stateCallback: 回調(diào)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)

/**                                                                                      
 * 設(shè)置寫特征類型                                                                               
 * @param type:默認(rèn)-1不設(shè)置,其他值同 WRITE_TYPE_DEFAULT, WRITE_TYPE_NO_RESPONSE, WRITE_TYPE_SIGNED
 * @see android.bluetooth.BluetoothGattCharacteristic                                    
 *                                                                                       
 * */                                                                                    
fun setWriteType(type: Int)

/**                                                                                       
 * 設(shè)置數(shù)據(jù)接收                                                                                 
 * @param uuid:低功耗藍(lán)牙傳入包含notify特征的uuid,經(jīng)典藍(lán)牙不需要傳                                            
 * @param onReceive(ByteArray)                                                            
 *                                                                                        
 * @return Boolean:true設(shè)置成功,false設(shè)置失敗                                                     
 * */                                                                                     
@JvmOverloads                                                                             
fun receiveData(uuid: UUID? = null, @WorkerThread onReceive: (ByteArray) -> Unit): Boolean

/**                                                                          
 * 發(fā)送數(shù)據(jù)                                                                      
 * @param uuid:低功耗藍(lán)牙傳入包含write特征的uuid,經(jīng)典藍(lán)牙不需要傳                                
 * @param data: ByteArray                                                    
 * @param timeoutMillis: 發(fā)送超時時間,默認(rèn)3000ms                                     
 * @param resendCount: 失敗重發(fā)次數(shù),默認(rèn)3次,0不重發(fā)                                      
 * @param callback: 回調(diào)發(fā)送結(jié)果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)

/**                                                                               
 * 讀取數(shù)據(jù)                                                                           
 * @param uuid:低功耗藍(lán)牙傳入包含read特征的uuid,經(jīng)典藍(lán)牙不需要傳                                      
 * @param timeoutMillis: 讀取超時時間,默認(rèn)3000ms                                          
 * @param rereadCount: 失敗重讀次數(shù),默認(rèn)3次,0不重讀                                           
 * @param callback: 回調(diào)讀取結(jié)果DataResultCallback.call(Boolean,ByteArray)              
 * @see com.zhzc0x.bluetooth.client.DataResultCallback                            
 *                                                                                
 * */                                                                             
@JvmOverloads                                                                     
fun readData(uuid: UUID? = null, timeoutMillis: Long = 3000, rereadCount: Int = 3, callback: DataResultCallback)

/** 斷開藍(lán)牙設(shè)備 */           
fun disconnect()

/** 釋放資源 */        
fun release()

歡迎大家點贊評論,多提Issues github.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容