谷歌官方BLEdemo詳解

** 安卓開發(fā)中或多或少會接觸到藍牙部分旧困,像一些智能家居丐一,藍牙手環(huán)藻糖,還有一些串口數(shù)據(jù)傳輸?shù)脑O(shè)備都和藍牙相關(guān),面試的時候有的公司也會問到一些藍牙相關(guān)的問題库车,這里我來說說關(guān)于低功耗藍牙的一些相關(guān)知識巨柒,這些知識也是我在網(wǎng)上查閱總結(jié)的。在百度上一搜低功耗藍牙的帖子很多,但都講的不是很全面洋满,讓人知其然不知其所以然晶乔。這里我就從簡單的開始先分析一些谷歌的demo的代碼,看看BLE藍牙是怎么建立通信的牺勾,只要掌握了BLE藍牙通信那么再將發(fā)送接收的數(shù)據(jù)處理一下就ok了正罢,當(dāng)然光看這一篇帖子不一定會完全把低功耗藍牙弄懂,興許會遇到一些坑驻民,但是堅持下去始終會弄懂的翻具;**

這是網(wǎng)上提供的Android 藍牙4.0 ble 官方 demo

  • App的界面圖
app界面.jpg

App的界面很簡單就兩個界面

代碼主要包含四個類

  • DeviceScanActivity類(展示手機掃描到的BLE藍牙);

  • DeviceControlActivity類(BLE操作控制臺)回还;

  • BluetoothLeService類(通過服務(wù)來管理藍牙裆泳,其中通過廣播來于DeviceControlActivity類通信)

  • SampleGattAttributes類(不同種類的UUID)

DeviceScanActivity類的功能:

這個類之間繼承ListActivity,顧名思義柠硕,它可能是一個展示列表工禾,細看代碼,它切實是一個列表展示類蝗柔,這個類的主要作用就是展示手機掃描到的可用藍牙闻葵;點擊選擇的BLE后將BLE的屬性(名稱和ID)傳遞到DeviceControlActivity類;

該類的主要流程就是 在onCreate方法中判斷手機是否支持BLE癣丧,然后初始化藍牙適配器槽畔,最后就是手機的權(quán)限適配(藍牙需要定位的權(quán)限)
在onResume方法中檢測藍牙是否開啟,沒有開啟那就開啟藍牙胁编,不開啟的話那么就觸發(fā)onActivityResult方法則finish()關(guān)閉app竟痰,開啟藍牙的話則
開啟掃描 scanLeDevice(true); true為開啟掃描 false為關(guān)閉掃描;在掃描的方法scanLeDevice中可以看到通過handler計時掃描十秒鐘掏呼;
開啟掃描后將會回調(diào) mLeScanCallback 對象;在這個對象中重寫了onLeScan方法铅檩,這個方法中的參數(shù)onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord)中device則為藍牙設(shè)備屬性憎夷;將藍牙設(shè)備屬性展示到列表中,通listview監(jiān)聽選中 的藍牙跳轉(zhuǎn)到DeviceControlActivity類昧旨;

DeviceControlActivity類中要功能:

開啟服務(wù)BluetoothLeService拾给,接收服務(wù)傳過來的藍牙數(shù)據(jù);里面有幾個重要的類部類:
ServiceConnection(BinderService的返回數(shù)據(jù)接收類)兔沃;BluetoothGattCallback(廣播蒋得,接收服務(wù)發(fā)送過來的消息); ExpandableListView.OnChildClickListener(這是一個list二級列表的監(jiān)聽類)乒疏;里面還有一個重要的方法就displayGattServices(listview的適配器)额衙;

該類的主要流程:注冊廣播并接收,在onCreate中對一些控件的初始化,通過intent傳值獲取到藍牙的名稱和ID窍侧,然后啟動服務(wù)县踢;在ServiceConnection內(nèi)部類中得到服務(wù)的對象 mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();在 onResume方法中通過服務(wù)的對象建立藍牙的連接,注意 藍牙連接后還并不能通信伟件,建立通信使用通過UUID的硼啤;藍牙建立連接后會觸發(fā)廣播action為BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED方法,在這個方法中通過調(diào)用displayGattServices方法展示藍牙的UUID的數(shù)據(jù)斧账,可以看到藍牙有很多UUID谴返,其實UUID是分可讀的,可寫的咧织,和可讀可寫的嗓袱,這應(yīng)該是藍牙廠家寫好的固件;在app上我們可以挨個的點擊不同的UUID將會建立不同的連接拯爽,其中就有一種連接可以信索抓;點擊UUID將會OnChildClickListener()方法,里面的邏輯主要就是開啟藍牙的讀取功能和開啟藍牙的的通知功能
mBluetoothLeService.setCharacteristicNotification(mNotifyCharacteristic, false);
mBluetoothLeService.readCharacteristic(characteristic);

BluetoothLeService類主要功能:

