1. 程式人生 > >Android 藍芽4.0實現,自動匹配藍芽裝置

Android 藍芽4.0實現,自動匹配藍芽裝置

        今天開始寫部落格來記錄我的工作學習成長,作為一個初學者,近期的一個工作是通過Android藍芽4.0來實現與藍芽裝置的資料交換,下面就通過程式碼和文字來解釋一下整個過程。

        首先我要說明的是,我再專案中使用了一個開源庫,我覺得不錯,所有程式碼都是在該庫基礎上實現的,地址:https://github.com/litesuits/android-lite-bluetoothLE

下面進入正題

1,檢查裝置是否支援藍芽4.0,和開啟藍芽

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            Toast.makeText(this, "裝置不支援BLE", Toast.LENGTH_SHORT).show();
            finish();
        }
 
// Ensures Bluetooth is enabled on the device.  If Bluetooth is not currently enabled,
        // fire an intent to display a dialog asking the user to grant permission to enable it.
        if (!mBluetoothAdapter.isEnabled()) {
            if (!mBluetoothAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }
        }

2,搜尋藍芽4.0裝置,該方法是搜尋藍芽裝置SCAN_PERIOD事件,通過回撥函式new PeriodScanCallback來處理結果,分為超時和找到藍芽裝置,自己可以在回撥函式中作相應處理

 /**
    * scan devices for a while
    */
   private void scanDevicesPeriod() {
   
   mScanning = true;
   this.startBluetoothProgressDialog("正在搜尋藍芽裝置...");
   showMessage.setText("正在搜尋藍芽裝置...");
       SampleGattAttributes.liteBluetooth.startLeScan(new PeriodScanCallback(SCAN_PERIOD) {
           @Override
           public void onScanTimeout() {
            BluetoothSearchActivity.this.stopBluetoothProgressDialog();
            mScanning = false;
handler1.sendEmptyMessage(3);
SampleGattAttributes.liteBluetooth.stopScan(null);
           }


           @Override
           public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
            if(device != null && device.getName() != null && device.getName().startsWith("XXXX")){
bluetoothDevice = device;
deviceName.add(device.getName()); 
mDeviceName = device.getName();
mDeviceAddress = device.getAddress();
SampleGattAttributes.address = device.getAddress();
mAdapter = new ArrayAdapter<String>(BluetoothSearchActivity.this, android.R.layout.simple_list_item_1, deviceName);
mScanning = false;
SampleGattAttributes.liteBluetooth.stopScan(null);

handler1.sendEmptyMessage(4);
}
           }
       });
   }

3,連線藍芽裝置,通過connect連線裝置,通過會返回一個回撥函式gattCallBack,再回調函式中處理藍芽裝置連線的各種狀態,如連線成功,失敗,發現service等,作相應處理。

public void directConnect(){

mHandler.postDelayed(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub

showMessage.setText("連線超時,單擊重新連線");
BluetoothSearchActivity.this.stopBluetoothProgressDialog();
if(reConnect){
reConnect = false;
//directConnect();
}
}
}, 10000);

this.startBluetoothProgressDialog("正在連線藍芽裝置...");

showMessage.setText("正在連線藍芽裝置...");

SampleGattAttributes.mBluetoothGatt = SampleGattAttributes.liteBluetooth.connect(mBluetoothAdapter.getRemoteDevice(mDeviceAddress), false, gattCallBack);
}

LiteBleGattCallback gattCallBack = new LiteBleGattCallback() {

@Override
public void onServicesDiscovered(BluetoothGatt gatt, int arg1) {
// TODO Auto-generated method stub
BluetoothGattService aimService = gatt.getService(SampleGattAttributes.SERVIE_UUID);
aimCharact = aimService.getCharacteristic(SampleGattAttributes.WRITE_CHARACT_UUID);
SampleGattAttributes.writeCharact = aimCharact;
Log.i("12", "onServicesDiscovered " + aimCharact.getUuid());
mHandler.removeCallbacksAndMessages(null);
SampleGattAttributes.isConnect = true;
handler1.sendEmptyMessage(1);
}

@Override
public void onConnectSuccess(BluetoothGatt gatt, int arg1) {
// TODO Auto-generated method stub
gatt.discoverServices();
SampleGattAttributes.isConnect = true;
Log.i("12", "onConnectSuccess chenyue");
//mHandler.removeCallbacksAndMessages(null);
}

@Override
public void onConnectFailure(BleException arg0) {
// TODO Auto-generated method stub
SampleGattAttributes.isConnect = false;
SampleGattAttributes.writeCharact = null;
}
};

