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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android5.0(Lollipop) BLE Peripheral牛刀小试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請表明作者: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
  • 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的基本都是通用的,但是你會發現在代碼里多了一句

    [java] view plain copy
  • mBluetoothLeAdvertiser?=?mBluetoothAdapter.getBluetoothLeAdvertiser();??
  • 這一句代碼會直接判斷你的設備到底支持不支持BLE Peripheral。假如此返回值非空,你才可以繼續有機會開發,如果返回空,那說明你的設備搞不了BLE Peripheral(當然,我的代碼里沒有判斷是否打開了藍牙,這個為了節省時間,你們自己可以添加上)。

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

    第三,你的設備已經支持BLE Peripheral了,那么下一步就是要考慮我怎么發廣播了。但是你在發廣播之前,要先準備自己的數據,比如你自己是什么service,里面有什么data等等。

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

    ?

    [java] view plain copy
  • mBluetoothLeAdvertiser.startAdvertising(createAdvSettings(true,?0),?createAdvertiseData(),?mAdvertiseCallback);??
  • 從廣播函數應該可以看到所需要的參數,一個是廣播設置參數,一個是廣播數據,還有一個是Callback。當然startAdvertising有兩種格式,另外一種可以獲得廣播數據的response。

    下面我們來看一下AdvertiseSettings:

    ?

    [java] view plain copy
  • /**?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;??
  • ?}??
  • 這里面一共有四個參數,AdvertiseMode、Connectable、Timeout、TxPowerLevel。當然我們可以設置我們需要的,其他的參數會使用默認的值。

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

    再就是AdvertiseData:

    ?

    [java] view plain copy
  • 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;??
  • }??
  • 這里面就需要設置很多參數了,我這里為了簡單,只廣播心跳的UUID,但是沒有數據。如果你們有自己的數據等等,可以再這里面去設置,自定義函數也在AdvertiseData類里。

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

    ?

    [java] view plain copy
  • 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");??
  • ????????????}??
  • ????????}??
  • ????}??
  • };??
  • 當你廣播成功,會受到onStartSuccess的回調,回調的參數也是AdvertiseSettings設置的參數。如果你還有你自己想做的,可以再這里面去做。

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

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

    ?

    [java] view plain copy
  • private?void?stopAdvertise()?{??
  • ?????if?(mBluetoothLeAdvertiser?!=?null)?{??
  • ?????????mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);??
  • ?????????mBluetoothLeAdvertiser?=?null;??
  • ?????}??
  • ?}??
  • ok,代碼就是這么簡單,只要熟悉流程就可以搞定。希望對大家有幫助。

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

    轉載于:https://www.cnblogs.com/Free-Thinker/p/8677982.html

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩熟女一区二区 | 日韩免费网址 | 久久久久亚洲av无码专区体验 | 亚洲欧美网址 | 欧美性高潮 | 日韩精品一区二区三区免费视频 | 窝窝午夜精品一区二区 | 国模在线视频 | 欧美激情视频一区 | 懂色av蜜臀av粉嫩av分 | 91免费看黄 | 视频一区在线免费观看 | 中文字幕 日韩 欧美 | 色哟哟在线免费观看 | 懂色av成人一区二区三区 | 香蕉视频ap | 欧美三区在线观看 | 一区福利视频 | 福利资源在线 | 仙踪林久久久久久久999 | 在线观看黄网站 | 乌克兰少妇性做爰 | 黑人中文字幕一区二区三区 | 日本午夜免费福利视频 | 久久久久成人精品无码中文字幕 | 国产免费又粗又猛又爽 | 欧美日韩一区二区三区69堂 | 碰碰97| 国产中文在线观看 | 亚欧成人在线 | 久久久噜噜噜久久久 | 免费日本黄色网址 | 一本一道波多野结衣一区二区 | 韩国美女被c | av成人免费在线观看 | 中文字幕日本一区 | 成人国产av一区二区三区 | www日本在线 | 蜜桃av免费看 | 免费一级片 | 国产欧美日韩久久 | 激情成人综合 | 吻胸摸激情床激烈视频 | 永久av| 国产夫妇交换聚会群4p | 国产做爰高潮呻吟视频 | 97人妻精品一区二区三区免费 | av一级大片| 手机电影在线观看 | 亚洲一区视频在线 | 国产一区二区三区四区五区在线 | 国产精品666| 日本伦理中文字幕 | 美女18网站 | 日韩免费看片 | wwww日本60| 亚洲一区影院 | 男女猛烈无遮挡免费视频 | 国产性―交―乱―色―情人 | 后进极品美女白嫩翘臀 | 高清乱码毛片 | 久久6| 精品一区91| 丁香花电影免费播放在线观看 | 亚洲码中文 | 亚洲精品视频一区二区三区 | 亚洲理论片 | 国产人妻大战黑人20p | 少妇搡bbbb搡bbb搡打电话 | 国产精品嫩 | 女人16一毛片 | 西西人体大胆4444ww张筱雨 | 久久草视频在线 | 国产日韩欧美精品在线观看 | 中文精品一区二区三区 | 中文字幕在线视频网 | 免费看a| 午夜伦伦电影理论片费看 | 美女洗澡隐私免费网站 | 黑人玩弄人妻一区二区三区影院 | 日韩精品一区二区三区在线视频 | 麻豆精品国产精华精华液好用吗 | 国产精品白嫩白嫩大学美女 | 青青视频一区二区 | 国产九色在线播放九色 | 欧美视频一区二区在线 | 69福利网 | 国内偷拍久久 | 国产欧美视频一区二区 | 日本福利视频导航 | 今天高清视频在线观看视频 | 另类二区 | 精品国产一区二区三区四 | 欧美三区 | 五月婷婷丁香在线 | 成人小视频免费观看 | 99精品亚洲 | 在线免费看黄色片 | av官网|