藍(lán)牙介紹和在iOS中的使用

概述

藍(lán)牙,一種無(wú)線(xiàn)通訊技術(shù)標(biāo)準(zhǔn),用來(lái)在短距離間交換數(shù)據(jù),以形成個(gè)人局域網(wǎng)。其使用短波特高頻無(wú)線(xiàn)電波。1994年由電信商愛(ài)立信發(fā)展出這個(gè)技術(shù),從早期的1.0到目前最新的5.0版本,中間經(jīng)過(guò)了十幾年的發(fā)展。這里著重關(guān)注的是藍(lán)牙4.0以及4.0之后的規(guī)范,藍(lán)牙4.0于2010年7月7號(hào)推出,4.0之前的藍(lán)牙統(tǒng)稱(chēng)為經(jīng)典藍(lán)牙,4.0之后又加入了低功耗功能并且有效的傳輸距離拓展到了最大的60米。如今藍(lán)牙由藍(lán)牙技術(shù)聯(lián)盟(Bluetooth Special Interest Group,簡(jiǎn)稱(chēng)SIG)管理,負(fù)責(zé)監(jiān)督藍(lán)牙規(guī)范的開(kāi)發(fā),管理認(rèn)證項(xiàng)目,并維護(hù)商標(biāo)權(quán)益,制造商的設(shè)備也必須符合藍(lán)牙技術(shù)聯(lián)盟的標(biāo)準(zhǔn)才能以“藍(lán)牙設(shè)備”的名義進(jìn)入市場(chǎng)。藍(lán)牙的波段為2400-2483.5MHz。這是全球范圍內(nèi)無(wú)需取得執(zhí)照(但并非無(wú)管制的)的 2.4 GHz 短距離無(wú)線(xiàn)電頻段。

技術(shù)類(lèi)型

藍(lán)牙技術(shù)分為基礎(chǔ)率/增強(qiáng)數(shù)據(jù)率(BR/EDR)和低耗能(LE)兩種技術(shù)類(lèi)型。

應(yīng)用

藍(lán)牙技術(shù)已經(jīng)應(yīng)用到超過(guò)3萬(wàn)個(gè)聯(lián)盟技術(shù)成員的82億件產(chǎn)品之中。

1 2 3
汽車(chē)
藍(lán)牙免提調(diào)用系統(tǒng);車(chē)載音頻娛樂(lè)系統(tǒng);監(jiān)測(cè)和診斷機(jī)電系統(tǒng)
消費(fèi)類(lèi)電子產(chǎn)品
電視和游戲系統(tǒng),家用游戲機(jī)的手柄,包括PS4、PSP Go、 Wii、Switch。
家居自動(dòng)化
智能家居,室內(nèi)的照明、溫度、家用電器、窗戶(hù)和門(mén)鎖等安全系統(tǒng)以及牙刷、鞋墊等日常用品。
醫(yī)療和保健
血糖監(jiān)測(cè)儀、脈搏血氧儀、心率監(jiān)視器、哮喘吸入器等產(chǎn)品
手機(jī)
移動(dòng)電話(huà)和免提設(shè)備之間的無(wú)線(xiàn)通訊,這也是最初流行的應(yīng)用。
電腦與外設(shè)
鼠標(biāo)、鍵盤(pán)、耳機(jī)、打印機(jī)等
可穿戴設(shè)備
智能眼鏡、耳機(jī)、活動(dòng)監(jiān)測(cè)儀、兒童和寵物監(jiān)視器、醫(yī)療救助、頭部和手部安裝終端以及攝像機(jī)
運(yùn)動(dòng)和健身
健身跟蹤手環(huán)和智能手表,瑜伽墊、棒球棍等
零售和位置導(dǎo)向式服務(wù)
實(shí)時(shí)定位系統(tǒng)(RTLS),應(yīng)用"節(jié)點(diǎn)"或"標(biāo)簽"嵌入被跟蹤物品中讀卡器從標(biāo)簽接收并處理無(wú)線(xiàn)信號(hào)以確定物品位置。