4,寫資料,通過獲取UUID獲取了service和Characteristic,就可以如裡面寫資料了

   /**
     * write data to characteristic
     */
    private void writeDataToCharacteristic() {
        LiteBleConnector connector = liteBluetooth.newBleConnector();
        connector.withUUIDString(UUID_SERVICE, UUID_CHAR_WRITE, null)
                 .writeCharacteristic(new byte[]{1, 2, 3}, new BleCharactCallback() {
                     @Override
                     public void onSuccess(BluetoothGattCharacteristic characteristic) {
                         BleLog.i(TAG, "Write Success, DATA: " + Arrays.toString(characteristic.getValue()));
                     }


                     @Override
                     public void onFailure(BleException exception) {
                         BleLog.i(TAG, "Write failure: " + exception);
                         bleExceptionHandler.handleException(exception);
                     }
                 });
    }

5,讀資料

  /**
     * read data from characteristic
     */
    private void readDataFromCharacteristic() {
        LiteBleConnector connector = liteBluetooth.newBleConnector();
        connector.withUUIDString(UUID_SERVICE, UUID_CHAR_READ, null)
                 .readCharacteristic(new BleCharactCallback() {
                     @Override
                     public void onSuccess(BluetoothGattCharacteristic characteristic) {
                         BleLog.i(TAG, "Read Success, DATA: " + Arrays.toString(characteristic.getValue()));
                     }


                     @Override
                     public void onFailure(BleException exception) {
                         BleLog.i(TAG, "Read failure: " + exception);
                         bleExceptionHandler.handleException(exception);
                     }
                 });
    }

6,監聽 characteristic的資料

  /**
     * enble notification of characteristic
     */
    private void enableNotificationOfCharacteristic() {
        LiteBleConnector connector = liteBluetooth.newBleConnector();
        connector.withUUIDString(UUID_SERVICE, UUID_CHAR_READ, null)
                 .enableCharacteristicNotification(new BleCharactCallback() {
                     @Override
                     public void onSuccess(BluetoothGattCharacteristic characteristic) {
                         BleLog.i(TAG, "Notification characteristic Success, DATA: " + Arrays
                                 .toString(characteristic.getValue()));
                     }


                     @Override
                     public void onFailure(BleException exception) {
                         BleLog.i(TAG, "Notification characteristic failure: " + exception);
                         bleExceptionHandler.handleException(exception);
                     }
                 });
    }

7,對現有的連線加入回撥函式

 /**
     * add(remove) new callback to an existing connection.
     * One Device, One {@link LiteBluetooth}.
     * But one device( {@link LiteBluetooth}) can add many callback {@link BluetoothGattCallback}
     *
     * {@link LiteBleGattCallback} is a extension of {@link BluetoothGattCallback}
     */
    private void addNewCallbackToOneConnection() {
        BluetoothGattCallback liteCallback = new BluetoothGattCallback() {
            @Override
            public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {}


            @Override
            public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            }


            @Override
            public void onCharacteristicWrite(BluetoothGatt gatt,
                                              BluetoothGattCharacteristic characteristic, int status) {
            }


            @Override
            public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {}
        };


        if (liteBluetooth.isConnectingOrConnected()) {
            liteBluetooth.addGattCallback(liteCallback);
            liteBluetooth.removeGattCallback(liteCallback);
        }
    }

以上基本實現藍芽4.0的進本功能了,下面說說我在專案過程中遇到的困難和解決方法

1,每次連線裝置都要重新搜尋藍芽,比較耗時,所以在第一次連線裝置時,Android端就需要自動匹配藍芽裝置,下次連線就可以直接連線了。下面的方法實現了自動匹配strAddr地址的藍芽裝置, strPsw一般為“0000”

