蓝牙使用步骤:

1. 扫描外设

2. 连接外设

3. 连上外设后,获取指定外设的服务

4. 获取服务后,遍历服务的特征,得到可读,可写等特征,然后与中心管理者进行数据交互

附上代码

一:导入框架

#import <CoreBluetooth/CoreBluetooth.h>

#import <CoreLocation/CoreLocation.h>

二:设置代理,以及属性

<CBCentralManagerDelegate, CBPeripheralDelegate, UITableViewDataSource, UITableViewDelegate,CLLocationManagerDelegate>

/**

*  外设数组

*/

@property (nonatomic, strong) NSMutableArray *peripherals;

/**

*  中心管理者

*/

@property (nonatomic, strong) CBCentralManager *mgr;

/*

*   展示数据

*/

@property (nonatomic, strong) UITableView *tableView;

// 外设

@property (nonatomic, strong) CBPeripheral *peripheral;

// 特征

@property (nonatomic, strong) CBCharacteristic *characteristic;

三:方法实现

//懒加载 重写getter方法

- (NSMutableArray *)peripherals

{

if (!_peripherals) {

_peripherals = [NSMutableArray array];

}

return _peripherals;

}

- (void)viewDidLoad

{

[super viewDidLoad];

UIBarButtonItem *buttonI = [[UIBarButtonItem alloc] initWithTitle:@"扫描" style:UIBarButtonItemStylePlain target:self action:@selector(openOrclosed)];

self.navigationItem.rightBarButtonItem = buttonI;

UIBarButtonItem *buttonRB = [[UIBarButtonItem alloc] initWithTitle:@"open" style:UIBarButtonItemStylePlain target:self action:@selector(openTheDoor)];

self.navigationItem.leftBarButtonItem = buttonRB;

self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.height) style:UITableViewStylePlain];

[self.view addSubview:self.tableView];

self.tableView.delegate = self;

self.tableView.dataSource = self;

// Do any additional setup after loading the view.

}

#pragma mark - CBCentralManagerDelegate

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

{

// 保存扫描到得外部设备

// 判断如果数组中不包含当前扫描到得外部设置才保存

NSLog(@"查找设备");

if (![self.peripherals containsObject:peripheral]) {

//        if ([peripheral.identifier.UUIDString isEqualToString:@""]) {

[self.peripherals addObject:peripheral];

//        peripheral.delegate = self;

[self.tableView reloadData];

//        }

}

}

#pragma mark 显示数据的tableView的代理方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return self.peripherals.count;

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return 1;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *cell_id = @"cell_id";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cell_id];

if (cell == nil) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cell_id];

}

CBPeripheral *peripheral = self.peripherals[indexPath.row];

cell.textLabel.text = peripheral.name;

return cell;

}

#pragma mark tableView的点击事件

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

//    self.peripheral = self.peripherals[indexPath.row];

//    self.peripheral.delegate = self;

//    ((CBPeripheral *)self.peripherals[indexPath.row]).delegate=self;

//    [self.mgr connectPeripheral:self.peripherals[indexPath.row] options:nil];

self.peripheral = self.peripherals[indexPath.row];

[self.mgr connectPeripheral:self.peripheral options:nil];

self.peripheral.delegate = self;

//    ((CBPeripheral *)self.peripherals[indexPath.row]).delegate=self;

}

/**

*  扫描外设

*/

- (void)openOrclosed

{

if ([self.navigationItem.rightBarButtonItem.title isEqualToString:@"扫描"]) {

NSLog(@"扫描");

[self.navigationItem.rightBarButtonItem setTitle:@"断开"];

// 1.创建中心设备

// 设置代理

self.mgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

// 2.利用中心设备扫描外部设备

/*

如果指定数组代表只扫描指定的设备

*/

[self.mgr scanForPeripheralsWithServices:nil options:nil];

} else {

NSLog(@"断开");

[self.mgr stopScan];

if (self.peripheral != nil)

{

NSLog(@"disConnect start");

[self.mgr cancelPeripheralConnection:self.peripheral];

}

self.peripherals = nil;

[self.tableView reloadData];

[self.navigationItem.rightBarButtonItem setTitle:@"扫描"];

}

}

/**

*  连接外设成功调用

*/

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral

{

//    [self showTheAlertViewWithMassage:@"链接成功"];

NSLog(@"链接成功");

// 扫描外设中得服务

[peripheral discoverServices:nil];

}

/**

*  连接外设失败调用

*/

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error

{

//    [self showTheAlertViewWithMassage:@"链接失败"];

NSLog(@"链接失败");

}

#pragma makr - CBPeripheralDelegate

/**

*  只要扫描到服务就会调用

*

*  @param peripheral 服务所在的外设

*/

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

