首先描述一下我的使用场景,通过手机给蓝牙板子发送相应的数据(即指令)让蓝牙板子做出相应的操作;(如蓝牙锁的开锁关锁操作)!!!!!!!!!!!!!!
首先我们需要导入系统蓝牙框架的框架头文件
#import
其次我们需要遵循两个蓝牙协议
然后就可以写我们的蓝牙代码了.....
首先我们要在使用地方创建一下蓝牙中心管理者如下:
@property(nonatomic,strong)CBCentralManager*mgr; //把中心管理者声明成一个属性方便使用
@property(nonatomic,strong)CBPeripheral*bluetoothPeripheral; //当前连接的管理者 发送数据的时候要用的
self.mar = [[CBCentralManageralloc]init];
同时要设置代理的
self.mar.delegate = self;
设置完代理就会调用一下方法:
//这个方法是判断蓝牙状态的
- (void)centralManagerDidUpdateState:(CBCentralManager*)central{
switch(central.state) {
caseCBManagerStateUnknown://蓝牙状态未知
{
}
break;
caseCBManagerStateResetting://重置中
{
}
break;
caseCBManagerStateUnsupported://不支持蓝牙
{
}
break;
caseCBManagerStateUnauthorized://蓝牙未授权
{
}
break;
caseCBManagerStatePoweredOff://蓝牙关闭状态
{
}
break;
caseCBManagerStatePoweredOn://蓝牙开启状态
{
//2.利用中心设备扫描外部设备
/*
如果指定数组代表只扫描指定的设备
*/
[self.mgr scanForPeripheralsWithServices:niloptions:nil];//如果蓝牙未开启状态就执行扫描蓝牙设备方法
}
break;
default:
break;
}
}
//调用扫描蓝牙方法之后,如果扫描到蓝牙设备就会调用一下代理方法的
- (void)centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary*)advertisementData RSSI:(NSNumber*)RSSI
{
// 参数 peripheral 是扫描到的所有蓝牙外设的集合 每一个蓝牙都包含多个属性 (name :蓝牙名称 uuid:唯一标示 等一些属性 )我们可以通过判断蓝牙名称或是uuid 来连接相应的蓝牙设备
peripheral.delegate=self; //设置连接蓝牙外设的代理
[self.mgr connectPeripheral:peripheraloptions:nil]; //连接蓝牙
[self.mgr stopScan]; //停止扫描
}
设置完连接蓝牙的方法后就要出现连接状态的方法了需要调用一下以下有几个方法
/**
*连接外设成功调用
*/
- (void)centralManager:(CBCentralManager*)central didConnectPeripheral:(CBPeripheral*)peripheral
{
每个蓝牙还包括 服务 ,服务里边又有特征 ;所以我们连接上蓝牙之后还需要扫描一下连接到的蓝牙外设中的服务
//扫描外设中得服务
[peripheral discoverServices:nil];
}
//外设连接失败
- (void)centralManager:(CBCentralManager*)central didFailToConnectPeripheral:(CBPeripheral*)peripheral error:(NSError*)error
{
NSLog(@"%s, line = %d, %@=连接失败",__FUNCTION__, __LINE__, peripheral.name);
}
/**
*丢失连接
*/
- (void)centralManager:(CBCentralManager*)central didDisconnectPeripheral:(CBPeripheral*)peripheral error:(NSError*)error
{
[self.peripherals removeObject:peripheral];
NSLog(@"丢失连接");
}
设置完扫描服务就会调用一下方法 ,
#pragma makr - CBPeripheralDelegate
/**
*只要扫描到服务就会调用
*
*@param peripheral服务所在的外设
*/
- (void)peripheral:(CBPeripheral*)peripheral didDiscoverServices:(NSError*)error
{
//获取外设中所有扫描到得服务
NSArray*services = peripheral.services;
for(CBService*serviceinservices) {
NSLog(@"%@",service.UUID.UUIDString);
//由于每个蓝牙中的服务也是有好多个的, 所以应该找到我们拿到需要的服务
FFF0 是我做项目时锁需要的服务标识 所以就这样判断了
//if ([service.UUID.UUIDString isEqualToString:@"FFF0"])
if([service.UUID.UUIDStringisEqualToString:@"FFE0"])
{
//从需要的服务中查找需要的特征
//从peripheral中得service中扫描特征
[peripheral discoverCharacteristics:nilforService:service];
}
}
}
/**
*只要扫描到特征就会调用
*
*@param peripheral特征所属的外设
*@param service特征所属的服务
*/
- (void)peripheral:(CBPeripheral*)peripheral didDiscoverCharacteristicsForService:(CBService*)service error:(NSError*)error
{
//拿到服务中所有的特诊
NSArray*characteristics =service.characteristics;
//遍历特征,拿到需要的特征处理
for(CBCharacteristic* characteristicincharacteristics) {
if([characteristic.UUID.UUIDStringisEqualToString:@"FFE1"]) {
[peripheralsetNotifyValue:YESforCharacteristic:characteristic];
self.characteristic= characteristic;
[CommonToolbleSenderData:kObtainIDbluetoothPeripheral:self.bluetoothPeripheralcharacteristic:characteristic];
}
}
}
//更新特征的value的时候会调用(凡是从蓝牙传过来的数据都要经过这个回调,简单的说这个方法就是你拿数据的唯一方法)你可以判断是否
- (void)peripheral:(CBPeripheral*)peripheral didUpdateValueForCharacteristic:(CBCharacteristic*)characteristic error:(NSError*)error
{
if(error) {
NSLog(@"接受数据出现错误%@ -- line = %d",error,__LINE__);
}else{
NSString*content = [[NSStringalloc]initWithData:characteristic.valueencoding:NSUTF8StringEncoding];
}
}
这样就可以拿到蓝牙给我们发送的数据
下面这行代码是我们给蓝牙发送数据的代码,写在你的触发事件中就好了,不过还要注意一点就是发送数据一定要按照蓝牙所接受数据的格式发送
//self.bluetoothPeripheral 这个参数是你链接的蓝牙设备的 对应的对象
[self.bluetoothPeripheral writeValue:dataforCharacteristic:characteristictype:CBCharacteristicWriteWithoutResponse];
就这样你就可以与蓝牙设备发送数据 并且接受来自蓝牙设备返回的数据了!!!!!!!!!!!!
读者如有不清楚的地方可以随时留言询问.谢谢您的阅读!!!希望对您有用的地方!!!!!!