蓝牙
iOS中提供了4个框架用于实现蓝牙连接
* GameKit.framework (已过时)
* MultipeerConnectivity.framework (代替GameKit) - 只能用于iOS设备之间的连接,从iOS7开始引入,主要用于非联网状态下,通过wifi或者蓝牙进行文件共享(仅限于沙盒的文件),多用于附近无网聊天
* ExternalAccessory.framework(MFi) - 可用于第三方蓝牙设备交互,但是蓝牙设备必须经过苹果MFi认证(国内很少)
* CoreBluetooth.framework - 可用于第三方蓝牙设备交互,必须要支持蓝牙4.0,蓝牙4.0以低功耗著称,一般也叫BLE`(Bluetooth Low Energy)`。目前应用比较多的案例:运动手环,嵌入式设备,智能家居2
3
4
MultipeerConnectivity
在iOS7中,引入了一个全新的框架——Multipeer Connectivity(多点连接)。利用Multipeer Connectivity 框架,即使在没有连接到WiFi(WLAN)或移动网络的情况下,距离较近的Apple设备(iMac/iPad/iPhone)之间可基于蓝牙和WiFi(P2P WiFi)技术进行发现和连接实现近场通信。
Multipeer Connectivity扩充的功能与利用AirDrop传输文件非常类似,可以将其看作AirDrop不能直接使用的补偿,代价是需要自己实现。
相比AirDrop,Multipeer Connectivity在进行发现和会话时并不要求同时打开WiFi和蓝牙,也不像AirDrop那样强制打开这两个开关,而是根据条件适时选择使用蓝牙或(和)WiFi。粗略测试情况如下:
* 双方WiFi和蓝牙都未打开:无法发现。
* 双方都开启蓝牙:通过蓝牙发现和传输。
* 双方都开启WiFi:通过WiFi Direct发现和传输,速度接近AirDrop(Reliable速率稍低),不知道同一WLAN下是否优先走局域网?
* 双方都同时开启了WiFi和蓝牙:应该是模拟AirDrop,通过低功耗蓝牙技术扫描发现握手,然后通过WiFi Direct传输。2
3
4
iOS14注意需要在info.plist文件中增加相关权限,my-service指的是服务名称,需要跟项目中的一致,否则会报"-72008”错误。
<key>NSLocalNetworkUsageDescription</key>
<string>Reason for using Bonjour that the user can understand</string>
<key>NSBonjourServices</key>
<array>
<string>_my-service._tcp</string>
<string>_my-service._udp</string>
</array>2
3
4
5
6
7
MultipeerConnectivity常用类
* MCPeerID - 用于标识连接的两端endpoint,通常是昵称或设备名称。
* MCNearbyServiceAdvertiser - 可以接收,并处理用户请求连接的响应。但是,这个类会有回调,告知有用户要与您的设备连接,然后可以自定义提示框,以及自定义连接处理。
* MCNearbyServiceBrowser - 用于搜索附近的用户,并可以对搜索到的用户发出邀请加入某个会话中。 主线程`(com.apple.main-thread(serial))`创建MCNearbyServiceBrowser并启动`startBrowsingForPeers`。 `MCNearbyServiceBrowserDelegate`异步回调(foundPeer/lostPeer)切换回主线程。 主线程创建MCSession并启动invitePeer。
* MCSession - 启用和管理Multipeer连接会话中的所有人之间的沟通。 通过Sesion,给别人发送数据 注意,peerID并不具备设备识别属性。 类似TCP链接中的socket。创建MCSession时,需指定自身MCPeerID,类似bind。 为避免频繁的会话数据通知阻塞主线程
* MCAdvertiserAssistant - 可以接收,并处理用户请求连接的响应
* MCBrowserViewController - MCBrowserViewController 弹出搜索框,需要手动modal,继承自UIViewController,提供了基本的UI应用框架2
3
4
5
6
ExternalAccessory
External Accessory Framework提供了配件连接iOS设备的通道。开发者可以通过它来开发连 接配件的app。配件可以通过30pin、蓝⽛、USB的⽅式连接iOS设备。
External Accessory Framework 常用的三个类:
* EAAccessory 代表了⼀个单例的硬件配件对象
* EAAccessoryManager 管理所有连接到iPhone的配件。
* EASession 定义了iPhone app与外部配件的连接和通道。2
3
常用属性:
@property (nonatomic, readonly, getter = isConnected) BOOL connected; //配件是否连接iPhone的标志
@property (nonatomic, readonly) NSUInteger connectionID; //连接设备的配件唯⼀标识
@property (nonatomic, readonly) NSString *firmwareRevision; // 固件版本信息,注意兼容性
@property (nonatomic, readonly) NSString *hardwareRevison; //硬件版本信息
@property (nonatomic, readonly) NSString *manufacturer; //配件所属公司
@property (nonatomic, readonly) NSString *modelNumber; //配件设备号
@property (nonatomic, readonly) NSString *name; //配件名称,反馈给⽤户连接了正确的配件
@property (nonatomic, readonly) NSArray *protocolStrings; //protocols的名称,注意,跟connectionID对应,是⼀个NSArray的对象
@property (nonatomic, readonly) NSString *serialNumber; // 连接的配件序列号,每个配件唯⼀
常量 `EAConnectionIDNone` 实质为0,⽆效的连接,通过与connectionID的⽐较,可以尝试重连配
件或者提⽰⽤户断开配件重新连接设备。2
3
4
5
6
7
8
9
10
11
12
CoreBluetooth
蓝牙常见名称和缩写:
* BLE: `(Bluetooth low energy)`蓝牙4.0设备因为低耗电,也叫BLE
* `CBCentralMannager` 中心模式 :以手机(app)作为中心,连接其他外设的场景
* `CBPeripheralManager` 外设模式:使用手机作为外设连接其他中心设备操作的场景
* `CBService` 服务: 外设可以包含一个或多个服务,它是用于实现装置的功能或特征数据相关联的行为集合。
* `CBCharacteristic` 特征:每个服务可以对应多个特征,它是提供外设服务进一步的细节。2
3
4
5
因为苹果设备的安全性和封闭性,苹果设备不能通过与其他设备蓝牙链接进行文件传输等功能,所以在iOS与蓝牙开发的编程中是CBCentralMannager 中心模式编程居多.
CBPeripheral 、CBService、CBCharacteristic 之间的关系
一个CBPeripheral表示一个外设,可以在设备列表搜索到一个或多个CBService,一个CBService对应一个或多个CBCharacteristic,每一个CBCharacteristic对应着蓝牙设备的不同属性,通过读的CBCharacteristic可以获取到蓝牙设备发送出来的信息,通过写的CBCharacteristic可以由客户端向蓝牙设备发送指令.
BLE中心模式流程
1. 建立中心角色
2. 扫描外设(Discover Peripheral)
3. 连接外设(Connect Peripheral)
4. 扫描外设中的服务和特征(Discover Services And Characteristics)
4.1 获取外设的services
4.2 获取外设的Characteristics,获取characteristics的值,,获取Characteristics的Descriptor和Descriptor的值
5. 利用特征与外设做数据交互(Explore And Interact)
6. 订阅Characteristic的通知
7. 断开连接(Disconnect)2
3
4
5
6
7
8
9
BLE外设模式流程
1. 启动一个Peripheral管理对象
2. 本地peripheral设置服务,特征,描述,权限等等
3. peripheral发送广告
4. 设置处理订阅,取消订阅,读characteristic,写characteristic的代理方法2
3
4
iBeacon简介
- iBeacon起源:苹果在WWDC2013上正式推出了iBeacon,并且在iOS7设备商配置了该功能
- iBeacon应用:苹果期望将其作为一种技术标准,这个标准允许移动App(包括iOS和Android设备)监听来自于iBeacon设备上的信号并作出响应.
- iBeacon设备:配备有BLE通信功能,并使用BLE向周围发送自己特有的ID,移动设备上的App在接收到该ID后可以作出相应的反应.比如,我们在店铺里设置iBeacon发射器,便可以让应用接收到信息并将这一信息通知给服务器,服务器向我们的App返回与该店铺相关的产品或折扣信息.
- 本质上讲,iBeacon技术允许App了解他们在某个局部范围内的位置,并向用户分发基于位置的超文本上下文内容.
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米的范围之内。