本文来自 姚兜兜的简书,作者 不灭的小灯灯当下蓝牙开发可谓是越来越火,不论是智能穿戴的兴起还是蓝牙家具,车联网蓝牙等等,很多同学也会接触到蓝牙的项目,我从事蓝牙开发也有一段时间了,经手了两个项目。废话不多说了,先向大家简单的介绍有关蓝牙开发的知识。蓝牙低能耗(BLE),以下介绍的都是围绕iOS的
蓝牙开发分为中心者模式和管理者模式:1.常用的(其实99.99%)就是使用中心者模式作为开发,就是我们手机作为主机,连接蓝牙外设;2.管理者模式,这个基本用到的比较少,我们手机自己作为外设,自己创建服务和特征,然后有其他的设备连接我们的手机。
在做蓝牙开发之前,最好先了解一些概念:
服务(services):蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口;
特征(characteristic):存在于服务下面的,一个服务下面也可以存在多个特征,特征可以理解成具体实现功能的窗口,一般特征都会有value,也就是特征值,特征是与外界交互的最小单位;
UUID:可以理解成蓝牙上的唯一标识符(硬件上肯定不是这个意思,但是这样理解便于我们开发),为了区分不同的服务和特征,或者给服务和特征取名字,我们就用UUID来代表服务和特征。
蓝牙连接可以大致分为以下几个步骤
1.建立一个Central Manager实例进行蓝牙管理
4.获得外围设备的服务
7.给外围设备发送数据
首先我们先导入系统的BLE的框架
#import
@property (nonatomic, strong) CBCentralManager *cMgr;
/* 连接到的外设 /
@property (nonatomic, strong) CBPeripheral *peripheral;
1.建立一个Central Manager实例进行蓝牙管理
-(CBCentralManager *)cmgr{ if (!_cmgr) { _cMgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; } return _cMgr;}//只要中心管理者初始化 就会触发此代理方法 判断手机蓝牙状态- (void)centralManagerDidUpdateState:(CBCentralManager *)central{ switch (central.state) { case 0: NSLog(@”CBCentralManagerStateUnknown”); break; case 1: NSLog(@”CBCentralManagerStateResetting”); break; case 2: NSLog(@”CBCentralManagerStateUnsupported”);//不支持蓝牙 break; case 3: NSLog(@”CBCentralManagerStateUnauthorized”); break; case 4: { NSLog(@”CBCentralManagerStatePoweredOff”);//蓝牙未开启 } break; case 5: { NSLog(@”CBCentralManagerStatePoweredOn”);//蓝牙已开启 // 在中心管理者成功开启后再进行一些操作 // 搜索外设 [self.cMgr scanForPeripheralsWithServices:nil // 通过某些服务筛选外设 options:nil]; // dict,条件 // 搜索成功之后,会调用我们找到外设的代理方法 // – (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI; //找到外设 } break; default: break; }}2.搜索外围设备 (我这里为了举例,采用了自己身边的一个手环)
// 发现外设后调用的方法- (void)centralManager:(CBCentralManager *)central // 中心管理者 didDiscoverPeripheral:(CBPeripheral *)peripheral // 外设 advertisementData:(NSDictionary *)advertisementData // 外设携带的数据 RSSI:(NSNumber *)RSSI // 外设发出的蓝牙信号强度{ //NSLog(@”%s, line = %d, cetral = %@,peripheral = %@, advertisementData = %@, RSSI = %@”, __FUNCTION__, __LINE__, central, peripheral, advertisementData, RSSI); /* peripheral =
// 中心管理者连接外设成功- (void)centralManager:(CBCentralManager *)central // 中心管理者 didConnectPeripheral:(CBPeripheral *)peripheral // 外设{ NSLog(@”%s, line = %d, %@=连接成功”, __FUNCTION__, __LINE__, peripheral.name); // 连接成功之后,