缺陷

干擾

Bluetooth在2.4GHz的電波干擾問(wèn)題一直為大家所詬病,特別和無(wú)線(xiàn)局域網(wǎng)間的互相干擾問(wèn)題。有干擾發(fā)生時(shí),就以重新發(fā)送數(shù)據(jù)包的方法來(lái)解決干擾。

傳輸距離有限

iOS中的藍(lán)牙

使用過(guò)程

蘋(píng)果對(duì)藍(lán)牙設(shè)備的要求

蘋(píng)果在 iPhone 4S 及之后的手機(jī)型號(hào)開(kāi)始支持藍(lán)牙4.0,低于藍(lán)牙4.0協(xié)議的設(shè)備需要進(jìn)行MFI認(rèn)證。

MFi

什么是MFi認(rèn)證

蘋(píng)果MFi認(rèn)證,是蘋(píng)果公司對(duì)其授權(quán)配件廠(chǎng)商生產(chǎn)的外置配件的一種標(biāo)識(shí)使用許可,是 Made for iPod, Made for iPhone, Made for iPad的英文縮寫(xiě)。

蘋(píng)果MFi認(rèn)證類(lèi)型及重要性

開(kāi)發(fā)許可認(rèn)證:打算開(kāi)發(fā)或者幫助開(kāi)發(fā)但不生產(chǎn)配件的廠(chǎng)商,可以申請(qǐng)MFi開(kāi)發(fā)認(rèn)證

生產(chǎn)許可認(rèn)證:打算生產(chǎn)配件并且擁有生產(chǎn)設(shè)備的企業(yè)可以申請(qǐng)MFi生產(chǎn)許可證

一個(gè)擁有MFi技術(shù)開(kāi)發(fā)證書(shū)的公司搭配一個(gè)擁有MFi生產(chǎn)制造證書(shū)的公司才能做出MFi認(rèn)證的產(chǎn)品

nRF connect

nRF Connect 是一個(gè)功能強(qiáng)大的藍(lán)牙工具,可讓您掃描和瀏覽低功耗藍(lán)牙設(shè)備并與之通信。蘋(píng)果商店有售!

iOS藍(lán)牙庫(kù)

CoreBluetooth.framework

CoreBluetooth框架提供了的iOS和Mac應(yīng)用程序與配備了藍(lán)牙低能耗無(wú)線(xiàn)技術(shù)的設(shè)備進(jìn)行通信所需的類(lèi)。例如,應(yīng)用程序可以發(fā)現(xiàn),搜索低耗能的外圍設(shè)備并與之交互。從macOS 10.9和iOS 6開(kāi)始,Mac和iOS設(shè)備還可以用作低功耗藍(lán)牙外圍設(shè)備,向其他設(shè)備(包括其他Mac和iOS設(shè)備)提供數(shù)據(jù)。

該框架是用于低能耗設(shè)備的藍(lán)牙4.0規(guī)范的抽象。它向開(kāi)發(fā)人員隱藏了規(guī)范的許多底層細(xì)節(jié),使您更容易開(kāi)發(fā)與藍(lán)牙低功耗設(shè)備交互的應(yīng)用。因?yàn)樵摽蚣芑谝?guī)范,所以已經(jīng)采用了規(guī)范中的一些概念和術(shù)語(yǔ)。

重要提示:在iOS 10.0或更高版本上的iOS應(yīng)用程序必須在其Info.plist文件中包含使用說(shuō)明鍵,以說(shuō)明需要訪(fǎng)問(wèn)的數(shù)據(jù)類(lèi)型,否則它將崩潰。要專(zhuān)門(mén)訪(fǎng)問(wèn)藍(lán)牙外圍設(shè)備數(shù)據(jù),它必須包含NSBluetoothPeripheralUsageDescription。

中央和外圍設(shè)備及其在藍(lán)牙通信中的作用

