AndroidBLE讀寫開(kāi)發(fā)回顧

Android BLE 讀寫開(kāi)發(fā)回顧

這里主要記錄BLE的通訊方面的筆記

1.發(fā)現(xiàn)BluetoothGattService回調(diào)

BLE 調(diào)用gatt.connect()連接成功之后調(diào)用:

gatt.discoverServices()

觸發(fā)回調(diào)void onServicesDiscovered(BluetoothGatt gatt, int status)

通過(guò)硬件規(guī)定的uuid獲取對(duì)應(yīng)的BluetoothGattService:

BluetoothGattService service = gatt.getService(mServiceUuid);

BluetoothGattService中包含一個(gè)或多個(gè)BluetoothGattCharacteristic看疗,這些特征字將是后續(xù)用來(lái)讀寫數(shù)據(jù)的載體澡屡,而

通過(guò)硬件給定的uuid篩選出對(duì)應(yīng)的特征字草讶,譬如有些特征字用于收發(fā)簡(jiǎn)單命令措拇,而有些特征字用于批量發(fā)送數(shù)據(jù):

if (characteristic.getUuid().equals(UUID.fromString(String.format(MEDTRUM_BASE_UUID, MEDTRUM_UUID_CHARACTERISTIC_BULK)))) {
    //獲取批量發(fā)送數(shù)據(jù)特征字
    mBulkCharacteristics = characteristic;
} else if (characteristic.getUuid().equals(UUID.fromString(String.format(MEDTRUM_BASE_UUID, MEDTRUM_UUID_CHARACTERISTIC_CTRLPT)))) {
    //獲取收發(fā)命令特征字
    mCommandCharacteristics = characteristic;
}

在拿到特征字之后并不能直接使用旬陡,如果特征字具有通知功能鸭丛,那么還需要對(duì)其進(jìn)行設(shè)置:

Log.d(TAG, "setCharacteristicNotification: "+gatt.setCharacteristicNotification(characteristic, true));

當(dāng)然褥傍,這還不夠裂问,你會(huì)發(fā)現(xiàn)這個(gè)特征字可以正常的發(fā)送數(shù)據(jù)遭顶,但是接受不到返回?cái)?shù)據(jù)张峰,劃重點(diǎn),這里別忘了對(duì)特征字描述符BluetoothGattDescriptor進(jìn)行設(shè)置:

BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(CLIENT_CHARACTERISTIC_CONFIG));
if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
    mBluetoothGatt.writeDescriptor(descriptor);
} else if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_INDICATE) > 0) {
    descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
    mBluetoothGatt.writeDescriptor(descriptor);
}

設(shè)置描述符調(diào)用了mBluetoothGatt.writeDescriptor(descriptor)方法棒旗,對(duì)應(yīng)的回調(diào)為:

void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status)

在回調(diào)中可以對(duì)對(duì)應(yīng)的描述符進(jìn)行驗(yàn)證是否設(shè)置成功喘批,然后就可以正常的使用特征字收發(fā)命令了;

注意,通常BluetoothGattService并不只包含一個(gè)特征字饶深,而對(duì)特征字的設(shè)置動(dòng)作底層其實(shí)也是一個(gè)寫的命令餐曹,理論上也會(huì)觸發(fā):

void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)

但是在開(kāi)發(fā)過(guò)程中通常并不能在這一步接收到回調(diào),這里的原因我還不是很清楚敌厘,大盘ê铮看到請(qǐng),煩請(qǐng)指點(diǎn)一二俱两,嘻嘻饱狂。

既然是寫的操作,就必須遵循串行操作的原則宪彩,有序的寫嗡官,設(shè)置一個(gè)特征字之后延遲一段時(shí)間,再設(shè)置下一個(gè)毯焕。

這里的延遲時(shí)間比較講究衍腥,Android手機(jī)廠家眾多,所以需要給定的延遲時(shí)間也各不相同纳猫,開(kāi)發(fā)經(jīng)驗(yàn)發(fā)現(xiàn)如果間隔時(shí)間超過(guò)250ms SAMSUNG 2s內(nèi)連接不上會(huì)被動(dòng)斷開(kāi),最終測(cè)試結(jié)果定在了700ms,可以適配目前所有的測(cè)試機(jī)型婆咸,如果有大牛有更好的解決辦法,煩請(qǐng)指點(diǎn)一二芜辕,嘻嘻尚骄。

2.讀寫數(shù)據(jù)

在拿到了特征字之后,就可以進(jìn)行讀寫操作了侵续,寫:

if (mCommandCharacteristics != null) {
    if (value.length > 0) {
        mCommandCharacteristics.setValue(value);
        mBluetoothGatt.writeCharacteristic(mCommandCharacteristics);
    }
}

發(fā)送數(shù)據(jù)之后倔丈,可以通過(guò)回調(diào):

onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)

接收反饋,判斷命令是否發(fā)送成功状蜗。

對(duì)于數(shù)據(jù)的讀取需五,通過(guò)回調(diào):

void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)

來(lái)獲取到反饋的內(nèi)容,可以看到這個(gè)回調(diào)中包含了特征字BluetoothGattCharacteristic很顯然轧坎,我么您可以通過(guò)特征字的uuid來(lái)判斷反饋的數(shù)據(jù)是命令返回宏邮,或者是通知消息;

注意缸血,在讀寫交互中蜜氨,請(qǐng)一定遵守串行傳輸?shù)臏?zhǔn)則,有序的收發(fā)命令捎泻,避免出現(xiàn)奇奇怪怪的bug;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末飒炎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笆豁,更是在濱河造成了極大的恐慌郎汪,老刑警劉巖赤赊,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怒竿,居然都是意外死亡砍鸠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門耕驰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爷辱,“玉大人,你說(shuō)我怎么就攤上這事朦肘》构” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵媒抠,是天一觀的道長(zhǎng)弟断。 經(jīng)常有香客問(wèn)我,道長(zhǎng)趴生,這世上最難降的妖魔是什么阀趴? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮苍匆,結(jié)果婚禮上刘急,老公的妹妹穿的比我還像新娘。我一直安慰自己浸踩,他們只是感情好叔汁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著检碗,像睡著了一般据块。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上折剃,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天另假,我揣著相機(jī)與錄音,去河邊找鬼微驶。 笑死浪谴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的因苹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼篇恒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扶檐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起胁艰,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤款筑,失蹤者是張志新(化名)和其女友劉穎智蝠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奈梳,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杈湾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了攘须。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漆撞。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖于宙,靈堂內(nèi)的尸體忽然破棺而出浮驳,到底是詐尸還是另有隱情,我是刑警寧澤捞魁,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布至会,位于F島的核電站,受9級(jí)特大地震影響谱俭,放射性物質(zhì)發(fā)生泄漏奉件。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一昆著、第九天 我趴在偏房一處隱蔽的房頂上張望县貌。 院中可真熱鬧,春花似錦宣吱、人聲如沸窃这。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杭攻。三九已至,卻和暖如春疤坝,著一層夾襖步出監(jiān)牢的瞬間兆解,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工跑揉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锅睛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓历谍,卻偏偏與公主長(zhǎng)得像现拒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子望侈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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