iOS中的藍(lán)牙

iOS中提供了4個框架用于實現(xiàn)藍(lán)牙連接

  1. GameKit.framework(用法簡單)
    -只能用于iOS設(shè)備之間的同個應(yīng)用內(nèi)連接,多用于游戲(eg.拳皇,棋牌類),從iOS7開始過期
  2. MultipeerConnectivity.framework(代替1)
    -只能用于iOS設(shè)備之間的連接,從iOS7開始引入,主要用于非聯(lián)網(wǎng)狀態(tài)下,通過wifi或者藍(lán)牙進(jìn)行文件共享(
    -限于沙盒的文件),多用于附近無網(wǎng)聊天
  3. ExternalAccessory.framework(MFi)
    -可用于第三方藍(lán)牙設(shè)備交互,但是藍(lán)牙設(shè)備必須經(jīng)過蘋果MFi認(rèn)證(國內(nèi)很少)
  4. 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中心模式流程

  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. 讀取,寫入特征的值
  6. 特征添加通知
  7. 斷開連接

藍(lán)牙設(shè)備的狀態(tài)

  1. 待機狀態(tài)(standby):設(shè)備沒有傳輸和發(fā)送數(shù)據(jù),并且沒有連接到任何外設(shè)
  2. 廣播狀態(tài)(Advertiser):周期性廣播狀態(tài)
  3. 掃描狀態(tài)(Scanner):主動搜索正在廣播的設(shè)備
  4. 發(fā)起鏈接狀態(tài)(Initiator):主動向掃描設(shè)備發(fā)起連接
  5. 主設(shè)備(Master):作為主設(shè)備連接到其它設(shè)備.
  6. 從設(shè)備(Slave):作為從設(shè)備鏈接到其它設(shè)備

藍(lán)牙設(shè)備的五種工作狀態(tài)

  1. 準(zhǔn)備(Standby)
  2. 廣播(Advertising)
  3. 監(jiān)聽掃描(Scanning)
  4. 發(fā)起連接(Initiating)
  5. 已連接(Connected)

BLE測試

  1. 兩臺BLE設(shè)備
  2. 如何讓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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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