轉載自網上大佬的文檔,具體鏈接不詳
藍牙
藍牙分為傳統藍牙和BLE藍牙兩種連接方式。對於蘋果的iOS系統來講傳統藍牙需要經過蘋果的安全認證,因此都是走BLE藍牙通道通道進行通信。
BLE是Bluetooth Low Energy的縮寫,又叫藍牙4.0,區別於藍牙3.0和之前的技術。
l 藍牙雙模簡稱BR(統藍牙和BLE藍牙兩種都有),商標為Bluetooth Smart Ready;
l 單模簡稱BLE或者LE,商標為Bluetooth Smart
Android是在4.3后才支持BLE,這說明不是所有藍牙手機都支持BLE,而且支持BLE的藍牙手機一般是雙模的。雙模兼容傳統藍牙,可以和傳統藍牙通信,也可以和BLE通信,常用在手機上,Android4.3和IOS4.0之后版本都支持BR,也就是雙模設備。
藍牙傳輸的最大數據包MTU在不同手機和設備上也是不同,一般是通過設備和手機之間進行通信約定的。
iOS可以通過maximumWriteValueLengthForType獲得設備的最大數據包(iOS9以后);
Android則是在API 21(Android 5.1)有一個 BluetoothGatt 新增一個requestMtu()的方法來調整MTU。
https://developer.android.com/reference/android/bluetooth/BluetoothGatt
可以通過“nRFConnect-4.6.1.apk”的第三方應用,可以查看支持的MTU大小,如下圖:

MTU大小調整
1.3.1 傳統藍牙
傳統藍牙3.0根據802.11適配層協議應用了Wi-Fi技術,極大提高了傳輸速度。藍牙3.0的數據傳輸率提高到了大約24Mbps
1、傳統藍牙采用的是SPP(Serial Port Profile)協議進行數據傳輸。
2、SPP的UUID:00001101-0000-1000-8000-00805F9B34FB
3、手機一般以客戶端的角色主動連接SPP協議設備
1.3.2 BLE藍牙
BLE藍牙的最大特點就是低功耗,而低速率和簡單的交互協議是降低功耗的重要組成部分,因此它的的傳輸速率只有2Mbps。
BLE關鍵術語和概念的摘要:
一個ble藍牙設備有多個包括多個Profile。
一個Profile中有多個服務Service(通過服務的uuid找到對應的Service)。
一個Service中有多個特征Characteristic(通過特征的uuid找到對應的Characteristic)
一個Characteristic中包括一個value和多個Descriptor(通過Descriptor的uuid找到對應的Descriptor)
其次,要知道一些名詞:
1、profileprofile
可以理解為一種規范,一個標准的通信協議,它存在於從機中。
藍牙組織規定了一些標准的profile,例如 HID OVER GATT,防丟器,心率計等。
每個profile中會包含多個service,每個service代表從機的一種能力。
2、service
可以理解為一個服務,在ble從機中,通過有多個服務,例如電量信息服務、系統信息服務等,每個service中又包含多個characteristic特征值。
每個具體的characteristic特征值才是ble通信的主題。比如當前的電量是80%,所以會通過電量的characteristic特征值存在從機的profile里,這樣主機就可以通過這個characteristic來讀取80%這個數據
3、characteristic
特征值,ble主從機的通信均是通過characteristic來實現,可以理解為一個標簽,通過這個標簽可以獲取或者寫入想要的內容。
官方特征值定義:
https://www.bluetooth.com/specifications/gatt/characteristics/
4、UUIDUUID
統一識別碼,我們剛才提到的service和characteristic,都需要一個唯一的uuid來標識UUID的格式:00001101-0000-1000-8000-00805F9B34FB
綜上,每個從機都會有一個叫做profile的東西存在,不管是上面的自定義的simpleprofile,還是標准的防丟器profile,他們都是由一些列service組成,然后每個service又包含了多個characteristic,主機和從機之間的通信,均是通過characteristic來實現。
BLE協議棧架構圖
其中有一個UUID非常特殊,它被藍牙聯盟采用為官方UUID,這個UUID如下所示:
藍牙聯盟將自己定義的attribute或者數據只用16bit UUID來表示上圖xxxx位置,其實它也是128bit。
例如設備的UUID掃描結果如下圖所示:

UUID實例
l 第1個UUID 0x2A05標識:
Service Changed org.bluetooth.characteristic.gatt.service_changed 0x2A05
l 第2個UUID 0x2A00標識:
Device Name org.bluetooth.characteristic.gap.device_name 0x2A00

Device Name長度可以到248字節,但一般不會需要那么長的名字,一般會建議最長到達40字節就好了。
l 第3個UUID 0x2A01標識:
Appearance org.bluetooth.characteristic.gap.appearance 0x2A01

Appearance即表明這是個什么設備,如鼠標?鍵盤?等等
l 第4個UUID 0x2AA6標識:
Central Address Resolution org.bluetooth.characteristic.gap.central_address_resolution 0x2AA6

BT 4.2添加的新特性。因為在BT 4.2中,為了提高BT的安全性(原來SMP的方式是可以破解的),加入了Random Address的內容。這里的Central Address Resolution就是用來表明暴露GAP Service的這個Central設備,是否支持Resolvable Private Address(RPA)的。
Peripheral設備通過讀對方Central設備的GAP Service的Central Address Resolution,就能知道其是否支持RPA了,如果其支持,那Peripheral就可以在自己的Directed Advertisement中使用RPA了。如果不支持,那還是只能使用public地址了。
關於藍牙的public地址,private地址,請參考:
https://blog.csdn.net/suxiang198/article/details/47730649
l 第5-6個UUID 0xFFF1和0xFFF2標識分別是讀取和寫入;
l 第7-8個UUID標識也是讀取和寫入;
l 第9-11個UUID標識是支持微信的接口;
一般讀,寫和通知的UUID 就是 characteristic UUID
另外注意,連接設備前,請先關閉掃描藍牙,否則連接成功后,再次掃描會發生阻塞,掃描不到設備。