//藍芽配對
public static boolean pair(String strAddr, String strPsw) 


    { 


        boolean result = false; 
   
        if (!BluetoothAdapter.checkBluetoothAddress(strAddr)) 
        { // 檢查藍芽地址是否有效 
//            Log.d("mylog", "devAdd un effient!"); 
        } 
     BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(strAddr);   
        if (device.getBondState() != BluetoothDevice.BOND_BONDED) 
        { 
            try 
            { 
//                Log.d("mylog", "NOT BOND_BONDED"); 
                ClsUtils.setPin(device.getClass(), device, strPsw); // 手機和藍芽採集器配對 
                ClsUtils.createBond(device.getClass(), device); 
//                remoteDevice = device; // 配對完畢就把這個裝置物件傳給全域性的remoteDevice 
                result = true; 
            } 
            catch (Exception e) 
            { 
                // TODO Auto-generated catch block 
//                Log.d("mylog", "setPiN failed!"); 
                e.printStackTrace(); 
            } // 
        } 
        else 
        { 
//            Log.d("mylog", "HAS BOND_BONDED"); 
            try 
            { 
                ClsUtils.createBond(device.getClass(), device); 
                ClsUtils.setPin(device.getClass(), device, strPsw); // 手機和藍芽採集器配對 
                ClsUtils.createBond(device.getClass(), device); 
//                remoteDevice = device; // 如果繫結成功,就直接把這個裝置物件傳給全域性的remoteDevice 
                result = true; 
            } 
            catch (Exception e) 
            { 
                // TODO Auto-generated catch block 
//                Log.d("mylog", "setPiN failed!"); 
                e.printStackTrace(); 
            } 
        } 
        return result; 
    } 

2,當傳送資料量較大時,需要進行分包,我是將資料分成了256byte一個包傳送。但是,分包傳送可能會出現的問題是有的包傳送失敗,所以需要進行重傳或者其他處理,我的處理方式是,當一個包傳送成功後再發第二個包,傳送失敗就進行重傳。大家放心,傳送資料也是有回撥函式的,傳送成功或者失敗都會進入相應的回撥函式,大家自行處理就可以了。還是一個問題就是資料傳送的速率問題,我們傳送的速率本來一直很慢,後來才發現是藍芽裝置的模式問題,大家以後出現這種問題,最好檢視一下藍芽裝置的收發資料模式。

相關推薦

Android 4.0實現自動匹配裝置

        今天開始寫部落格來記錄我的工作學習成長,作為一個初學者,近期的一個工作是通過Android藍芽4.0來實現與藍芽裝置的資料交換,下面就通過程式碼和文字來解釋一下整個過程。         首先我要說明的是,我再專案中使用了一個開源庫,我覺得不錯,所有程式碼都

android ble 4.0多機通訊客戶端實現

自從進入軟體開發行業,都是一直在CSDN上索取無數資料,一直沒有貢獻過,今天突然想寫點什麼,第一次寫,寫點簡單的吧,不知道有沒有人看。 藍芽從4.0開始,支援了多裝置通訊,android 4.3開始支援了藍芽4.0,即 android ble關於ble 網上資料很多,也講的

Android開發之低功耗(4.0)開發全記錄

主要內容概況 前面我記錄了開發藍芽2.0的過程,今天準備介紹現在的主流藍芽技術,藍芽4.0的開發,該藍芽技術是在Android4.3(API級別18)版本引入的API。 官方文件 具體的區別主要以下幾點: 1.新的藍芽技術提供了連線服務的方法,以前是沒有提供連線藍芽的方法

Android BLE4.0開發—Android手機與BLE終端通訊

轉載自: https://blog.csdn.net/fu908323236/article/details/76208997 這篇部落格主要講解AndroidBLE藍芽4.0的基本概念,以及基礎用法。  BLE 即 Bluetooth Low Energy,藍芽低功耗技術,是藍芽

Android4.0 關閉重開無法根據地址連線問題

在藍芽專案的末尾,在個別手機上出來,手動關閉手機藍芽,和再次啟動,開啟app發現無法連線上,經過檢視log最後確定錯誤是: onClientConnectionState()- status=133 clientIf=5 device=地址 133的一個錯誤,前面試過很

iOS開發(二):iOS 4.0中心模式 程式碼實現

上一篇簡單介紹了藍芽的部分基礎知識,詳細的東西大家可以去github上搜babyBluetooth,裡面有一些學習資料 iOS連線外設的流程 建立中心管理者 掃描外設 discoverPeripheral 連線外設 connectPeripheral

Android 4.0(ble)開發的解決方案

   最近,隨著智慧穿戴式裝置、智慧醫療以及智慧家居的普及,藍芽開發在移動開中顯得非常的重要。由於公司需要,研究了一下,藍芽4.0在Android中的應用。以下是我的一些總結。           1.先介紹一下關於藍芽4.0中的一些名詞吧:               

iOS開發之4.0技術完美實現