所有低功耗藍(lán)牙通信都涉及兩個(gè)主要參與者:中央和外圍設(shè)備。某種程度上基于傳統(tǒng)的客戶(hù)端-服務(wù)器體系結(jié)構(gòu),外圍設(shè)備通常具有其他設(shè)備所需的數(shù)據(jù)。一個(gè)中心通常使用由外圍設(shè)備提供的信息來(lái)完成一些特定的任務(wù)。如圖所示,心率監(jiān)視器可能會(huì)提供有用的信息,你的Mac或iOS應(yīng)用程序可能需要這些信息,以便以用戶(hù)友好的方式顯示用戶(hù)的心率。

中央設(shè)備和外圍設(shè)備

中心設(shè)備搜索并連接到發(fā)送廣告的外圍設(shè)備

外設(shè)以廣告包的形式廣播一些數(shù)據(jù)。廣告包是一個(gè)相對(duì)較小的數(shù)據(jù)包,其中可能包含外設(shè)必須提供什么有用的信息比如外設(shè)的名稱(chēng)和主要功能。例如,數(shù)字恒溫器可能會(huì)聲明它提供房間當(dāng)前的溫度。在低能耗藍(lán)牙技術(shù)中,廣告是外設(shè)讓其他設(shè)備知道其存在的主要方式。

另一方面,一個(gè)中心設(shè)備可以?huà)呙韬捅O(jiān)聽(tīng)任何外圍設(shè)備的廣告信息,如圖所示。中心設(shè)備可以要求連接到它發(fā)現(xiàn)的、發(fā)送廣告的任何外設(shè)。

廣告和發(fā)現(xiàn)

外設(shè)的數(shù)據(jù)是如何構(gòu)造的

連接外設(shè)的目的是發(fā)現(xiàn)外設(shè)提供的數(shù)據(jù)并與之交互。不過(guò)在進(jìn)行此操作之前,了解外設(shè)數(shù)據(jù)的結(jié)構(gòu)將有所幫助。

外設(shè)可以包含一個(gè)或多個(gè)服務(wù),或提供有關(guān)其連接信號(hào)強(qiáng)度的有用信息。服務(wù)是完成設(shè)備(或該設(shè)備的一部分)的功能或特性的數(shù)據(jù)和相關(guān)行為的集合。例如,心率監(jiān)控器的一項(xiàng)服務(wù)是可以從監(jiān)控器的心率傳感器公開(kāi)心率數(shù)據(jù)。

服務(wù)本身由特征或包含的服務(wù)(即對(duì)其他服務(wù)的引用)組成。特征提供有關(guān)外設(shè)服務(wù)進(jìn)一步的細(xì)節(jié)。例如,剛才描述的心率服務(wù)可能包含Body sensor location特征和傳輸心率測(cè)量數(shù)據(jù)的另一個(gè)特征。圖片顯示了心率監(jiān)視器服務(wù)和特征一種可能的結(jié)構(gòu)。

外圍設(shè)備的服務(wù)和特性

中心設(shè)備在外圍設(shè)備上發(fā)現(xiàn)數(shù)據(jù)并與之交互

中心成功建立與外圍設(shè)備的連接后,便可以發(fā)現(xiàn)外圍設(shè)備必須提供的全部服務(wù)和特性(廣告數(shù)據(jù)可能只包含一部分可用服務(wù))。

中心還可以通過(guò)讀取或?qū)懭朐摲?wù)的特性值來(lái)與外圍設(shè)備的服務(wù)進(jìn)行交互。例如,應(yīng)用程序可能從數(shù)字恒溫器請(qǐng)求當(dāng)前的室溫,或者可能為恒溫器提供一個(gè)用于設(shè)置室溫的值。

中心,外圍設(shè)備和外圍設(shè)備數(shù)據(jù)的表示方式

