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<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;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容