iOS中提供了4個框架用于實現(xiàn)藍(lán)牙連接
- GameKit.framework(用法簡單)
-只能用于iOS設(shè)備之間的同個應(yīng)用內(nèi)連接,多用于游戲(eg.拳皇,棋牌類),從iOS7開始過期 - MultipeerConnectivity.framework(代替1)
-只能用于iOS設(shè)備之間的連接,從iOS7開始引入,主要用于非聯(lián)網(wǎng)狀態(tài)下,通過wifi或者藍(lán)牙進(jìn)行文件共享(
-限于沙盒的文件),多用于附近無網(wǎng)聊天 - ExternalAccessory.framework(MFi)
-可用于第三方藍(lán)牙設(shè)備交互,但是藍(lán)牙設(shè)備必須經(jīng)過蘋果MFi認(rèn)證(國內(nèi)很少) - CoreBluetooth.framework(時下熱門)
-可用于第三方藍(lán)牙設(shè)備交互,必須要支持藍(lán)牙4.0
-硬件至少是4s,系統(tǒng)至少是iOS6
-藍(lán)牙4.0以低功耗著稱,一般也叫BLE(Bluetooth Low Energy)
-目前應(yīng)用比較多的案例:運動手環(huán),嵌入式設(shè)備,智能家居
BLE中心模式流程
- 建立中心設(shè)備角色
- 掃描外部設(shè)備
- 連接外部設(shè)備
- 掃描外部設(shè)備的服務(wù)和特征Characteristic
4.1 發(fā)現(xiàn)服務(wù)
4.2 發(fā)現(xiàn)特征,獲取特征的權(quán)限描述Descriptor - 讀取,寫入特征的值
- 特征添加通知
- 斷開連接
藍(lán)牙設(shè)備的狀態(tài)
- 待機狀態(tài)(standby):設(shè)備沒有傳輸和發(fā)送數(shù)據(jù),并且沒有連接到任何外設(shè)
- 廣播狀態(tài)(Advertiser):周期性廣播狀態(tài)
- 掃描狀態(tài)(Scanner):主動搜索正在廣播的設(shè)備
- 發(fā)起鏈接狀態(tài)(Initiator):主動向掃描設(shè)備發(fā)起連接
- 主設(shè)備(Master):作為主設(shè)備連接到其它設(shè)備.
- 從設(shè)備(Slave):作為從設(shè)備鏈接到其它設(shè)備
藍(lán)牙設(shè)備的五種工作狀態(tài)
- 準(zhǔn)備(Standby)
- 廣播(Advertising)
- 監(jiān)聽掃描(Scanning)
- 發(fā)起連接(Initiating)
- 已連接(Connected)
BLE測試
- 兩臺BLE設(shè)備
- 如何讓iOS模擬器也能測試BLE?
買一個CSR藍(lán)牙4.0 USB適配器,插在Mac上
在終端輸入sudo nvram bluetoothHostControllerSwitchBehavior="never"
重啟Mac
用Xcode4.6調(diào)試代碼,將程序跑在iOS6.1模擬器上
蘋果把iOS7.0模擬器對BLE的支持移除了
AirDrop(裝逼用)
蘋果在2010推出的OS X 10.7 Lion系統(tǒng)中加入了全新的AirDrop功能,該功能允許兩臺Mac機之間無線傳輸文件。 區(qū)別于傳統(tǒng)的局域網(wǎng)文件共享方式,AirDrop不要求兩臺機器在同一個網(wǎng)絡(luò)內(nèi)。 用戶無需設(shè)置,只需要打開AirDrop文件夾即可查看到其他用戶,分享文件變得非常便捷。
AirDrop不需要基于(無線)路由器或者手動建立熱點組網(wǎng),它是利用Mac與Mac之間的點對點網(wǎng)絡(luò)來進(jìn)行會話傳輸。 這一切由系統(tǒng)在后臺完成,無需斷開當(dāng)前WiFi網(wǎng)絡(luò),也不影響當(dāng)前連接WiFi網(wǎng)絡(luò)的通信,就可以與其他Mac通過內(nèi)置特定信道通信。
WWDC13上推出的iOS7也開始支持iOS設(shè)備之間使用AirDrop實現(xiàn)共享傳輸。 關(guān)于AirDrop的條件要求及內(nèi)部機制,可參考《為什么iOS 7 和 OS X 之間的AirDrop 不能互傳?》。 WWDC14推出的OS X 10.10 Yosemite操作系統(tǒng),終于打通了與iOS移動設(shè)備之間的跨平臺AirDrop傳輸。 運行Mac OS X Yosemite 10.10版本的Mac設(shè)備(型號≥2012)和運行iOS 7及以上的iOS設(shè)備(≥iPhone5,≥iPad 4,iPad mini,≥iPod touch)之間才能實現(xiàn)跨平臺文件傳輸。
根據(jù)官方資料顯示,AirDrop基于藍(lán)牙和WiFi實現(xiàn)(AirDrop does the rest using Wi-Fi and Bluetooth)。 具體來說,通過低功耗藍(lán)牙技術(shù)(BLE)進(jìn)行發(fā)現(xiàn)(Advertising/Browsing),使用WiFi Direct(P2P WiFi)技術(shù)進(jìn)行數(shù)據(jù)傳輸。 可參考《iOS 7的AirDrop是利用什么信號來傳輸?shù)??》《What Is AirDrop? How Does It Work?》。
因此,開啟AirDrop不要求雙方必須聯(lián)網(wǎng)或連接到同一局域網(wǎng),但必須同時打開WiFi和藍(lán)牙,且進(jìn)行傳輸?shù)膬膳_設(shè)備必須保持在9米的范圍之內(nèi)。
BLE中心模式流程
1.建立中心設(shè)備角色
2.掃描外部設(shè)備
3.連接外部設(shè)備
4.掃描外部設(shè)備的服務(wù)和特征Characteristic
4.1 發(fā)現(xiàn)服務(wù)
4.2 發(fā)現(xiàn)特征,獲取特征的權(quán)限描述Descriptor
5.利用特征與外部設(shè)備進(jìn)行數(shù)據(jù)交互
6.添加特征的通知
7.斷開連接
Peripheral
|
|
services
|
|
characteristics : value
| |
| |
descriptor :value properties :value
外部設(shè)備Peripheral
1.屬性
@property(weak, nonatomic, nullable) id<CBPeripheralDelegate> delegate; 代理
@property(retain, readonly, nullable) NSString *name; 名字
@property(retain, readonly, nullable) NSNumber *RSSI NS_DEPRECATED(NA, NA, 5_0, 8_0);信號強度
@property(readonly) CBPeripheralState state; 狀態(tài)
@property(retain, readonly, nullable) NSArray<CBService *> *services; 服務(wù)
2.方法
讀取信號量
- (void)readRSSI;
發(fā)現(xiàn)服務(wù)
- (void)discoverServices:(nullable NSArray<CBUUID *> *)serviceUUIDs;
發(fā)現(xiàn)包含的服務(wù)
- (void)discoverIncludedServices:(nullable NSArray<CBUUID *> *)includedServiceUUIDs forService:(CBService *)service;
發(fā)現(xiàn)特征
- (void)discoverCharacteristics:(nullable NSArray<CBUUID *> *)characteristicUUIDs forService:(CBService *)service;
讀取特征的值
- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;
- (NSUInteger)maximumWriteValueLengthForType:(CBCharacteristicWriteType)type NS_AVAILABLE(NA, 9_0);
寫特征的值
- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;
設(shè)置通知的值
- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;
發(fā)現(xiàn)特征的描述
- (void)discoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic;
讀取描述的值
- (void)readValueForDescriptor:(CBDescriptor *)descriptor;
寫描述的值
- (void)writeValue:(NSData *)data forDescriptor:(CBDescriptor *)descriptor;
3.代理方法
@optional
- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral
- (void)peripheral:(CBPeripheral *)peripheral didModifyServices:(NSArray<CBService *> *)invalidatedServices
- (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(nullable NSError *)error
- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(nullable NSError *)error
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error;
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverIncludedServicesForService:(CBService *)service error:(nullable NSError *)error;
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error;
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(CBDescriptor *)descriptor error:(nullable NSError *)error;
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForDescriptor:(CBDescriptor *)descriptor error:(nullable NSError *)error;