低功耗藍(lán)牙通信中涉及的主要參與者和數(shù)據(jù)以一種簡(jiǎn)單,直接的方式映射到Core Bluetooth框架。

中心設(shè)備側(cè)的對(duì)象

當(dāng)使用本地中心與遠(yuǎn)程外設(shè)交互時(shí),是在藍(lán)牙低能耗通信的中心端執(zhí)行操作。除非正在設(shè)置一個(gè)本地外圍設(shè)備并使用它來(lái)響應(yīng)中心的請(qǐng)求,否則大部分藍(lán)牙相關(guān)事務(wù)將在中心端進(jìn)行。

本地中心設(shè)備和遠(yuǎn)程外圍設(shè)備

在中心設(shè)備側(cè),本地中心設(shè)備由CBCentralManager對(duì)象表示。這些對(duì)象用于管理發(fā)現(xiàn)或連接的遠(yuǎn)程外圍設(shè)備(以CBPeripheral對(duì)象表示),包括掃描,發(fā)現(xiàn)和連接到廣告外圍設(shè)備。圖片顯示了如何在Core Bluetooth框架中表示本地中心和遠(yuǎn)程外圍設(shè)備。

中心設(shè)備的對(duì)象

遠(yuǎn)程外圍設(shè)備的數(shù)據(jù)由CBService和CBCharacteristic對(duì)象表示

在與遠(yuǎn)程外圍設(shè)備(由CBPeripheral對(duì)象表示)上的數(shù)據(jù)進(jìn)行交互時(shí),實(shí)際是在處理其服務(wù)和特征。在Core Bluetooth框架中,遠(yuǎn)程外圍設(shè)備的服務(wù)由CBService對(duì)象表示,遠(yuǎn)程外圍設(shè)備的服務(wù)特征由CBCharacteristic對(duì)象表示。圖片說(shuō)明了遠(yuǎn)程外圍設(shè)備的服務(wù)和特征的基本結(jié)構(gòu)。

遠(yuǎn)程外圍設(shè)備的服務(wù)樹(shù)和特征

作為外設(shè)

從macOS 10.9和iOS 6開(kāi)始,Mac和iOS設(shè)備可以用作低功耗藍(lán)牙外圍設(shè)備,向其他設(shè)備(包括其他Mac,iPhone和iPad設(shè)備)提供數(shù)據(jù)。設(shè)置設(shè)備以實(shí)現(xiàn)外圍設(shè)備角色時(shí),則是在藍(lán)牙低功耗通信的外圍設(shè)備上執(zhí)行操作。

本地外圍設(shè)備和遠(yuǎn)程中心

在外設(shè)方面,本地外設(shè)由CBPeripheralManager對(duì)象表示。這些對(duì)象用來(lái)管理發(fā)布的服務(wù),這些服務(wù)在本地外設(shè)上“特征和服務(wù)”數(shù)據(jù)庫(kù)中,并將這些服務(wù)發(fā)布到遠(yuǎn)程中央設(shè)備(由CBCentral對(duì)象表示)。外設(shè)管理器對(duì)象還用于響應(yīng)來(lái)自這些遠(yuǎn)程中心的讀寫(xiě)請(qǐng)求。圖片顯示了如何在CoreBluetooth框架中表示本地外設(shè)和遠(yuǎn)程中心。

作為外設(shè)時(shí)的對(duì)象表示

本地外圍設(shè)備的數(shù)據(jù)由CBMutableService和CBMutableCharacteristic對(duì)象表示

在本地外圍設(shè)備(由CBPeripheralManager對(duì)象表示)上設(shè)置數(shù)據(jù)并與之交互時(shí),您正在處理其服務(wù)和特性的可變版本。在Core Bluetooth框架中,本地外圍設(shè)備的服務(wù)由CBMutableService對(duì)象表示。同樣,本地外圍設(shè)備的服務(wù)特征由CBMutableCharacteristic對(duì)象表示。圖片說(shuō)明了本地外圍設(shè)備的服務(wù)和特征的基本結(jié)構(gòu)。

