EasyBluetoothFrame一款手機(jī)藍(lán)牙通訊的快速開發(fā)框架

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

gif.gif

TODO

  • [ ] 傳輸數(shù)據(jù)進(jìn)度完善

Last

  • 詳細(xì)適用請(qǐng)看demo烤惊,第一版可能還有些不完善,持續(xù)完善中
  • 歡迎PR或Issues
  • 如果使用過(guò)程中覺得還不錯(cuò)乔煞,請(qǐng)不要吝嗇你的star,哈哈。

License


Apache 2.0

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柒室,一起剝皮案震驚了整個(gè)濱河市渡贾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雄右,老刑警劉巖空骚,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纺讲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡囤屹,警方通過(guò)查閱死者的電腦和手機(jī)熬甚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肋坚,“玉大人乡括,你說(shuō)我怎么就攤上這事≈茄幔” “怎么了诲泌?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)铣鹏。 經(jīng)常有香客問(wèn)我敷扫,道長(zhǎng),這世上最難降的妖魔是什么诚卸? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任葵第,我火速辦了婚禮,結(jié)果婚禮上合溺,老公的妹妹穿的比我還像新娘卒密。我一直安慰自己,他們只是感情好棠赛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布栅受。 她就那樣靜靜地躺著,像睡著了一般恭朗。 火紅的嫁衣襯著肌膚如雪屏镊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天痰腮,我揣著相機(jī)與錄音而芥,去河邊找鬼。 笑死膀值,一個(gè)胖子當(dāng)著我的面吹牛棍丐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沧踏,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼歌逢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了翘狱?” 一聲冷哼從身側(cè)響起秘案,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后阱高,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赚导,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年赤惊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吼旧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡未舟,死狀恐怖圈暗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裕膀,我是刑警寧澤厂置,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站魂角,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏智绸。R本人自食惡果不足惜野揪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞧栗。 院中可真熱鬧斯稳,春花似錦、人聲如沸迹恐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)殴边。三九已至憎茂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锤岸,已是汗流浹背竖幔。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留是偷,地道東北人拳氢。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛋铆,于是被迫代替她去往敵國(guó)和親馋评。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Guide to BluetoothSecurity原文 本出版物可免費(fèi)從以下網(wǎng)址獲得:https://doi.o...
    公子小水閱讀 8,018評(píng)論 0 6
  • 藍(lán)牙 注:本文翻譯自https://developer.android.com/guide/topics/conn...
    RxCode閱讀 8,691評(píng)論 11 99
  • Android平臺(tái)支持藍(lán)牙網(wǎng)絡(luò)協(xié)議棧刺啦,實(shí)現(xiàn)藍(lán)牙設(shè)備之間數(shù)據(jù)的無(wú)線傳輸留特。本文檔描述了怎樣利用android平臺(tái)提供的...
    Camming閱讀 3,325評(píng)論 0 3
  • 最近項(xiàng)目使用藍(lán)牙,之前并沒(méi)有接觸,還是發(fā)現(xiàn)了很多坑磕秤,查閱了很多資料乳乌,說(shuō)的迷迷糊糊,今天特查看官方文檔市咆。 說(shuō)下遇到的...
    King9527閱讀 1,797評(píng)論 0 1
  • Android 平臺(tái)包含藍(lán)牙網(wǎng)絡(luò)堆棧支持汉操,憑借此項(xiàng)支持,設(shè)備能以無(wú)線方式與其他藍(lán)牙設(shè)備交換數(shù)據(jù)蒙兰。應(yīng)用框架提供了通過(guò)...
    虎三呀閱讀 772評(píng)論 0 1