在公司調(diào)試藍(lán)牙4.0的適合弄到了同事小米的手環(huán),然后網(wǎng)上查到相關(guān)的資料,找到別人破解的控制手環(huán)震動(dòng)的接口,于是我就做了一點(diǎn)微小的工作,嘿嘿嘿。
<h3>一、藍(lán)牙4.0介紹</h3>
藍(lán)牙4.0應(yīng)用開發(fā)中比較常與開發(fā)者打交道的是GATT(The Generic Attribute Profile)協(xié)議,GATT協(xié)議確定了ble連接中的Server和Client進(jìn)行數(shù)據(jù)交互的過程和格式,它是ble通信的核心,也是ble應(yīng)用開發(fā)者必須了解的。舉個(gè)簡(jiǎn)單例子,小米手環(huán)中的各種數(shù)據(jù),例如行走距離、熱量消耗等都是通過GATT進(jìn)行傳輸
GATT協(xié)議實(shí)際跟HTTP協(xié)議比較像,在HTTP協(xié)議中,Client向Server請(qǐng)求一個(gè)特定的URL,然后Server收到請(qǐng)求后,根據(jù)這個(gè)URL以及相關(guān)的參數(shù)向Client發(fā)送對(duì)應(yīng)的數(shù)據(jù)。而在GATT中,與URL對(duì)應(yīng)的就是UUID,Client向Server請(qǐng)求特定的UUID,然后Server把這個(gè)UUID對(duì)應(yīng)的數(shù)據(jù)發(fā)送給Client。除了讀取數(shù)據(jù)之外,Client還可以向Server對(duì)應(yīng)的UUID寫入數(shù)據(jù),這個(gè)跟HTTP的post請(qǐng)求有點(diǎn)相似。
在GATT,數(shù)據(jù)是通過分層的方式進(jìn)行組織的,如下圖所示。

每一個(gè)Server可以有多個(gè)Service,每個(gè)Service下面可以有多個(gè)Characteristic,每一個(gè)Characteristic下面可以有多個(gè)Descripter。其中Service、Characteristic、Descripter都有自己的唯一UUID。Characteristic、Descripter都對(duì)應(yīng)著特定自己的數(shù)據(jù),Client可以向Server請(qǐng)求其對(duì)應(yīng)的數(shù)據(jù),并可以對(duì)其中的某些數(shù)據(jù)進(jìn)行寫操作。
其中值得注意的是每一個(gè)UUID對(duì)應(yīng)的數(shù)據(jù)的最大長(zhǎng)度被限制為512個(gè)字節(jié)。
**小米手環(huán)的名字對(duì)應(yīng)的UUID如下:**
Service:0000ffe0-0000-1000-8000-00805f9b34fb
Characteristic:0000ff02 -0000-1000-8000-00805f9b34fb </code>
<h3>二、調(diào)戲手環(huán)</h3>
**小米手環(huán)的震動(dòng)控制對(duì)應(yīng)的UUID如下:**
Service:00001802-0000-1000-8000-00805f9b34fb
Characteristic:00002a06-0000-1000-8000-00805f9b34fb
往該Characteristic中寫入1時(shí)會(huì)震動(dòng)兩次,寫入2時(shí)會(huì)震動(dòng)八次。</code>
知道了對(duì)應(yīng)的UUID,一切就比較好辦了。首先掃描設(shè)備,接下來連接設(shè)備,然后發(fā)現(xiàn)服務(wù),獲取到對(duì)應(yīng)的Characteristic,再往里面寫數(shù)據(jù),一氣呵成。

部分Android代碼如下:
UUID shakeServiceUUID=UUID.fromString("00001802-0000-1000-8000-00805f9b34fb");
UUID shakeCharaUUID=UUID.fromString("00002a06-0000-1000-8000-00805f9b34fb");
BluetoothGattService shakeService=mBluetoothGatt.getService(shakeServiceUUID);
BluetoothGattCharacteristic shakeChara=shakeService.getCharacteristic(shakeCharaUUID);
//1震動(dòng)兩次,2震動(dòng)八次
shakeChara.setValue(new byte[2]);
mBluetoothGatt.writeCharacteristic(shakeChara);
參考資料:
safari
Xiaomi Mi Band BLE Protocol reverse-engineering and API
小米手環(huán)藍(lán)牙協(xié)議研究
藍(lán)牙學(xué)習(xí)之①:調(diào)戲小米手環(huán)