本地外圍設(shè)備的服務(wù)樹(shù)和特征

iOS應(yīng)用狀態(tài)影響藍(lán)牙行為

當(dāng)您的iOS應(yīng)用處于后臺(tái)或掛起狀態(tài)時(shí),其與藍(lán)牙相關(guān)的功能會(huì)受到影響。默認(rèn)情況下,應(yīng)用程序在后臺(tái)或處于掛起狀態(tài)時(shí)將無(wú)法執(zhí)行低功耗藍(lán)牙任務(wù)。就是說(shuō)如果應(yīng)用需要在后臺(tái)執(zhí)行藍(lán)牙低能耗任務(wù),則可以聲明它支持一種或兩種Core Bluetooth后臺(tái)執(zhí)行模式(其中一種用于中心角色,一種用于外圍角色)。即使聲明了這兩種后臺(tái)執(zhí)行模式中的一種或兩種,當(dāng)?shù)膽?yīng)用程序在后臺(tái)運(yùn)行時(shí),某些藍(lán)牙任務(wù)也會(huì)以不同的方式運(yùn)行。在設(shè)計(jì)應(yīng)用程序時(shí),需要考慮這些差異。

系統(tǒng)甚至可以隨時(shí)終止支持后臺(tái)處理的應(yīng)用程序,以釋放當(dāng)前前臺(tái)應(yīng)用程序的內(nèi)存。從iOS 7開(kāi)始,Core Bluetooth支持保存中央和外圍設(shè)備管理器對(duì)象的狀態(tài)信息,并在應(yīng)用啟動(dòng)時(shí)恢復(fù)該狀態(tài)??梢允褂么斯δ軄?lái)支持涉及藍(lán)牙設(shè)備的長(zhǎng)期操作。

BabyBlueTooth

GitHub開(kāi)源庫(kù),封裝了CoreBluetooth,將眾多的delegate寫(xiě)成了block方法

MTU

MTU是在連接過(guò)程中協(xié)商的。iOS會(huì)自動(dòng)使用兩款設(shè)備支持的最大值。iOS支持185,所以這是支持的最大值。如果外圍設(shè)備MTU小于185,則使用該值。沒(méi)有開(kāi)放的iOS API來(lái)請(qǐng)求MTU更改/更新。相反,此請(qǐng)求需要由外設(shè)發(fā)起。

Code

掃描藍(lán)牙設(shè)備

初始化

引入頭文件#import <CoreBluetooth/CoreBluetooth.h>
CBCentralManager是藍(lán)牙中心設(shè)備的管理類(lèi),控制著藍(lán)牙的掃描,連接,藍(lán)牙狀態(tài)的改變。

dispatch_queue_t queue = dispatch_queue_create(@"centralQueue", DISPATCH_QUEUE_SERIAL);
NSDictionary *dict = @{CBCentralManagerOptionShowPowerAlertKey : @YES, CBCentralManagerOptionRestoreIdentifierKey : @"unique identifier"};
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQueue options:dict];

CBCentralManagerOptionShowPowerAlertKey設(shè)為YES,表示初始化centralManager時(shí),如果藍(lán)牙沒(méi)有打開(kāi),則會(huì)彈出提示框

掃描

// CBCentralManagerScanOptionAllowDuplicatesKey設(shè)置為NO表示不重復(fù)掃描已發(fā)現(xiàn)的設(shè)備。
NSDictionary *option = @{CBCentralManagerScanOptionAllowDuplicatesKey : [NSNumber numberWithBool:NO], CBCentralManagerOptionShowPowerAlertKey:@YES}; 
[self.centralManager scanForPeripheralsWithServices:nil options:option];
// 可以在serviceUUIDs參數(shù)中提供表示服務(wù)uuid的CBUUID對(duì)象數(shù)組,這樣中央管理器只返回指定的服務(wù)的外圍設(shè)備。如果serviceUUIDs參數(shù)為nil,該方法將返回所有發(fā)現(xiàn)的外設(shè),不管它們支持的服務(wù)是什么。
- (void)scanForPeripheralsWithServices:(nullable NSArray<CBUUID *> *)serviceUUIDs options:(nullable NSDictionary<NSString *, id> *)options;

