【安卓相關】FastBleLib 藍牙連接庫簡單用法

依賴

implementation 'com.clj.fastble:FastBleLib:2.3.4'

必要權限 ( 請注意,一定要保證定位權限已開啟 )

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

OK,現(xiàn)在開始寫代碼
一些全局變量

private  UUID uuid_service;
private  UUID uuid_chara;
private  BluetoothGatt bluetoothGatt;

掃描藍牙

/**
     * 掃描藍牙
     * */
    private void startScanBle(){
        /**
         *
         * 在使用之前,需要事先調用初始化init(Application app)方法。此外,可以進行一些自定義的配置,
         * 比如是否顯示框架內(nèi)部日志,重連次數(shù)和重連時間間隔,以及操作超時時間。
         *
         * */

        BleManager.getInstance().init(getApplication());
        BleManager.getInstance()
                .enableLog(true)
                .setReConnectCount(1, 5000)
                .setSplitWriteNum(20)
                .setConnectOverTime(10000)
                .setOperateTimeout(5000);


        /**
         *
         * 判斷當前Android設備的藍牙是否已經(jīng)打開。
         * 可以直接調用下面的判斷方法來判斷本機是否已經(jīng)打開了藍牙,如果沒有,向用戶拋出提示。
         *
         * */

        if(!BleManager.getInstance().isBlueEnable()){
            /**
             * 開啟藍牙
             * */
            BleManager.getInstance().enableBluetooth();
        }



        /**
         *
         *配置掃描規(guī)則
         * 掃描規(guī)則可以配置1個或多個,也可以不配置使用默認(掃描10秒)。
         * 掃描的時候,會根據(jù)配置的過濾選項,對掃描到的設備進行過濾,結果返回過濾后的設備。
         * 掃描時間配置為小于等于0,會實現(xiàn)無限掃描,直至調用BleManger.getInstance().cancelScan()來中止掃描。
         *
         * */
        BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()
                //.setServiceUuids(serviceUuids)      // 只掃描指定的服務的設備,可選
                //.setDeviceName(true, names)         // 只掃描指定廣播名的設備,可選
                //.setDeviceMac(mac)                  // 只掃描指定mac的設備,可選
                //.setAutoConnect(isAutoConnect)      // 連接時的autoConnect參數(shù),可選,默認false
                .setScanTimeOut(10000)              // 掃描超時時間,可選,默認10秒;小于等于0表示不限制掃描時間
                .build();
        BleManager.getInstance().initScanRule(scanRuleConfig);


        /**
         *
         * 現(xiàn)在可以開始掃描了
         *
         * */
        BleManager.getInstance().scan(new BleScanCallback() {
            @Override
            public void onScanFinished(List<BleDevice> scanResultList) {
                //  Toast.makeText(ScanBlueTooth.this,"掃描結束",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onScanStarted(boolean success) {
                Toast.makeText(ScanBlueTooth.this,"開始尋找藍牙",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onScanning(BleDevice bleDevice) {
                //  如果用listview或recyclerview 顯示可選擇設備的話
                //  bluetoothAdapter.addItem(bleDevice);
            }
        });

    }

掃描后肯定就是連接了

//  bleDevice 就是 onScanning 中掃描到的設備
BleManager.getInstance().connect(bleDevice, new BleGattCallback() {
                    @Override
                    public void onStartConnect() {
                        
                        //  開始連接,這里可以彈出一個 progressDialog
                    }

                    @Override
                    public void onConnectFail(BleDevice bleDevice, BleException exception) {
                        //  掃描失敗,這里可以dimiss 掉 progressDialog
                        //  并且顯示連接失敗的具體原因
                    }

                    @Override
                    public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {

                        // 連接成功后,就可以打開通知和發(fā)送指令了。

                    }

                    @Override
                    public void onDisConnected(boolean isActiveDisConnected, BleDevice device, BluetoothGatt gatt, int status) {
                        
                        Toast.makeText(ScanBlueTooth.this,"連接中斷",Toast.LENGTH_LONG).show();
                    }
                });

獲取uuid_service 和uuid_chara

        bluetoothGatt = BleManager.getInstance().getBluetoothGatt(bleDevice);

        /**
         * 就是通過BluetoothGatt,查找出所有的Service和Characteristic的UUID:
         * */
        List<BluetoothGattService> serviceList = bluetoothGatt.getServices();
        for (BluetoothGattService service : serviceList) {
            uuid_service = service.getUuid();

            List<BluetoothGattCharacteristic> characteristicList= service.getCharacteristics();
            for(BluetoothGattCharacteristic characteristic : characteristicList) {
                uuid_chara = characteristic.getUuid();
            }
        }

連接成功后打開通知,也就是用來接收來自藍牙傳輸過來的內(nèi)容

BleManager.getInstance().notify(
                            bleDevice,
                            uuid_service ,
                            uuid_chara,
                            new BleNotifyCallback() {
                                @Override
                                public void onNotifySuccess() {
                                    // 打開通知操作成功
                                    Log.i(TAG, "打開通知成功");
                                }

                                @Override
                                public void onNotifyFailure(BleException exception) {
                                    // 打開通知操作失敗
                                }

                                @Override
                                public void onCharacteristicChanged(byte[] data) {
                                    // 打開通知后,設備發(fā)過來的數(shù)據(jù)將在這里出現(xiàn)
          }
});

發(fā)送藍牙指令

BleManager.getInstance().write(
                                bleDeviceBean.getBleDevice(),
                                bleDeviceBean.getUuid_service(),
                                bleDeviceBean.getUuid_write(),
                                "指令內(nèi)容",
                                new BleWriteCallback() {
                                    @Override
                                    public void onWriteSuccess(int current, int total, byte[] justWrite) {
                                        //  justWrite 為指令內(nèi)容
                                       
                                    }

                                    @Override
                                    public void onWriteFailure(BleException exception) {
                                        // 指令發(fā)送失敗
                                        Log.i(TAG,exception.getDescription());
                                    }
                                });
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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