iOS-蓝牙(CoreBlueTooth)

iOS蓝牙须知

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

1.gameKit.framework(用法简单)

只能用于iOS设备之间的连接,多用于游戏(比如五子棋游戏),从iOS7开始过期(请参考http://www.jianshu.com/p/f58e57f1b424)

2.MultipeerConnectivity.framework

只能用于iOS设备之间的连接,从iOS7开始引入,主要用于文件共享(仅限于沙盒的文件)

3.ExternalAccessory.frameWork

可用于第三方蓝牙设备交互,但是蓝牙设备必须经过苹果MFi认证(国内较少)

4.CoreBluetooh.framework(时下热门)

可用于第三方蓝牙设备交互,必须要支持蓝牙4.0(硬件至少是4s,系统至少iOS6,蓝牙4.0以低功耗著称,一般也叫BLE(Bluetooth low Energy) 目前应用比较多的案例:运动手环,嵌入式设备,智能家居)

Core Bluetooth框架简介

Core Bluetooth基本常识

1.每个蓝牙4.0设备都是通过服务(Service)和特征(Characteristic)来展示自己的
2.一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征
3.特征是与外界交互的最小单位(比如说:一个蓝牙4.0设备,用特征A来描述自己的出场信息,用特征B来收发数据)
4.服务和特征都是用UUID来唯一标识的,通过UUID就能区分不同的服务和特征
5.设备里面的各个服务(Service)和特征(Characteristic)的功能,均由蓝牙设备硬件厂商提供,比如那些是用来交互(读写),那些可获取模块信息(只读)等

Core Bluetooth的开发步骤

1.建立中心设备(手机)
2.扫描外围设备(Discover Peripheral)
3.连接外围设备(Connect Peripheral)
4.扫描外围设备的服务和特征(Discover Service and Characteristic)
5.利用特征与外围设备做数据交互(Explore And Interact)
6.断开连接(Disconnect)

如何让iOS模拟器也能测试蓝牙4.0程序

1.买一个CSR蓝牙4.0USB适配器,插在Mac上
2.在终端输入 sudo nvram bluetoothHostControllerSwitchBehavior="never"
3.重启Mac

上代码

//
//  ViewController.m
//  蓝牙(CoreBlueTooth)
//
//  Created by ws on 2017/6/14.
//  Copyright © 2017年 王松. All rights reserved.
//

#import "ViewController.h"
#import <CoreBluetooth/CoreBluetooth.h>
@interface ViewController ()<CBCentralManagerDelegate,CBPeripheralDelegate>
///中央管理者
@property(nonatomic,strong)CBCentralManager*mgr;
///存储扫描到的外围设备
@property(nonatomic,strong)NSMutableArray*peripherals;
@end

@implementation ViewController
-(NSMutableArray *)peripherals{
    if (!_peripherals) {
        _peripherals = [NSMutableArray array];
    }
    return _peripherals;
}
#pragma mark 1.建立中央管理者
-(CBCentralManager *)mgr{
    if (!_mgr) {
        //1.建立中央管理者
        self.mgr = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
    }
    return _mgr;
}
#pragma mark CBCentralManager必须实现方法

/**
 状态发生改变的时候会执行该方法(蓝牙4.0没有打开变成打开状态就会执行该方法)
 */
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
    //判断状态
    if (central.state) {
        
    }
}
#pragma mark 扫描到外围设备执行的代理方法

/**
 当发现外围设备的时候会调用该方法
 @param peripheral 发现的外围设备
 @param advertisementData 外围设备发出的信号
 @param RSSI 信号强度
 */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI{
    //先判断 如果我的数组里面已经包含了某个外围设备就不存储啦
    if (![self.peripherals containsObject:peripheral]) {
        [self.peripherals addObject:peripheral];
    }
    
}
#pragma mark 用户连接外围设备
-(void)connect:(CBPeripheral *)peripheral{
    //连接外围设备
    [self.mgr connectPeripheral:peripheral options:nil];
}
#pragma mark 连接到某一个外围设备就会调用该代理方法
/**
 连接到某一个外围设备所走的方法
 @param peripheral 连接上的外围设备
 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
    //1.扫描所有的服务
    //参数:指定扫描该外围设备的那些服务(nil 表示扫描该外围设备的所有服务)
    [peripheral discoverServices:nil];
    //2.设置外围设备的代理
    peripheral.delegate = self;
    
}
#pragma mark CBPeripheralDelegate外围设备的代理方法

/**
 发现扫描到该外围设备的服务的时候执行该方法(扫描到服务之后直接添加到peripheral.services数组对象里面)
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error{
    //对扫描到的该外围设备的服务进行遍历
    for (CBService *service in peripheral.services) {
        //拿到你想要的某个服务
        if ([service.UUID.UUIDString isEqualToString:@"某个服务的UUID"]) {
            NSLog(@"拿到你想要的某个服务");
            //扫描服务里面的所有特征
            //参数1:CBUUID:可以指定这个服务里想要扫描的特征(nil 表示扫描这个服务里面的所有的特征)
            [peripheral discoverCharacteristics:nil forService:service];
        }
    }
}

/**
 当扫描某一个服务的特征的时候会执行该方法(扫描到特征之后直接添加到service.characteristics数组对象里面)

 @param service 在哪一个服务里的特征
 */
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
    for (CBCharacteristic *characteristic in service.characteristics) {
        if ([characteristic.UUID.UUIDString isEqualToString:@"某个特征的UUID"]) {
            //拿到特征 和外围设备进行交互
            //读
           // [peripheral readValueForCharacteristic:characteristic];
            //写
           // peripheral writeValue:<#(nonnull NSData *)#> forCharacteristic:<#(nonnull CBCharacteristic *)#> type:<#(CBCharacteristicWriteType)#>
        }
    }
    
}
- (void)viewDidLoad {
    [super viewDidLoad];
    //1.建立中央管理者
    //2.扫描所有的外围设备
    //参数1:CBUUID 可以将你想要扫描的服务的外围设备传入(传nil表示扫描所有的外围设备)
    //参数2:什么操作
    [self.mgr scanForPeripheralsWithServices:nil options:nil];
}

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

推荐阅读更多精彩内容

  • Guide to BluetoothSecurity原文 本出版物可免费从以下网址获得:https://doi.o...
    公子小水阅读 7,851评论 0 6
  • 前言 最近实验室做了一个IOS设备之间使用蓝牙进行数据交互的项目。中间遇到了很多坑,现在大致讲解一下蓝牙通讯的流程...
    Larrycal阅读 9,622评论 3 36
  • 随着智能家具、智能穿戴等的兴起,蓝牙开发应用越来越广泛,有关蓝牙方面的问题,今天就给大家进行详细的讲解,想要了解蓝...
    知易行难880721阅读 590评论 0 0
  • 虽然说,买得起车也加得起油,但是油耗问题却仍然是一笔不小的开支,积少成多,大家都要养成环保节能的意识。其实开车有很...
    爱车吧阅读 177评论 0 0
  • 这是关于我的故事,是我最想告诉你的故事。 然后,这个故事我没有告诉你。 为什么呢,你可能会觉得我抽了才会想这么多,...
    小雨辰阅读 118评论 0 0