iOS中的蓝牙

iOS中提供了4个框架用于实现蓝牙连接

  1. GameKit.framework(用法简单)
    -只能用于iOS设备之间的同个应用内连接,多用于游戏(eg.拳皇,棋牌类),从iOS7开始过期
  2. MultipeerConnectivity.framework(代替1)
    -只能用于iOS设备之间的连接,从iOS7开始引入,主要用于非联网状态下,通过wifi或者蓝牙进行文件共享(
    -限于沙盒的文件),多用于附近无网聊天
  3. ExternalAccessory.framework(MFi)
    -可用于第三方蓝牙设备交互,但是蓝牙设备必须经过苹果MFi认证(国内很少)
  4. CoreBluetooth.framework(时下热门)
    -可用于第三方蓝牙设备交互,必须要支持蓝牙4.0
    -硬件至少是4s,系统至少是iOS6
    -蓝牙4.0以低功耗著称,一般也叫BLE(Bluetooth Low Energy)
    -目前应用比较多的案例:运动手环,嵌入式设备,智能家居

BLE中心模式流程

  1. 建立中心设备角色
  2. 扫描外部设备
  3. 连接外部设备
  4. 扫描外部设备的服务和特征Characteristic
    4.1 发现服务
    4.2 发现特征,获取特征的权限描述Descriptor
  5. 读取,写入特征的值
  6. 特征添加通知
  7. 断开连接

蓝牙设备的状态

  1. 待机状态(standby):设备没有传输和发送数据,并且没有连接到任何外设
  2. 广播状态(Advertiser):周期性广播状态
  3. 扫描状态(Scanner):主动搜索正在广播的设备
  4. 发起链接状态(Initiator):主动向扫描设备发起连接
  5. 主设备(Master):作为主设备连接到其它设备.
  6. 从设备(Slave):作为从设备链接到其它设备

蓝牙设备的五种工作状态

  1. 准备(Standby)
  2. 广播(Advertising)
  3. 监听扫描(Scanning)
  4. 发起连接(Initiating)
  5. 已连接(Connected)

BLE测试

  1. 两台BLE设备
  2. 如何让iOS模拟器也能测试BLE?
    买一个CSR蓝牙4.0 USB适配器,插在Mac上
    在终端输入sudo nvram bluetoothHostControllerSwitchBehavior="never"
    重启Mac
    用Xcode4.6调试代码,将程序跑在iOS6.1模拟器上
    苹果把iOS7.0模拟器对BLE的支持移除了

AirDrop(装逼用)

苹果在2010推出的OS X 10.7 Lion系统中加入了全新的AirDrop功能,该功能允许两台Mac机之间无线传输文件。 区别于传统的局域网文件共享方式,AirDrop不要求两台机器在同一个网络内。 用户无需设置,只需要打开AirDrop文件夹即可查看到其他用户,分享文件变得非常便捷。
AirDrop不需要基于(无线)路由器或者手动建立热点组网,它是利用Mac与Mac之间的点对点网络来进行会话传输。 这一切由系统在后台完成,无需断开当前WiFi网络,也不影响当前连接WiFi网络的通信,就可以与其他Mac通过内置特定信道通信。
WWDC13上推出的iOS7也开始支持iOS设备之间使用AirDrop实现共享传输。 关于AirDrop的条件要求及内部机制,可参考《为什么iOS 7 和 OS X 之间的AirDrop 不能互传?》。 WWDC14推出的OS X 10.10 Yosemite操作系统,终于打通了与iOS移动设备之间的跨平台AirDrop传输。 运行Mac OS X Yosemite 10.10版本的Mac设备(型号≥2012)和运行iOS 7及以上的iOS设备(≥iPhone5,≥iPad 4,iPad mini,≥iPod touch)之间才能实现跨平台文件传输。
根据官方资料显示,AirDrop基于蓝牙和WiFi实现(AirDrop does the rest using Wi-Fi and Bluetooth)。 具体来说,通过低功耗蓝牙技术(BLE)进行发现(Advertising/Browsing),使用WiFi Direct(P2P WiFi)技术进行数据传输。 可参考《iOS 7的AirDrop是利用什么信号来传输的?》《What Is AirDrop? How Does It Work?》。
因此,开启AirDrop不要求双方必须联网或连接到同一局域网,但必须同时打开WiFi和蓝牙,且进行传输的两台设备必须保持在9米的范围之内。

BLE中心模式流程

1.建立中心设备角色
2.扫描外部设备
3.连接外部设备
4.扫描外部设备的服务和特征Characteristic
4.1 发现服务
4.2 发现特征,获取特征的权限描述Descriptor
5.利用特征与外部设备进行数据交互
6.添加特征的通知
7.断开连接

           Peripheral

              |
              |
           services

              |
              |
        characteristics  : value

        |                         |
        |                         |
   descriptor  :value      properties  :value 

外部设备Peripheral

1.属性

@property(weak, nonatomic, nullable) id 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;                                         状态
@property(retain, readonly, nullable) NSArray *services;                服务
2.方法
读取信号量
- (void)readRSSI;      
发现服务 
- (void)discoverServices:(nullable NSArray *)serviceUUIDs;
发现包含的服务
- (void)discoverIncludedServices:(nullable NSArray *)includedServiceUUIDs forService:(CBService *)service;
发现特征
- (void)discoverCharacteristics:(nullable NSArray *)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;
设置通知的值
- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;
发现特征的描述
- (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 *)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;

你可能感兴趣的:(iOS中的蓝牙)