{

NSLog(@"扫描服务");

//    [self showTheAlertViewWithMassage:@"扫描服务"];

// 获取外设中所有扫描到得服务

NSArray *services = peripheral.services;

for (CBService *service in services) {

// 拿到需要的服务

NSLog(@"%@", service.UUID.UUIDString);

if ([service.UUID.UUIDString isEqualToString:RX_SERVICE_UUID])

{

[self showTheAlertViewWithMassage:@"拿到了对应的服务了"];

// 从需要的服务中查找需要的特征

// 从peripheral中得service中扫描特征

[peripheral discoverCharacteristics:nil forService:service];

}

}

}

/**

*  只要扫描到特征就会调用

*

*  @param peripheral 特征所属的外设

*  @param service    特征所属的服务

*/

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

{

NSLog(@"扫描特征");

// 拿到服务中所有的特征

NSArray *characteristics =  service.characteristics;

// 遍历特征, 拿到需要的特征处理

for (CBCharacteristic * characteristic in characteristics) {

if ([characteristic.UUID.UUIDString isEqualToString:RX_CHAR_UUID]) {

//            [self showTheAlertViewWithMassage:@"拿到只读的的特征了"];

NSLog(@"拿到可写的的特征了");

//            characteristic.value

NSString *valueStr = [[NSString alloc] initWithData:characteristic.value encoding:NSUTF8StringEncoding];

NSLog(@"%@????", valueStr);

self.characteristic = characteristic;

[self showTheAlertViewWithMassage:valueStr];

}

if ([characteristic.UUID.UUIDString isEqualToString:TX_CHAR_UUID]) {

}

}

}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central

{

NSLog(@"检测代理方法");

if (central.state == 5) {

[self.mgr scanForPeripheralsWithServices:nil options:nil];

//        [self showTheAlertViewWithMassage:@"手机蓝牙处于可用状态"];

}

NSLog(@"%ld, %@", central.state, central);

}

#pragma mark 发送消息成功

- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

{

NSLog(@"发送消息的回调");

NSLog(@"----%@", error);

if (!error) {

NSLog(@"??????????");

}

}

#pragma mark 处理蓝牙发送过来的数据

- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error

{

NSLog(@"接收到数据");

}

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

{

NSLog(@">>>>>>>");

if (error)

{

NSLog(@"Error updating value for characteristic %@ error: %@", characteristic.UUID, [error localizedDescription]);

//        if ([_mainMenuDelegate respondsToSelector:@selector(DidNotifyReadError:)])

//            [_mainMenuDelegate DidNotifyReadError:error];

//

//        return;

}

NSMutableData *recvData;

[recvData appendData:characteristic.value];

if ([recvData length] >= 5)//已收到长度

{

unsigned char *buffer = (unsigned char *)[recvData bytes];

int nLen = buffer[3]*256 + buffer[4];

if ([recvData length] == (nLen+3+2+2))

{

//接收完毕,通知代理做事

//            if ([_mainMenuDelegate respondsToSelector:@selector(DidNotifyReadData)])

//                [_mainMenuDelegate DidNotifyReadData];

NSLog(@"???????");

}

}

}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

- (void)showTheAlertViewWithMassage:(NSString *)massage

{

UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:massage delegate:self cancelButtonTitle:@"确定" otherButtonTitles: nil];

[alertV show];

}

- (void)openTheDoor

{

NSLog(@"拿到了可读可写的特征了");

//    self.peripheral.delegate = self;

//    characteristic.value = [string dataUsingEncoding:NSUTF8StringEncoding];

//    characteristic.value = [NSData dataWithBytes:string.UTF8String length:string.length];

//    [self.peripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];

//    [self.peripheral setNotifyValue:NO forCharacteristic:self.characteristic];

[self writeString:@"OLWANDA_IL12345678"];

}

- (void) writeString:(NSString *) string

{

NSData *data = [NSData dataWithBytes:string.UTF8String length:string.length];

//       NSLog(@"%@",self.characteristic.UUID.UUIDString);

self.peripheral.delegate=self;

NSLog(@"%@",self.peripheral.delegate);

if ((self.characteristic.properties & CBCharacteristicPropertyWriteWithoutResponse) != 0)

{

[self.peripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithoutResponse];

}

else if ((self.characteristic.properties & CBCharacteristicPropertyWrite) != 0)

{

[self.peripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];

}

else

{

NSLog(@"No write property on TX characteristic, %ld.", self.characteristic.properties);

}

//    <CBCharacteristic: 0x17408f500, UUID = 6E400002-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0xC, value = (null), notifying = NO>

}

