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