Android 基于FastBle的BLE藍牙開發(fā)

FastBle:

BLE藍牙開發(fā)框架
https://github.com/Jasonchenlijian/FastBle

藍牙的種類

藍牙分經典藍牙和低功耗藍牙,這里介紹的是低功耗藍牙也就是BLE藍牙開發(fā)泡仗。

初始化

  Application.class

  BleManager.getInstance().init(getApplication());

  BleManager.getInstance()
          .enableLog(true)
          .setReConnectCount(1, 5000)//重連次數(shù)以及間隔時間
          .setSplitWriteNum(20)//拆分寫入數(shù)
          .setConnectOverTime(10000)//連接超時時間
          .setOperateTimeout(5000);//操作超時時間

搜索

 val scanRuleConfig = BleScanRuleConfig.Builder()
           // .setDeviceName(true, DEVICE_NAME)         // 只掃描指定廣播名的設備蟀伸,可選
            .setAutoConnect(true)      // 連接時的autoConnect參數(shù),可選寄症,默認false
            .setScanTimeOut(10000)              // 掃描超時時間祸穷,可選拓提,默認10秒
            .build()

BleManager.getInstance().initScanRule(scanRuleConfig)

BleManager.getInstance().scan(object : BleScanCallback() {
            override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
               //搜索完成,scanResultList搜索到的所有設備
            }

            override fun onScanStarted(success: Boolean) {
               //開始搜索
            }

            override fun onScanning(bleDevice: BleDevice?) {
               //bleDevice:搜索到的設備
                if (bleDevice?.name == DEVICE_NAME) {
                    //搜索到對應設備后停止搜索并連接
                    stopScan()
                    BleManager.getInstance().connect(bleDevice, bleGattCallback)
                }

            }
        });
//停止搜索
private fun stopScan() {
        if (BleManager.getInstance().scanSate == BleScanState.STATE_SCANNING) {//判斷是否正在搜索
            BleManager.getInstance().cancelScan()
        }
    }

連接

BleManager.getInstance().connect(bleDevice, bleGattCallback)


private val bleGattCallback = object : BleGattCallback() {
        override fun onStartConnect() {
               //開始連接
        }

        override fun onDisConnected(isActiveDisConnected: Boolean,device: BleDevice?,gatt: BluetoothGatt?,status: Int) {
            //斷開連接
        }


        override fun onConnectSuccess(bleDevice: BleDevice?, gatt: BluetoothGatt?, status: Int) {
            //連接成功
        }

        override fun onConnectFail(bleDevice: BleDevice?, exception: BleException?) {
            //連接失敗
        }


    }

之前連接過的設備可以把設備mac儲存起來鸿吆,下次直接調用下面代碼可以直接連接囤采,速度會比重新搜索連接快很多

 val deviceMac = SharedUtil.read(SP_DEVICE_MAC, null)
        if (deviceMac != null) {
            val device = BleManager.getInstance().bluetoothAdapter.getRemoteDevice(deviceMac)
            if (device != null && device.name == DEVICE_NAME) {//判斷是否是正確的設備
                stopScan()
                BleManager.getInstance().connect(BleDevice(device), bleGattCallback)
            }
        }

獲取通知

設備連接成功后,調用下面代碼即可創(chuàng)建通知的監(jiān)聽惩淳,其中如果獲取到的Byte數(shù)組過大時蕉毯,返回的數(shù)據(jù)是進行分包處理的,需要自行將其連接才是一段完整的數(shù)據(jù)

BleManager.getInstance().notify(BleDevice bleDevice,
                       String uuid_service,
                       String uuid_notify,
                       BleNotifyCallback callback)

這里我的設備的uuid_service為0000ffe0-0000-1000-8000-00805f9b34fb
uuid_notify為0000ffe1-0000-1000-8000-00805f9b34fb
uuid_write為0000ffe2-0000-1000-8000-00805f9b34fb

但是可能有的設備不一樣思犁,這時候可以調用gatt!!.services獲取到所有服務代虾,查找到你所需要的uuid_service,uuid_notify則可以通過 gatt!!.getService(uuid_service).characteristics里獲取

