android5.0(Lollipop) BLE Peripheral牛刀小試

來源:互聯網
上載者:User

標籤:rate   super   package   new   OLE   ble   from   string   number   

轉載請表明http://blog.csdn.net/lansefeiyang08/article/details/46468743

知道Android L對藍芽對了一些改進,包括添加A2dp sink、HFP client、BLE Peripheral功能等等。

我花了一天多時間對Android L BLE Peripheral SDK進行了研究,網上的資料很少,有一個介紹的還不夠清晰,所以就自己寫了一個測試應用,希望可以對理解BLE Peripheral有一定的協助。

此貼主要以講解代碼為主,我會把項目代碼也傳到CSDN中,協助大家測試。

首先說明一點,並不是Android L的系統就可以支援BLE Peripheral,這個和硬體也是有關係的(以前有人告訴我支援BLE Peripheral是純軟體的東西,要不就是扯淡,要不就是我測得有問題)。我用我手上的Pad(支援BLE central,android5.0)發現直接不支援,Android5.0 SDK已經開始支援check手機是否支援BLE Peripheral,後面代碼會提到。

好了,下面我就直接上代碼了。為了代碼簡單整潔,我用一個Activity來完成最基本的功能,如果還有其他需求,只要稍微改一下就可以了。

我在寫這個代碼的時候,第一個困惑是BLE Peripheral操作流程是什嗎?代碼流程怎麼寫?我相信大家和我應該是一樣的困惑。所以我不全部貼代碼(我上傳後,代碼直接下載好了)。我按照流程給大家說一下我寫的思路。

首先,我去查SDK的介面,我發現在android L SDK中多了一個package:android.bluetooth.le;裡面多了Peripheral和Scanner,Scanner我會後面更新。

第二步開始寫代碼,代碼裡首先檢查是否支援BLE、BLE Peripheral。代碼如下:

[java] view plain copy
  1. private void init(){  
  2.     if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){  
  3.         Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_LONG).show();  
  4.         finish();  
  5.     }  
  6.       
  7.     final BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);  
  8.     mBluetoothAdapter = mBluetoothManager.getAdapter();  
  9.       
  10.     if(mBluetoothAdapter ==  null){  
  11.         Toast.makeText(this, R.string.bluetooth_not_supported, Toast.LENGTH_LONG).show();  
  12.         finish();  
  13.     }  
  14.       
  15.     mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();  
  16.     if(mBluetoothLeAdvertiser == null){  
  17.         Toast.makeText(this, "the device not support peripheral", Toast.LENGTH_SHORT    ).show();  
  18.         Log.e(TAG, "the device not support peripheral");  
  19.         finish();  
  20.     }  
  21. }  

前幾段代碼我就不說了,搞過BLE的基本都是通用的,但是你會發現在代碼裡多了一句

[java] view plain copy
  1. mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();  

這一句代碼會直接判斷你的裝置到底支援不支援BLE Peripheral。假如此傳回值非空,你才可以繼續有機會開發,如果返回空,那說明你的裝置搞不了BLE Peripheral(當然,My Code裡沒有判斷是否開啟了藍芽,這個為了節省時間,你們自己可以添加上)。

支援不支援BLE Peripheral,你也可以用BluetoothAdapter類的isMultipleAdvertisementSupported()函數去check,實際上getBluetoothLeAdvetiser()也會執行上面的isMultipleAdvertisementSupported函數,所以我就直接一步到位了,但是原理大家要懂。

第三,你的裝置已經支援BLE Peripheral了,那麼下一步就是要考慮我怎麼發廣播了。但是你在發廣播之前,要先準備自己的資料,比如你自己是什麼service,裡面有什麼data等等。

我們先來看看發廣播的函數長得什麼樣子:

 

[java] view plain copy
  1. mBluetoothLeAdvertiser.startAdvertising(createAdvSettings(true, 0), createAdvertiseData(), mAdvertiseCallback);  

從廣播函數應該可以看到所需要的參數,一個是廣播設定參數,一個是廣播資料,還有一個是Callback。當然startAdvertising有兩種格式,另外一種可以獲得廣播資料的response。

下面我們來看一下AdvertiseSettings:

 

[java] view plain copy
  1. /** create AdvertiseSettings */  
  2.  public static AdvertiseSettings createAdvSettings(boolean connectable, int timeoutMillis) {  
  3.      AdvertiseSettings.Builder mSettingsbuilder = new AdvertiseSettings.Builder();  
  4.      mSettingsbuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED);  
  5.      mSettingsbuilder.setConnectable(connectable);  
  6.      mSettingsbuilder.setTimeout(timeoutMillis);  
  7.      mSettingsbuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);  
  8.      AdvertiseSettings mAdvertiseSettings = mSettingsbuilder.build();  
  9.         if(mAdvertiseSettings == null){  
  10.             if(D){  
  11.                 Toast.makeText(mContext, "mAdvertiseSettings == null", Toast.LENGTH_LONG).show();  
  12.                 Log.e(TAG,"mAdvertiseSettings == null");  
  13.             }  
  14.         }  
  15.     return mAdvertiseSettings;  
  16.  }  

