蓝牙:
背景
蓝牙的实现方案:
CoreBluetooth.framework
创建中心角色
扫描外设
连接外设
蓝牙开发:
背景:
iOS的蓝牙不能用来传输文件。
iOS与iOS设备之间进行数据通信,使用gameKit.framework
iOS与其他非iOS设备进行数据通信,使用coreBluetooth.framework
iOS中蓝牙的实现方案
iOS中提供了4个框架用于实现蓝牙连接
GameKit.framework(用法简单)
只能用于iOS设备之间的连接,以前多用于游戏(棋牌)
MultipeerConnectivity.framework
只能用于iOS设备之间的选择,从iOS7开始引入,主要用于文件共享(仅限于沙盒的文件)
ExternalAccessory.framework
可用于第三方蓝牙设备交互,但是蓝牙设备必须经过苹果MFi认证(国内少)
CoreBluetooth.framework
可用于第三方蓝牙设备交互,目前应用比较多的案例:运动手环、嵌入式设备、智能家居
//蓝牙系统库
#import
//必须要由UUID来唯一标示对应的service和characteristic,通过UUID区分不同的服务和特征
一个设备必然包含一个或者多个服务,每个服务下面又包含若干个特征
特征是与外界交互的最小单位
比如,一台蓝牙设备,用特征A来描述自己的出场信息,用特征B来收发数据
设备里面各个服务和特征的功能,都是由蓝牙设备硬件厂商提供,比如哪些是用来交互(读写),哪些可获取模块信息(只读)
蓝牙连接的参数者:
蓝牙中心:(CBCentralManager):一般指iPhone手机
设备(外设):(CBPeripheral):装有蓝牙芯片的智能硬件
外设的服务:peripheral.services数组,CBService对象:硬件可以提供很多服务,实际上就是把硬件的功能分模块,比如手环的震动和亮起来的颜色是两个不同服务
服务下的特征(CBCharacteristic): 负责为服务器提供读写数据,一个服务下可以有很多个特征,比如灯亮的颜色,有时间长度等都是一个单独的服务
蓝牙中心开始扫描外设:
一个蓝牙中心可以扫描到周围蓝牙距离有效范围(20m左右跟障碍物有关)的所有外设
一个外设也可以被多个蓝牙中心扫摘
扫描到外设,开始识别
我们会扫描到周围所有的外设,但是一般我们只会连接我们自己公司的智能硬件,所以这里需要识别
CBPeripheral有一个identifier属性,是设备的唯一标识符
·有些APP通过扫一扫硬件的二维码建立连接,其实内部已经扫描到了外设,只是U不显示,二维码中放的就是外设的identifer
开始连接外设
连接外设成功,开始发现服务
一旦外设被蓝牙中心连接之后,既不能被其他中心扫描更不能被其他中心连接
#define kServiceUUID @“5C476471-1109-4EBE-A826-45B4F9D74FB9”
#define kCharacteristicHeartRateUUID @“82C7AC0F-6113-4EC9-92D1-5EEF44571398”
#define kCharacteristicBodyLocationUUID @“537B5FD6-1889-4041-9C35-F6949D1CA034”
@interface ViewController ()
@property (nonatomic,strong)CBCentralManager * centralManager;
@property (nonatomic,strong)CBPeripheral * peripheral;
@end
创建中心角色
#import
- (void)viewDidLoad
{
[super viewDidLoad];
//初始化蓝牙 central manager
_centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) options:nil];
}
扫描外设
[manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerRestoredStateScanOptionsKey:@(YES)}];
连接外设
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
if([peripheral.name isEqualToString:BLE_SERVICE_NAME]){
[self connect:peripheral];
}
s);
}
-(BOOL)connect:(CBPeripheral *)peripheral{
self.manager.delegate = self;
[self.manager connectPeripheral:peripheral
options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
}