#蓝牙
* iOS 提供了4个框架用雨蓝牙连接传输
* 1. GameKit: (用法简单), iOS7过期, 只能用与 iOS 设备间的传输多用于游戏
* 2. MutipeerConnectivity.framework: 只能 iOS 设备间, iOS7开始, 主要是文件共享(仅限沙盒内), 取代1.
* 3. ExternalAccessory.framework: 可用与第三方蓝牙设备交互, 但是那些设备要警告苹果 MFi 认证,(国内较少, 要交钱), 不推荐
* 4. CoreBluetooth.framework: 当下热门, 推荐, 可用于第三方, 且必须支持4.0, 很多都支持了, 蓝烨4.0又叫做 BLE(bluetooth Low Energy)目前应用较多: 手环, 嵌入式设备, 智能家居(iOS8后有个专门做智能家居的 HomeKit)
##GameKit: 这个只能在同一个程序之间传数据, 因为这样才能知道数据的格式和接收方法
* 先建立连接, 展示可以连接的设备, 再通过蓝牙将设备发过去,
* 展示设备有一个控制器可以展示, 直接创建好就可以: 设备列表控制器:, 显示很简单, show 就行, 即创建->show
* 如果和别人连接成功, 需要手动销毁弹窗, 通过代理, 在连接完成的方法中销毁弹窗, dismiss
* 代理方法回调传入连接到的点的蓝牙 id 和一个会话 session, 等下就是通过这个会话来传输数据,
* 可以选择一个图片, 点击发送就将图片发送到另一个设备上
* 在连接成功后返回的 session 保存起来, 并将自己传给 session , 处理接收的数据(接收到蓝牙设备传输的数据时,就会调用self的receiveData:fromPeer:inSession:context:)
[self.session setDataReceiveHandler:self withContext:nil];
* 在发送数据的方法中将数据转成二进制 data, 通过 session 会话发送数据 [self.session sendDataToAllPeers:datawithDataMode:GKSendDataReliable error:nil];
* 在接收数据的方法中(即之前设置 session 的 handler的方法)将二进制转成对应数据进行处理即可
*
#bug: 一方点击连接后, 另一方没有反应, 还是在列表状态么没有弹出是否接收的提示
#bug: 点击接受后, 没有任何反应了, connecting 一下后就连接失败
#Core Bluetooth
* 每个蓝牙设备都是通过 Service 和Characteristic来展示自己, 你做为外设, 总要给中心提供点什么才能交互吧
* 一个设备至少有一个服务每个服务下包含若干特征
* 特征: 与外界交互的最小单位. 如: 设备 A 是描述出厂信息, B 是收发数据
* 服务和特征都有唯一标识 UUID, 通过 UUID 就能区别不同的服务和特征
* 设备中的服务和特征, 都是由厂商提供的, 类似接口
*
#未做, 跟进度, 这个在后期需要的时候用小米手环实验一下http://www.jianshu.com/p/053f8756f57a |https://github.com/markdashi/MIBLE
##开发步奏
1. 建立中心设备
2. 扫描外设, 穿nil 即扫描所有外设
3. 连接外设
4. 扫描外设中的服务和特征
5. 利用特征与外设交互数据
6. 断开连接
* 查找, 连接到外设都会通知中心代理, 扫描外设服务在连接到外设后,调用传进来的外设来去搜索服务, 当扫描服务完毕后调用外设代理方法, 其并未传会发现的服务, 但是这个方法调用内, 其外设的 services 已经有值, 可以在里面获取
* 找到想要的服务后, 接着扫描服务下的特征, 调用代理方法, 然后过滤不要的特征, 强引用想要的特征, 之后就可以给这个外设进行数据交互
* 可以在搜索附近设备的时候传入服务 UUID 数组, 就只会发现有这些服务的设备, 不好使就传 nil, 就会发现所有设备
*
##使用场景: BLE + iBeacon 有很大的想象空间, 但是国内目前应用还不广泛
#bug(centralManager 创建后没有反应): 创建后会自动去发现周围设备, 但是不能调用代理方法—– 创建时没有设置代理