EasyBluetoothFrame
這是一個(gè)適用于經(jīng)典藍(lán)牙通訊的快速開發(fā)框架讥邻。
框架適用范圍
本框架只適用于支持藍(lán)牙3.0協(xié)議的設(shè)備進(jìn)行數(shù)據(jù)連接傳輸汗盘,也就是通常說(shuō)的經(jīng)典藍(lán)牙挽拔,通常手機(jī)與手機(jī)之間的連接都屬于經(jīng)典藍(lán)牙模式范疇嘉抓,而一般連接外設(shè)耳機(jī)等設(shè)備,大多
屬于BLE藍(lán)牙(低功耗藍(lán)牙)瞳购,這兩種藍(lán)牙除了名字有相同之外垢揩,通信方式玖绿、原理、協(xié)議完全不一樣叁巨。
導(dǎo)入
version=1.0.3(最新版本請(qǐng)移步github)
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
dependencies {
implementation 'com.github.AlexLiuSheng:EasyBluetoothFrame:version'
}
藍(lán)牙連接流程
經(jīng)典藍(lán)牙采用C/S模式斑匪,所以同一個(gè)設(shè)備,只能作為Client端或者Server端的其中一個(gè)锋勺,
-
如果設(shè)備充當(dāng)Server端蚀瘸,那么監(jiān)聽流程如下:
- 藍(lán)牙權(quán)限獲取
- 設(shè)置設(shè)備可被發(fā)現(xiàn)
- 設(shè)置監(jiān)聽UUID
- 注冊(cè)為Server
- 等待配對(duì)狡蝶、連接、傳輸數(shù)據(jù)
-
如果設(shè)備充當(dāng)Client贮勃,本框架藍(lán)牙的連接流程一般為:
- 藍(lán)牙權(quán)限獲取
- 掃描設(shè)備
- 配對(duì)牢酵、綁定設(shè)備
- 建立連接
- 傳輸數(shù)據(jù)
藍(lán)牙權(quán)限獲取
可以使用庫(kù)BluetoothPermissionHandler
來(lái)輔助獲取藍(lán)牙權(quán)限或者開發(fā)者自己動(dòng)態(tài)獲取權(quán)限,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<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
permissionCallBack.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
override fun onBlueToothEnabled() {
}
初始化以及相關(guān)方法
- 初始化操作可以放到任何地方
BleManager.getInstance().init(application)
- 使用前臺(tái)service傳輸數(shù)據(jù)
BleManager.getInstance().setForegroundService(true)
- 如果使用ForegroundService模式衙猪,可自定義通知欄
BleManager.getInstance().setNotification(notification)
- 獲取所有配對(duì)過(guò)的設(shè)備
BleManager.getInstance().getPairedDevices()
連接
不管是服務(wù)端還是客戶端都需要獲取藍(lán)牙權(quán)限,并且進(jìn)行初始化BleManager布近。如果使用BluetoothPermissionHandler
垫释,應(yīng)該在onBlueToothEnabled
回調(diào)中做
掃描連接等操作。
設(shè)置為Server端
設(shè)置UUID
默認(rèn)使用00001101-0000-1000-8000-00805F9B34FB
撑瞧,當(dāng)然可以自定義
BleManager.getInstance().setConnectionUUID()
設(shè)置設(shè)備可被掃描發(fā)現(xiàn)
傳入?yún)?shù)為可被發(fā)現(xiàn)的時(shí)間棵譬,單位秒
BleManager.getInstance().enableDiscoverable(300)
注冊(cè)為Server
注冊(cè)為Server端之后,當(dāng)有設(shè)備連接成功后预伺,會(huì)回調(diào)connectSuccess
方法订咸,我們可以保存回調(diào)回來(lái)的
Connect
為全局,方便讀寫操作
BleManager.getInstance().registerServerConnection(object: ConnectResultlistner {
override fun connectSuccess(connect: Connect?) {
this@MainActivity.connect=connect
read()
}
override fun connectFailed(e: Exception?) {
}
})
設(shè)置為Client端
掃描設(shè)備
配置掃描時(shí)間酬诀,然后掃描脏嚷,在掃描回調(diào)中,通常操作是將回調(diào)的藍(lán)牙設(shè)備添加到列表并顯示瞒御,需要注意的是父叙,回調(diào)的藍(lán)牙設(shè)備可能會(huì)重復(fù),因此需要手動(dòng)去重
//配置掃描時(shí)間
val config=ScanConfig(5000)
BleManager.getInstance().scan(config,object :ScanResultListener{
override fun onDeviceFound(device: BluetoothDevice?) {
}
override fun onFinish() {
}
override fun onError() {
}
})
設(shè)置UUID
默認(rèn)使用00001101-0000-1000-8000-00805F9B34FB
肴裙,當(dāng)然可以自定義
BleManager.getInstance().setConnectionUUID()
配對(duì)(如果已經(jīng)配對(duì)趾唱,跳過(guò)此步)
如果沒(méi)有配對(duì),需要先進(jìn)行設(shè)備配對(duì)蜻懦,如果已經(jīng)配對(duì)甜癞,那么可以直接進(jìn)行連接操作
判斷是否已經(jīng)配對(duì),可以用BleManager.getInstance().getPairedDevices()
返回的集合進(jìn)行判斷
配對(duì)代碼如下:
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
當(dāng)有設(shè)備連接成功后宛乃,會(huì)回調(diào)connectSuccess
方法悠咱,我們可以保存回調(diào)回來(lái)的
Connect
為全局,方便讀寫操作
BleManager.getInstance().connect(d, object : ConnectResultlistner {
override fun connectSuccess(connect: Connect?) {
}
override fun connectFailed(e: Exception?) {
}
})
傳輸數(shù)據(jù)
讀
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
- [ ] 傳輸數(shù)據(jù)進(jìn)度完善
Last
- 詳細(xì)適用請(qǐng)看demo烤惊,第一版可能還有些不完善,持續(xù)完善中
- 歡迎PR或Issues
- 如果使用過(guò)程中覺得還不錯(cuò)乔煞,請(qǐng)不要吝嗇你的star,哈哈。
License
Apache 2.0