iOS蓝牙--CoreBluetooth基本使用的更多相关文章

  1. iOS蓝牙开发(二)蓝牙相关基础知识

    原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...

  2. https://github.com/coolnameismy/BabyBluetooth github上的一个ios 蓝牙4.0的库并带文档和教程

    The easiest way to use Bluetooth (BLE )in ios,even bady can use. 简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和 ...

  3. iOS蓝牙BLE4.0通信功能

    概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ...

  4. 蓝牙(CoreBluetooth)-外部设备(服务端)

    蓝牙(CoreBluetooth)-外部设备(服务端) 主要内容 1. 创建外部管理器对象 2. 设置本地外设的服务和特征 3. 添加服务和特征到到你的设置的数据库中 4. 向外公布你的的服务 5. ...

  5. 蓝牙(CoreBluetooth)-概述

    蓝牙(CoreBluetooth)-概述 通过此框架可以让你的Mac和iOS应用程序与外部蓝牙设备通信 外部设备: 就是需要通过iOS App控制器的其他设备: 例如:心率检测仪.数字温控器 蓝牙通讯 ...

  6. ios 蓝牙相关

      ios蓝牙开发项目实战 -(附小米手环实例)   前言 最近一直在开发关于蓝牙的功能,本来是不想写这一篇文章,因为网上关于ios蓝牙开发的文章实在太多了,成吨成吨的文章出现,但是很遗憾都只是一些皮 ...

  7. iOS蓝牙4.0开发

    文/starfox寒流(简书作者)原文链接:http://www.jianshu.com/p/974d165f78b5著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. iOS 蓝牙4.0 ...

  8. iOS蓝牙BLE开发

    蓝牙是一个标准的无线通讯协议,具有设备成本低.传输距离近和功耗低等特点,被广泛的应用在多种场合.蓝牙一般分为传统蓝牙和BLE两种模式:传统蓝牙可以传输音频等较大数据量,距离近.功耗相对大:而BLE则用 ...

  9. iOS 蓝牙开发资料记录

    一.蓝牙基础认识:   1.iOS蓝牙开发:  iOS蓝牙开发:蓝牙连接和数据读写   iOS蓝牙后台运行  iOS关于app连接已配对设备的问题(ancs协议的锅)          iOS蓝牙空中 ...

随机推荐

  1. yum安装出现No package vim available解决办法

    [root@iZwz96wgquf8g6okusxr0uZ yum.repos.d]# yum install yum-downloadLoaded plugins: fastestmirrorLoa ...

  2. 马蜂窝 IM 移动端架构的从 0 到 1

    (马蜂窝技术原创内容,公众号 ID:mfwtech) 移动互联网技术改变了旅游的世界,这个领域过去沉重的信息分销成本被大大降低.用户与服务供应商之间.用户与用户之间的沟通路径逐渐打通,沟通的场景也在不 ...

  3. .NET Core API后台架构搭建

    ASP.NET Core API后台架构搭建 项目文件:https://files.cnblogs.com/files/ZM191018/WebAPI.zip 本篇可以了解到: 依赖注入 Dapper ...

  4. Oracle报错注入总结

    0x00 前言 在oracle注入时候出现了数据库报错信息,可以优先选择报错注入,使用报错的方式将查询数据的结果带出到错误页面中. 使用报错注入需要使用类似 1=[报错语句],1>[报错语句], ...

  5. Ubunut18 安装docker环境&&AWD攻防平台部署

    docker:有两个版本:docker-ce(社区版)和docker-ee(企业版). 参考官网地址:https://docs.docker.com/engine/installation/linux ...

  6. spring源码系列8:AOP源码解析之代理的创建

    回顾 首先回顾: JDK动态代理与CGLIB动态代理 Spring中的InstantiationAwareBeanPostProcessor和BeanPostProcessor的区别 我们得知 JDK ...

  7. Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下?

    当前时间:2019年10月24日.距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate.o ...

  8. opencv::图像矩(Image Moments)

    矩的概念介绍 1.几何矩 2.中心距 3.中心归一化距 4.图像中心Center(x0, y0) 计算矩 moments( InputArray array, // 输入数据 bool binaryI ...

  9. MongoDB-系统时钟跳变引发的风波

    目录 背景 一. 对 oplog 的影响 oplog 原理 二.主备倒换 小结 声明:本文同步发表于 MongoDB 中文社区,传送门: http://www.mongoing.com/archive ...

  10. 通过一个生活中的案例场景,揭开并发包底层AQS的神秘面纱

    本文导读 生活中案例场景介绍 联想到 AQS 到底是什么 AQS 的设计初衷 揭秘 AQS 底层实现 最后的总结 当你在学习某一个技能的时候,是否曾有过这样的感觉,就是同一个技能点学完了之后,过了一段 ...