步骤
1.引用库
#import <CoreBluetooth/CoreBluetooth.h>
2.遵循两个代理
@interface ZMOpenViewController ()<CBCentralManagerDelegate,CBPeripheralDelegate>
3.声明属性
NSMutableArray*_peripherals;//保存直连设备的数组
//系统蓝牙设备管理对象,可以把他理解为主设备,通过他,可以去扫描和链接外设
CBCentralManager *_manager;
4.
- (void)viewDidLoad {
//初始化并设置委托和线程队列,最好一个线程的参数可以为nil,默认会就main线程
_manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
}
5.判断蓝牙状态
-(void)centralManagerDidUpdateState:(CBCentralManager *)central{
switch (central.state) {
case CBCentralManagerStateUnknown:
NSLog(@">>>CBCentralManagerStateUnknown");
break;
case CBCentralManagerStateResetting:
NSLog(@">>>CBCentralManagerStateResetting");
break;
case CBCentralManagerStateUnsupported:
NSLog(@">>>CBCentralManagerStateUnsupported");
break;
case CBCentralManagerStateUnauthorized:
NSLog(@">>>CBCentralManagerStateUnauthorized");
break;
case CBCentralManagerStatePoweredOff:
NSLog(@">>>CBCentralManagerStatePoweredOff");
break;
case CBCentralManagerStatePoweredOn:
NSLog(@">>>CBCentralManagerStatePoweredOn");
//开始扫描周围的外设
[_manager scanForPeripheralsWithServices:nil options:nil];
break;
default:
break;
}
}
6.
//扫描到设备会进入方法
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
//蓝牙名称
NSString * blueTouchName1 = peripheral.name;
//判断设备是否符合你的条件
//符合条件的加到数组存储 (注意一定要加,不然会蹦溃)
[_peripherals addObject:peripheral];
// 连接设备
//连接直连设备
[_manager connectPeripheral:peripheral options:nil];
}
7.设备连接成功
#pragma 外设设备连接状态判断
-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
NSLog(@">>>连接到名称为(%@)的设备-成功",peripheral.name);
//设置代理
[peripheral setDelegate:self];
[peripheral discoverServices:nil];
}
失败调用
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
[SVProgressHUD dismiss];
[self.navigationController.view makeToast:@"连接设备失败"];
NSLog(@">>>连接到名称为(%@)的设备-失败,原因:%@",[peripheral name],[error localizedDescription]);
}
连接成功之后断开调用
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
// [self.navigationController.view makeToast:@"连接断开"];
[SVProgressHUD dismiss];
NSLog(@"error11--%@",error);
}
8.
#pragma 扫描外设服务
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
for (CBService *service in peripheral.services) {
[service.peripheral discoverCharacteristics:nil forService:service];
}
}
//9.扫描到Characteristics,特征回调
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
for (CBCharacteristic *characteristic in service.characteristics)
{
[peripheral readValueForCharacteristic:characteristic];
//截取设备uuid
NSString *UID =[UUIDSERVICE substringWithRange:NSMakeRange(4, 4)];
//转化为大写
NSString*UUIDString =[UID uppercaseString];
if ([characteristic.UUID.UUIDString isEqualToString:UUIDString]) {
// 拿到特征,和外围设备进行交互 保存写的特征
_writeDataCharacteristic = characteristic;
Byte b = 0xff;
NSData *data = [NSData dataWithBytes:&b length:sizeof(b)];
[peripheral writeValue:data forCharacteristic:_writeDataCharacteristic type:0];
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
}
}
10写入数据成功回调方法
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:
(CBCharacteristic *)characteristic error:(NSError *)error{
}
//手动断开连接方法
-(void)disconnectPeripheral:(CBCentralManager *)centralManager
peripheral:(CBPeripheral *)peripheral{
}
我在学习过程中遇到好几个大坑,以下是注意点
1.数组没有添加,程序会崩溃,目前找不到原因
[_peripherals addObject:peripheral];
2.写数据的时候必须是NSData类型,不然会收不到数据
因为之前我们公司设备安卓可以接收字符串和16进制,然后安卓传了字符串,老大叫我也传字符串,然后我测了好久没发送成功,如果遇到这问题,叫硬件部的修改接收类型
3.设备特征码不对,一直连不上
因为硬件拿回去改了接收类型,特征码也改了,一直没连上,连了几个小时的坑,记得一定要问老大要特征码是什么
4.设备功率太小,连接成功,但是一直收不到数据
这是因为设备功率太小,距离太远,你拿到硬件旁边测试就可以了,叫硬件部调大功率
5.写数据的时候要求必须传特定字符,看你们公司蓝牙协议,有些可能要求20位的
建议各位如果有厂家demo的一定要看下,如果不行的可以去下载app来测试,蓝牙有特定的app可以测试数据发送
我们公司用的是华麦设备