其中有一個坑是在FastBle框架中激蹲,創(chuàng)建通知監(jiān)聽的時候會出現(xiàn)this characteristic not support notify!這個錯誤棉磨,這個是因為框架內部過早調用gatt.discoverServices()后導致gatt.getService()時為空導致的。所以下面中学辱,我會先進行判空乘瓤,如果為空的話則延遲一秒調用gatt.discoverServices()环形。之后內部會再次調用BleGattCallback中onConnectSuccess回調,在確保service不為空才進行調用BleManager.getInstance().notify()

//在BleGattCallback中onConnectSuccess回調調用
 if (gatt!!.getService(UUID.fromString("0000ffe0-0000-1000-8000-00805f9b34fb")) == null) {
               //判斷service是否為空
                Handler(Looper.getMainLooper()).postDelayed({
                    gatt.discoverServices()
                }, 1000)
                return
  }
   //獲取通知
  BleManager.getInstance()
                .notify(
                    bleDevice,
                    "0000ffe0-0000-1000-8000-00805f9b34fb",//uuidService
                    "0000ffe1-0000-1000-8000-00805f9b34fb",//uuidNotify
                    object : BleNotifyCallback() {
                        override fun onCharacteristicChanged(data: ByteArray?) {
                            //獲取到的數(shù)據(jù)
                            if (data != null) {
                                getResult(data)
                            }
                        }

                        override fun onNotifyFailure(exception: BleException?) {
                            //錯誤
                        }

                        override fun onNotifySuccess() {
                              //成功
                        }

                    })

其他

表明衙傀、寫入抬吟、讀取也是類似的調用,這里就不詳細寫了

//表明
BleManager.getInstance().indicate(
           BleDevice bleDevice,
           String uuid_service,
           String uuid_indicate,
           BleIndicateCallback callback)

//寫入
BleManager.getInstance().write(
          BleDevice bleDevice,
          String uuid_service,
          String uuid_write,
          byte[] data,
          BleWriteCallback callback)

//讀取
BleManager.getInstance().read(
          BleDevice bleDevice,
          String uuid_service,
          String uuid_read,
          BleReadCallback callback)

釋放資源

BleManager.getInstance().destroy()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末统抬,一起剝皮案震驚了整個濱河市拗军,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓄喇,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件交掏,死亡現(xiàn)場離奇詭異妆偏,居然都是意外死亡,警方通過查閱死者的電腦和手機盅弛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門钱骂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挪鹏,你說我怎么就攤上這事见秽。” “怎么了讨盒?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵解取,是天一觀的道長。 經常有香客問我返顺,道長禀苦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任遂鹊,我火速辦了婚禮振乏,結果婚禮上,老公的妹妹穿的比我還像新娘秉扑。我一直安慰自己慧邮,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布舟陆。 她就那樣靜靜地躺著误澳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吨娜。 梳的紋絲不亂的頭發(fā)上脓匿,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音宦赠,去河邊找鬼陪毡。 笑死米母,一個胖子當著我的面吹牛,可吹牛的內容都是我干的毡琉。 我是一名探鬼主播铁瞒,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桅滋!你這毒婦竟也來了慧耍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤丐谋,失蹤者是張志新(化名)和其女友劉穎芍碧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體号俐,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡泌豆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吏饿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踪危。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖猪落,靈堂內的尸體忽然破棺而出贞远,到底是詐尸還是另有隱情,我是刑警寧澤笨忌,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布蓝仲,位于F島的核電站,受9級特大地震影響蜜唾,放射性物質發(fā)生泄漏杂曲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一袁余、第九天 我趴在偏房一處隱蔽的房頂上張望擎勘。 院中可真熱鬧,春花似錦颖榜、人聲如沸棚饵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽噪漾。三九已至,卻和暖如春且蓬,著一層夾襖步出監(jiān)牢的瞬間欣硼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工恶阴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诈胜,地道東北人豹障。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像焦匈,于是被迫代替她去往敵國和親血公。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354