iOS中提供了4个框架用于实现蓝牙连接
- GameKit.framework(用法简单)
-只能用于iOS设备之间的同个应用内连接,多用于游戏(eg.拳皇,棋牌类),从iOS7开始过期 - MultipeerConnectivity.framework(代替1)
-只能用于iOS设备之间的连接,从iOS7开始引入,主要用于非联网状态下,通过wifi或者蓝牙进行文件共享(
-限于沙盒的文件),多用于附近无网聊天 - ExternalAccessory.framework(MFi)
-可用于第三方蓝牙设备交互,但是蓝牙设备必须经过苹果MFi认证(国内很少) - CoreBluetooth.framework(时下热门)
-可用于第三方蓝牙设备交互,必须要支持蓝牙4.0
-硬件至少是4s,系统至少是iOS6
-蓝牙4.0以低功耗著称,一般也叫BLE(Bluetooth Low Energy)
-目前应用比较多的案例:运动手环,嵌入式设备,智能家居
BLE中心模式流程
- 建立中心设备角色
- 扫描外部设备
- 连接外部设备
- 扫描外部设备的服务和特征Characteristic
4.1 发现服务
4.2 发现特征,获取特征的权限描述Descriptor - 读取,写入特征的值
- 特征添加通知
- 断开连接
蓝牙设备的状态
- 待机状态(standby):设备没有传输和发送数据,并且没有连接到任何外设
- 广播状态(Advertiser):周期性广播状态
- 扫描状态(Scanner):主动搜索正在广播的设备
- 发起链接状态(Initiator):主动向扫描设备发起连接
- 主设备(Master):作为主设备连接到其它设备.
- 从设备(Slave):作为从设备链接到其它设备
蓝牙设备的五种工作状态
- 准备(Standby)
- 广播(Advertising)
- 监听扫描(Scanning)
- 发起连接(Initiating)
- 已连接(Connected)
BLE测试
- 两台BLE设备
- 如何让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<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; 状态
@property(retain, readonly, nullable) NSArray<CBService *> *services; 服务
2.方法
读取信号量
- (void)readRSSI;
发现服务
- (void)discoverServices:(nullable NSArray<CBUUID *> *)serviceUUIDs;
发现包含的服务
- (void)discoverIncludedServices:(nullable NSArray<CBUUID *> *)includedServiceUUIDs forService:(CBService *)service;
发现特征
- (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;
设置通知的值
- (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<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;