這裡面一共有四個參數,AdvertiseMode、Connectable、Timeout、TxPowerLevel。當然我們可以設定我們需要的,其他的參數會使用預設的值。

再就是格式很重要,我們一定要是AdvertiseSettings.builder,不然你只能設定一個參數。

再就是AdvertiseData:

 

[java] view plain copy
  1. public static AdvertiseData createAdvertiseData(){         
  2.     AdvertiseData.Builder    mDataBuilder = new AdvertiseData.Builder();  
  3.     mDataBuilder.addServiceUuid(ParcelUuid.fromString(HEART_RATE_SERVICE));  
  4.     AdvertiseData mAdvertiseData = mDataBuilder.build();  
  5.     if(mAdvertiseData==null){  
  6.         if(D){  
  7.             Toast.makeText(mContext, "mAdvertiseSettings == null", Toast.LENGTH_LONG).show();  
  8.             Log.e(TAG,"mAdvertiseSettings == null");  
  9.         }  
  10.     }  
  11.       
  12.     return mAdvertiseData;  
  13. }  

這裡面就需要設定很多參數了,我這裡為了簡單,只廣播心跳的UUID,但是沒有資料。如果你們有自己的資料等等,可以再這裡面去設定,自訂函數也在AdvertiseData類裡。

最後一步就是準備Callback函數:

 

[java] view plain copy
  1. private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {  
  2.     @Override  
  3.       public void onStartSuccess(AdvertiseSettings settingsInEffect) {  
  4.         super.onStartSuccess(settingsInEffect);  
  5.          if (settingsInEffect != null) {  
  6.              Log.d(TAG, "onStartSuccess TxPowerLv=" + settingsInEffect.getTxPowerLevel()     + " mode=" + settingsInEffect.getMode()  
  7.              + " timeout=" + settingsInEffect.getTimeout());  
  8.              } else {  
  9.              Log.e(TAG, "onStartSuccess, settingInEffect is null");  
  10.              }  
  11.             Log.e(TAG,"onStartSuccess settingsInEffect" + settingsInEffect);  
  12.           
  13.         }  
  14.       
  15.     @Override  
  16.     public void onStartFailure(int errorCode) {  
  17.         super.onStartFailure(errorCode);  
  18.         if(D)   Log.e(TAG,"onStartFailure errorCode" + errorCode);  
  19.           
  20.         if(errorCode == ADVERTISE_FAILED_DATA_TOO_LARGE){  
  21.             if(D){  
  22.                 Toast.makeText(mContext, R.string.advertise_failed_data_too_large, Toast.LENGTH_LONG).show();  
  23.                 Log.e(TAG,"Failed to start advertising as the advertise data to be broadcasted is larger than 31 bytes.");  
  24.             }  
  25.         }else if(errorCode == ADVERTISE_FAILED_TOO_MANY_ADVERTISERS){  
  26.             if(D){  
  27.                 Toast.makeText(mContext, R.string.advertise_failed_too_many_advertises, Toast.LENGTH_LONG).show();  
  28.                 Log.e(TAG,"Failed to start advertising because no advertising instance is available.");  
  29.             }  
  30.         }else if(errorCode == ADVERTISE_FAILED_ALREADY_STARTED){  
  31.             if(D){  
  32.                 Toast.makeText(mContext, R.string.advertise_failed_already_started, Toast.LENGTH_LONG).show();  
  33.                 Log.e(TAG,"Failed to start advertising as the advertising is already started");  
  34.             }  
  35.         }else if(errorCode == ADVERTISE_FAILED_INTERNAL_ERROR){  
  36.             if(D){  
  37.                 Toast.makeText(mContext, R.string.advertise_failed_internal_error, Toast.LENGTH_LONG).show();  
  38.                 Log.e(TAG,"Operation failed due to an internal error");  
  39.             }  
  40.         }else if(errorCode == ADVERTISE_FAILED_FEATURE_UNSUPPORTED){  
  41.             if(D){  
  42.                 Toast.makeText(mContext, R.string.advertise_failed_feature_unsupported, Toast.LENGTH_LONG).show();  
  43.                 Log.e(TAG,"This feature is not supported on this platform");  
  44.             }  
  45.         }  
  46.     }  
  47. };  

當你廣播成功,會受到onStartSuccess的回調,回調的參數也是AdvertiseSettings設定的參數。如果你還有你自己想做的,可以再這裡面去做。

為了大家方便,我把errorcode可能遇到的問題,都做了判斷,只有這五種錯誤情況。

最後一步就是關閉了,開了廣播要關閉,不然會造成未知問題:

 

[java] view plain copy
  1. private void stopAdvertise() {  
  2.      if (mBluetoothLeAdvertiser != null) {  
  3.          mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);  
  4.          mBluetoothLeAdvertiser = null;  
  5.      }  
  6.  }  

ok,代碼就是這麼簡單,只要熟悉流程就可以搞定。希望對大家有協助。

代碼路徑為:http://download.csdn.net/detail/lansefeiyang08/8799027

android5.0(Lollipop) BLE Peripheral牛刀小試

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.