日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android+5.0+ble,android5.0(Lollipop) BLE Peripheral牛刀小试(示例代码)

發(fā)布時(shí)間:2024/9/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android+5.0+ble,android5.0(Lollipop) BLE Peripheral牛刀小试(示例代码) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載請表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46468743

知道Android L對藍(lán)牙對了一些改進(jìn)。包含加入A2dp sink、HFP client、BLE Peripheral功能等等。

我花了一天多時(shí)間對Android L BLE Peripheral SDK進(jìn)行了研究,網(wǎng)上的資料非常少,有一個(gè)介紹的還不夠清晰,所以就自己寫了一個(gè)測試應(yīng)用。希望能夠?qū)斫釨LE Peripheral有一定的幫助。

此貼主要以解說代碼為主,我會把項(xiàng)目代碼也傳到CSDN中,幫助大家測試。

首先說明一點(diǎn)。并非Android L的系統(tǒng)就能夠支持BLE Peripheral,這個(gè)和硬件也是有關(guān)系的(曾經(jīng)有人告訴我支持BLE Peripheral是純軟件的東西,要不就是扯淡,要不就是我測得有問題)。

我用我手上的Pad(支持BLE central,android5.0)發(fā)現(xiàn)直接不支持,Android5.0 SDK已經(jīng)開始支持check手機(jī)是否支持BLE Peripheral。后面代碼會提到。

好了,以下我就直接上代碼了。為了代碼簡單整潔。我用一個(gè)Activity來完畢最主要的功能,假設(shè)還有其它需求,僅僅要略微改一下就能夠了。

我在寫這個(gè)代碼的時(shí)候。第一個(gè)困惑是BLE Peripheral操作流程是什么?代碼流程怎么寫?我相信大家和我應(yīng)該是一樣的困惑。

所以我不所有貼代碼(我上傳后,代碼直接下載好了)。我依照流程給大家說一下我寫的思路。

首先,我去查SDK的接口,我發(fā)如今android L SDK中多了一個(gè)package:android.bluetooth.le;里面多了Peripheral和Scanner。Scanner我會后面更新。

第二步開始寫代碼。代碼里首先檢查是否支持BLE、BLE Peripheral。代碼例如以下:

private void init(){

if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){

Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_LONG).show();

finish();

}

final BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);

mBluetoothAdapter = mBluetoothManager.getAdapter();

if(mBluetoothAdapter == null){

Toast.makeText(this, R.string.bluetooth_not_supported, Toast.LENGTH_LONG).show();

finish();

}

mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();

if(mBluetoothLeAdvertiser == null){

Toast.makeText(this, "the device not support peripheral", Toast.LENGTH_SHORT).show();

Log.e(TAG, "the device not support peripheral");

finish();

}

}前幾段代碼我就不說了。搞過BLE的基本都是通用的,可是你會發(fā)如今代碼里多了一句mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();

這一句代碼會直接推斷你的設(shè)備究竟支持不支持BLE Peripheral。假如此返回值非空。你才干夠繼續(xù)有機(jī)會開發(fā),假設(shè)返回空,那說明你的設(shè)備搞不了BLE Peripheral(當(dāng)然。我的代碼里沒有推斷是否打開了藍(lán)牙,這個(gè)為了節(jié)省時(shí)間,你們自己能夠加入上)。

支持不支持BLE Peripheral,你也能夠用BluetoothAdapter類的isMultipleAdvertisementSupported()函數(shù)去check,實(shí)際上getBluetoothLeAdvetiser()也會運(yùn)行上面的isMultipleAdvertisementSupported函數(shù),所以我就直接一步到位了,可是原理大家要懂。

第三。你的設(shè)備已經(jīng)支持BLE Peripheral了,那么下一步就是要考慮我怎么發(fā)廣播了。可是你在發(fā)廣播之前,要先準(zhǔn)備自己的數(shù)據(jù),比方你自己是什么service。里面有什么data等等。

我們先來看看發(fā)廣播的函數(shù)長得什么樣子:

mBluetoothLeAdvertiser.startAdvertising(createAdvSettings(true, 0), createAdvertiseData(), mAdvertiseCallback);從廣播函數(shù)應(yīng)該能夠看到所須要的參數(shù),一個(gè)是廣播設(shè)置參數(shù),一個(gè)是廣播數(shù)據(jù)。另一個(gè)是Callback。當(dāng)然startAdvertising有兩種格式,第二種能夠獲得廣播數(shù)據(jù)的response。

以下我們來看一下AdvertiseSettings:

/** create AdvertiseSettings */

public static AdvertiseSettings createAdvSettings(boolean connectable, int timeoutMillis) {

AdvertiseSettings.Builder mSettingsbuilder = new AdvertiseSettings.Builder();

mSettingsbuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED);