CBCentralManagerDelegate代理方法
@required,centralManager初始化之后會(huì)調(diào)用這個(gè)方法,返回centralManager的狀態(tài)

- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
/**
*  @enum CBManagerState
*
*  @discussion Represents the current state of a CBManager.
*
*  @constant CBManagerStateUnknown       State unknown, update imminent.
*  @constant CBManagerStateResetting     The connection with the system service was momentarily lost, update imminent.
*  @constant CBManagerStateUnsupported   The platform doesn't support the Bluetooth Low Energy Central/Client role.
*  @constant CBManagerStateUnauthorized  The application is not authorized to use the Bluetooth Low Energy role.
*  @constant CBManagerStatePoweredOff    Bluetooth is currently powered off.
*  @constant CBManagerStatePoweredOn     Bluetooth is currently powered on and available to use.
*
*  @seealso  authorization
*/
@available(iOS 10.0, *)
public enum CBManagerState : Int {
    case unknown = 0
    case resetting = 1
    case unsupported = 2
    case unauthorized = 3
    case poweredOff = 4
    case poweredOn = 5
}

發(fā)現(xiàn)外設(shè)

// CBPeripheral代表外設(shè)類(lèi)
// advertisementData代表廣播值,一般攜帶設(shè)備名,serviceUUIDs等信息
// RSSI代表信號(hào)值,絕對(duì)值越大信號(hào)越差,設(shè)備離的越遠(yuǎn)。
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI;

連接藍(lán)牙設(shè)備

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { 
    if ([peripheral.name isEqualToString:@"YDPen"]) {
        // 發(fā)起連接 
        [self.centralManager connectPeripheral:peripheral options:nil];
        self.peripheral = peripheral;
    }
}

藍(lán)牙連接狀態(tài)

連接外設(shè)(connectPeripheral)后會(huì)調(diào)用CBCentralManagerDelegate一些代理方法

// 連接成功的回調(diào)
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
// 連接失敗的回調(diào)
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;
// 連接斷開(kāi)的回調(diào)
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;

外設(shè)的服務(wù)與特性

連接成功后還需傳輸數(shù)據(jù),數(shù)據(jù)傳輸是以特性(CBCharacteristic)為基礎(chǔ)??梢韵韧ㄟ^(guò) nRF connect 觀察一下外設(shè)的一些屬性

廣告信息

Advertisement Data就是廣播信息。

iOS藍(lán)牙無(wú)法直接獲取設(shè)備藍(lán)牙MAC地址,可以將MAC地址放到這里廣播出來(lái)。

服務(wù)與特征

FEBEServiceUUID,可以以此來(lái)搜索外設(shè)??梢钥吹椒?wù)中包含的特性及其UUID和屬性

Properties是特征的屬性,可以看出此特征可以有寫(xiě)、通知的權(quán)限。特征擁有的權(quán)限類(lèi)別有如下幾種:

/*
*  @enum CBCharacteristicProperties
*
*  @discussion Characteristic properties determine how the characteristic value can be used, or how the descriptor(s) can be accessed. Can be combined. Unless
*              otherwise specified, properties are valid for local characteristics published via @link CBPeripheralManager @/link.
*
*  @constant CBCharacteristicPropertyBroadcast                     Permits broadcasts of the characteristic value using a characteristic configuration descriptor. Not allowed for local characteristics.
*  @constant CBCharacteristicPropertyRead                          Permits reads of the characteristic value.
*  @constant CBCharacteristicPropertyWriteWithoutResponse          Permits writes of the characteristic value, without a response.
*  @constant CBCharacteristicPropertyWrite                         Permits writes of the characteristic value.
*  @constant CBCharacteristicPropertyNotify                        Permits notifications of the characteristic value, without a response.
*  @constant CBCharacteristicPropertyIndicate                      Permits indications of the characteristic value.
*  @constant CBCharacteristicPropertyAuthenticatedSignedWrites     Permits signed writes of the characteristic value
*  @constant CBCharacteristicPropertyExtendedProperties            If set, additional characteristic properties are defined in the characteristic extended properties descriptor. Not allowed for local characteristics.
*  @constant CBCharacteristicPropertyNotifyEncryptionRequired      If set, only trusted devices can enable notifications of the characteristic value.
*  @constant CBCharacteristicPropertyIndicateEncryptionRequired    If set, only trusted devices can enable indications of the characteristic value.
*/
typedef NS_OPTIONS(NSUInteger, CBCharacteristicProperties) {
    CBCharacteristicPropertyBroadcast                                               = 0x01,
    CBCharacteristicPropertyRead                                                    = 0x02,
    CBCharacteristicPropertyWriteWithoutResponse                                    = 0x04,
    CBCharacteristicPropertyWrite                                                   = 0x08,
    CBCharacteristicPropertyNotify                                                  = 0x10,
    CBCharacteristicPropertyIndicate                                                = 0x20,
    CBCharacteristicPropertyAuthenticatedSignedWrites                               = 0x40,
    CBCharacteristicPropertyExtendedProperties                                      = 0x80,
    CBCharacteristicPropertyNotifyEncryptionRequired NS_ENUM_AVAILABLE(10_9, 6_0)   = 0x100,
    CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(10_9, 6_0) = 0x200
};

數(shù)據(jù)傳輸

上面說(shuō)過(guò)數(shù)據(jù)傳輸是基于特性的,下面看看如何使用CBPeripheral及其代理方法,通過(guò)特性發(fā)送、讀取、監(jiān)聽(tīng)數(shù)據(jù)
首先看看CBPeripheral的幾個(gè)代理方法

// 發(fā)現(xiàn)服務(wù)
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error;
// 發(fā)現(xiàn)特性
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error;
// 數(shù)據(jù)有更新
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;
// 在使用writeValue方法時(shí),指定了寫(xiě)入類(lèi)型為CBCharacteristicWriteWithResponse時(shí),會(huì)調(diào)用此方法
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;

在設(shè)備連接成功后,需要搜索服務(wù)及服務(wù)中的特性,需要使用如下方法

// 搜索外設(shè)中的服務(wù),會(huì)調(diào)用代理的didDiscoverServices方法
- (void)discoverServices:(NSArray<CBUUID *> *)serviceUUIDs;
// 搜索特性,會(huì)調(diào)用代理的didDiscoverCharacteristicsForService方法
- (void)discoverCharacteristics:(NSArray<CBUUID *> *)characteristicUUIDs forService:(CBService *)service;

發(fā)現(xiàn)了特性之后可以據(jù)此來(lái)進(jìn)行數(shù)據(jù)傳輸了

向外設(shè)發(fā)送數(shù)據(jù)

- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;

從外設(shè)讀取數(shù)據(jù)

`- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;

當(dāng)調(diào)用此方法讀取特征值時(shí),外圍設(shè)備會(huì)調(diào)用其代理的peripheral:didUpdateValueForCharacteristic:error:方法。如果外設(shè)成功讀取了特征的值,則可以通過(guò)特征的value屬性訪(fǎng)問(wèn)它。并不是所有的特征都具有可讀權(quán)限。可通過(guò)CBCharacteristicProperties枚舉的相關(guān)屬性來(lái)確定特征是否可讀。

監(jiān)聽(tīng)通知

- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;

監(jiān)聽(tīng)到從特征發(fā)來(lái)的數(shù)據(jù)時(shí)會(huì)調(diào)用peripheral:didUpdateValueForCharacteristic:error:代理方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容