前言 前端時間,同學在做專案過程中遇到關於藍芽方面的問題,今天我就給大家進行詳細的進行講解下藍芽在iOS開發中的具體實現.在介紹藍芽前,大家要搞清楚什麼是藍芽? 什麼是藍芽? 隨著藍芽低功耗技術BLE(Bluetooth Low Energy)的發展,

Android Bluetooth 4.0 詳解

本文介紹Android ble 藍芽4.0,也就是說API level >= 18,且支援藍芽4.0的手機才可以使用,如果手機系統版本API level < 18,也是用不了藍芽4.0的哦。 一、瞭解api及概念 1.1 BluetoothGatt 繼

android 4.0 ble 低功耗

一:概述 這段時間做了藍芽4.0的專案,就是一個藍芽裝置控制手機進行拍照。並且有很多按鍵,不同的按鍵對應到手機上有不同的功能,並且組合起來也有不同的功能。 低功耗藍芽有中央裝置後周邊裝置的概念手機就是一箇中央裝置,像我這次試用的一個控制器, 我試過小

android 4.0(BLE)開發

最近剛好專案需要手機與藍芽模組通訊,基於藍芽4.0,網上資料較少也有些小坑,故作一下總結。 關鍵術語和概念 藍芽有傳統藍芽(3.0以下)和低功耗藍芽(BLE,又稱藍芽4.0)之分,而藍芽4.0開發需要android4.3版本(API 18)及以上才支援

android 4.0 分包傳輸資料 問題

最近一直被這個藍芽4.0資料傳輸問題的困擾,安卓版本這麼多,發現一樣的資料傳輸程式碼在不同手機上效果截然不同。 目前發現在5.1的系統上,藍芽4.0每次傳送256byte資料可行,但是在4.4的系統上每次傳輸資料最多為20byte。 下次傳輸時還未到BLE的

ANDROID4.0開發_開發例項原始碼下載

一個整合目前主流藍芽的demo、android藍芽4.0開發、專案中使用到了搜尋BLE終端和讀寫BLE終端、另外還有在程式裡面開房藍芽、在Demo裡面還處理了收到BLE終端資料互動的事件、程式碼裡都有中文註釋、要讀性應該非常好的、應該會對開發有一定幫助、有興趣的哥們可以下

Hollong 低功耗4.0/4.1/4.2 BLE Sniffer協議分析儀

名稱:緯圖Hollong BLE藍芽 監控分析儀 品牌:ViewTool/緯圖 型號:VTH201A 典型應用: - 抓取BLE藍芽傳輸資料,分析資料傳輸協議; - 實時捕獲、顯示、分析、過濾協議資料,減少除錯時間,加速產品進入市場; - 協助開發除錯BLE相關

Hollong 4.0/4.1/4.2 BLE協議監控分析儀

品牌:ViewTool/緯圖型號:VTH201A   典型應用: - 抓取BLE藍芽傳輸資料,分析資料傳輸協議; - 協助開發除錯BLE相關軟體,韌體; - 實時捕獲、顯示、解析、過濾和偵測協議錯誤,減少除錯時間,加速產品進入市場; - 幫助學習BLE藍芽傳輸協議; &nb

BlueTooth 4 0技術細節

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

4.0 BLE SimpleBLEPeripheral_新增新CHAR值及UUID

      UUID, 就是用來唯一識別一個特徵值的ID. handle,就是對應的attribute 的一個控制代碼。 所有對特徵值的操作,都是通過對UUID 的搜尋得到對應的handle之後,通過handle來操作

4.0 BLE 資料傳輸 (二)

轉載自: https://blog.csdn.net/rfidunion/article/details/79711055   在第一部分我們瞭解了幾個專業詞彙,接下來我們再瞭解一下資料的傳送 一、資料傳送 在BLE協議棧中進行資料傳送分為兩個方面,一個事GATT的cl

4.0 BLE 資料傳輸 (一)

原文地址:http://blog.sina.com.cn/s/blog_869234dc0102uxl3.html   在這之前我們得先了解一下一些專業詞彙: 1、profile  profile可以理解為一種規範,一個標準的通訊協議,它存在於從機中。 藍芽組織規

BlueTooth 4 0技術細節

  雖然藍芽(Bluetooth)3.0都還尚未完全普及,Bluetooth SIG(藍芽技術聯盟,Bluetooth Special InterestGroup,後文簡稱BluetoothSIG)卻又再次推出了藍芽4.0規範,並表示這又是藍芽發展史上一次重大的革新。值藍芽4.0推出之時,我們特地採訪了Blu