mSettingsbuilder.setConnectable(connectable);

mSettingsbuilder.setTimeout(timeoutMillis);

mSettingsbuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);

AdvertiseSettings mAdvertiseSettings = mSettingsbuilder.build();

if(mAdvertiseSettings == null){

if(D){

Toast.makeText(mContext, "mAdvertiseSettings == null", Toast.LENGTH_LONG).show();

Log.e(TAG,"mAdvertiseSettings == null");

}

}

return mAdvertiseSettings;

}這里面一共同擁有四個(gè)參數(shù)。AdvertiseMode、Connectable、Timeout、TxPowerLevel。當(dāng)然我們能夠設(shè)置我們須要的,其它的參數(shù)會使用默認(rèn)的值。

再就是格式非常重要。我們一定要是AdvertiseSettings.builder。不然你僅僅能設(shè)置一個(gè)參數(shù)。

再就是AdvertiseData:

public static AdvertiseData createAdvertiseData(){

AdvertiseData.Builder mDataBuilder = new AdvertiseData.Builder();

mDataBuilder.addServiceUuid(ParcelUuid.fromString(HEART_RATE_SERVICE));

AdvertiseData mAdvertiseData = mDataBuilder.build();

if(mAdvertiseData==null){

if(D){

Toast.makeText(mContext, "mAdvertiseSettings == null", Toast.LENGTH_LONG).show();

Log.e(TAG,"mAdvertiseSettings == null");

}

}

return mAdvertiseData;

}這里面就須要設(shè)置非常多參數(shù)了,我這里為了簡單。僅僅廣播心跳的UUID,可是沒有數(shù)據(jù)。假設(shè)你們有自己的數(shù)據(jù)等等,能夠再這里面去設(shè)置。自己定義函數(shù)也在AdvertiseData類里。

最后一步就是準(zhǔn)備Callback函數(shù):

private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {

@Override

public void onStartSuccess(AdvertiseSettings settingsInEffect) {

super.onStartSuccess(settingsInEffect);

if (settingsInEffect != null) {

Log.d(TAG, "onStartSuccess TxPowerLv=" + settingsInEffect.getTxPowerLevel() + " mode=" + settingsInEffect.getMode()

+ " timeout=" + settingsInEffect.getTimeout());

} else {

Log.e(TAG, "onStartSuccess, settingInEffect is null");

}

Log.e(TAG,"onStartSuccess settingsInEffect" + settingsInEffect);

}

@Override

public void onStartFailure(int errorCode) {

super.onStartFailure(errorCode);

if(D) Log.e(TAG,"onStartFailure errorCode" + errorCode);

if(errorCode == ADVERTISE_FAILED_DATA_TOO_LARGE){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_data_too_large, Toast.LENGTH_LONG).show();

Log.e(TAG,"Failed to start advertising as the advertise data to be broadcasted is larger than 31 bytes.");

}

}else if(errorCode == ADVERTISE_FAILED_TOO_MANY_ADVERTISERS){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_too_many_advertises, Toast.LENGTH_LONG).show();

Log.e(TAG,"Failed to start advertising because no advertising instance is available.");

}

}else if(errorCode == ADVERTISE_FAILED_ALREADY_STARTED){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_already_started, Toast.LENGTH_LONG).show();

Log.e(TAG,"Failed to start advertising as the advertising is already started");

}

}else if(errorCode == ADVERTISE_FAILED_INTERNAL_ERROR){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_internal_error, Toast.LENGTH_LONG).show();

Log.e(TAG,"Operation failed due to an internal error");

}

}else if(errorCode == ADVERTISE_FAILED_FEATURE_UNSUPPORTED){

if(D){

Toast.makeText(mContext, R.string.advertise_failed_feature_unsupported, Toast.LENGTH_LONG).show();

Log.e(TAG,"This feature is not supported on this platform");

}

}

}

};當(dāng)你廣播成功,會受到onStartSuccess的回調(diào)。回調(diào)的參數(shù)也是AdvertiseSettings設(shè)置的參數(shù)。假設(shè)你還有你自己想做的,能夠再這里面去做。

為了大家方便,我把errorcode可能遇到的問題,都做了推斷,僅僅有這五種錯(cuò)誤情況。

最后一步就是關(guān)閉了,開了廣播要關(guān)閉,不然會造成未知問題:

private void stopAdvertise() {

if (mBluetoothLeAdvertiser != null) {

mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);

mBluetoothLeAdvertiser = null;

}

}ok,代碼就是這么簡單。僅僅要熟悉流程就能夠搞定。希望對大家有幫助。

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

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的android+5.0+ble,android5.0(Lollipop) BLE Peripheral牛刀小试(示例代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。