就是通過UUID建立藍牙通訊毯炮,readCharacteristic()開啟藍牙讀的功能逼肯,setCharacteristicNotification()開啟藍牙或禁用通知的功能;getSupportedGattServices()只有在成功完成之后才會調(diào)用此函數(shù)桃煎。在連接的設(shè)備上檢索受支持的有關(guān)協(xié)定服務(wù)列表篮幢,里面沒有藍牙寫數(shù)據(jù)的方法,要自己寫为迈;

該類的主要流程就是通過DeviceControlActivity類傳過來的藍牙ID建立藍牙連接
final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
其中里面有一個非常重要的類mGattCallback回調(diào)三椿,這里面重寫了幾個方法
onConnectionStateChange()藍牙連接狀態(tài)改變的回調(diào);
onServicesDiscovered()服務(wù)發(fā)現(xiàn)的回調(diào)在這個方法中可以建立藍牙的連接
onCharacteristicRead()藍牙的特征葫辐;
onCharacteristicChanged()Characteristic狀態(tài)改變的回調(diào)
onCharacteristicWrite)()Characteristic寫操作的結(jié)果回調(diào):

這里說一下重點:通過上面的解釋還是會知其然不知其所以然搜锰。

藍牙讀數(shù)據(jù)有兩種方法:

一種是調(diào)用readCharacteristic()方法 開啟讀 ,一種是通過通知來讀 setCharacteristicNotification方法耿战;

通過uuid 讀某個Characteristic

開啟讀

mBluetoothLeService.readCharacteristic(characteristic);

public void readCharacteristic(BluetoothGattCharacteristiccharacteristic) {
        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized");
            return;
        }
        mBluetoothGatt.readCharacteristic(characteristic);
}

如果成功蛋叼,數(shù)據(jù)會在下面的方法回調(diào)中傳進來

public void  onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status){
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        }

還可以通過通知的回調(diào)方法讀取數(shù)據(jù) 這種方式不用手機去輪詢地讀設(shè)備上的數(shù)據(jù)。

 //設(shè)置true為啟用通知,false反之
  setCharacteristicNotification(mNotifyCharacteristic, true);

有消息來后會回調(diào)方法
public void  onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status){
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        }

寫數(shù)據(jù)就更簡單了
通過UUID獲取到BluetoothGattCharacteristic

BluetoothGattCharacteristic alertLevel =linkLossService.getCharacteristic(UUID.fromString("49535343-8841-43f4-a8d4-ecbe34729bb3"));
alertLevel.setValue(values_on);
status = mBluetoothGatt.writeCharacteristic(alertLevel);

status如果為true剂陡,表示寫操作已經(jīng)成功執(zhí)行狈涮,BluetoothGattCallback抽象類的一個方法會被執(zhí)行,如果剛好你又重寫了這個方法鸭栖,就可以打印一些消息了

public void onCharacteristicWrite(BluetoothGatt gatt,BluetoothGattCharacteristiccharacteristic, int status){

}

官方的demo沒有用發(fā)送數(shù)據(jù)的代碼歌馍,接收數(shù)據(jù)也是16進制,這個需要自己按實際情況修改代碼或是在網(wǎng)上找一些demo有收發(fā)功能的晕鹊,開放項目復(fù)雜多變松却,這里很難以偏概全暴浦,就不一一展示了;

總結(jié):藍牙收發(fā)數(shù)據(jù)每次最多20個字節(jié)玻褪,這就要對接收的數(shù)據(jù)進行拼接肉渴,截取了;發(fā)送數(shù)據(jù)也是以20個字節(jié)為單位带射,一段一段發(fā)送同规;藍牙對于有些人來說也許會很難, 但是琢磨久了就會看懂的窟社;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末券勺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灿里,更是在濱河造成了極大的恐慌关炼,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匣吊,死亡現(xiàn)場離奇詭異儒拂,居然都是意外死亡,警方通過查閱死者的電腦和手機色鸳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門社痛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人命雀,你說我怎么就攤上這事蒜哀。” “怎么了吏砂?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵撵儿,是天一觀的道長。 經(jīng)常有香客問我狐血,道長淀歇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任匈织,我火速辦了婚禮房匆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘报亩。我一直安慰自己,他們只是感情好井氢,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布弦追。 她就那樣靜靜地躺著,像睡著了一般花竞。 火紅的嫁衣襯著肌膚如雪劲件。 梳的紋絲不亂的頭發(fā)上掸哑,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音零远,去河邊找鬼苗分。 笑死,一個胖子當(dāng)著我的面吹牛牵辣,可吹牛的內(nèi)容都是我干的摔癣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼纬向,長吁一口氣:“原來是場噩夢啊……” “哼择浊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逾条,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤琢岩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后师脂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體担孔,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年吃警,在試婚紗的時候發(fā)現(xiàn)自己被綠了糕篇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡汤徽,死狀恐怖娩缰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谒府,我是刑警寧澤拼坎,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站完疫,受9級特大地震影響泰鸡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壳鹤,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一盛龄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芳誓,春花似錦余舶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赂摆,卻和暖如春挟憔,著一層夾襖步出監(jiān)牢的瞬間钟些,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工绊谭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留政恍,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓达传,卻偏偏與公主長得像篙耗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子趟大,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容