iOS 蓝牙开发(三)app作为外设被连接的实现

iOS 蓝牙开发(三)app作为外设被连接的实现


再上一节说了app作为central连接peripheral的情况,这一节介绍如何使用app发布一个peripheral,给其他的central连接

1.jpeg

还是这张图,central模式用的都是左边的类,而peripheral模式用的是右边的类

peripheral模式的流程

1. 打开peripheralManager,设置peripheralManager的委托

2. 创建characteristics,characteristics的description 创建service,把characteristics添加到service中,再把service添加到peripheralManager中

3. 开启广播advertising

4. 对central的操作进行响应

    - 4.1 读characteristics请求

    - 4.2 写characteristics请求

    - 4.4 订阅和取消订阅characteristics

准备环境

  1 Xcode

  2 开发证书和手机(蓝牙程序需要使用使用真机调试,使用模拟器也可以调试,但是方法很蛋疼,我会放在最后说),如果不行可以使用osx程序调试

  3 蓝牙外设

实现步骤

1. 打开peripheralManager,设置peripheralManager的委托

设置当前ViewController实现CBPeripheralManagerDelegate委托

1
     @interface BePeripheralViewController : UIViewController

初始化peripheralManager

1
2
3
4
5
6
      /*
      和CBCentralManager类似,蓝牙设备打开需要一定时间,打开成功后会进入委托方法
      - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral;
      模拟器永远也不会得CBPeripheralManagerStatePoweredOn状态
      */
     peripheralManager = [[CBPeripheralManager alloc]initWithDelegate:self queue:nil];

2. 创建characteristics,characteristics的description ,创建service,把characteristics添加到service中,再把service添加到peripheralManager中

在委托方法 - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral中,当peripheral成功打开后,才可以配置service和characteristics。 这里创建的service和chara对象是CBMutableCharacteristic和CBMutableService。他们的区别就像NSArray和NSMutableArray区别类似。 我们先创建characteristics和description,description是characteristics的描述,描述分很多种, 这里不细说了,常用的就是CBUUIDCharacteristicUserDescriptionString。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//peripheralManager状态改变
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{
     switch  (peripheral.state) {
             //在这里判断蓝牙设别的状态  当开启了则可调用  setUp方法(自定义)
         case  CBPeripheralManagerStatePoweredOn:
             NSLog(@ "powered on" );
             [info setText:[NSString stringWithFormat:@ "设备名%@已经打开,可以使用center进行连接" ,LocalNameKey]];
             [self setUp];
             break ;
         case  CBPeripheralManagerStatePoweredOff:
             NSLog(@ "powered off" );
             [info setText:@ "powered off" ];
             break ;
         default :
             break ;
     }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  //配置bluetooch的
  -(void)setUp{
         //characteristics字段描述
         CBUUID *CBUUIDCharacteristicUserDescriptionStringUUID = [CBUUID UUIDWithString:CBUUIDCharacteristicUserDescriptionString];
         /*
          可以通知的Characteristic
          properties:CBCharacteristicPropertyNotify
          permissions CBAttributePermissionsReadable
          */
         CBMutableCharacteristic *notiyCharacteristic = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:notiyCharacteristicUUID] properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];
         /*
          可读写的characteristics
          properties:CBCharacteristicPropertyWrite | CBCharacteristicPropertyRead
          permissions CBAttributePermissionsReadable | CBAttributePermissionsWriteable
          */
         CBMutableCharacteristic *readwriteCharacteristic = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:readwriteCharacteristicUUID] properties:CBCharacteristicPropertyWrite | CBCharacteristicPropertyRead value:nil permissions:CBAttributePermissionsReadable | CBAttributePermissionsWriteable];
         //设置description
         CBMutableDescriptor *readwriteCharacteristicDescription1 = [[CBMutableDescriptor alloc]initWithType: CBUUIDCharacteristicUserDescriptionStringUUID value:@ "name" ];
         [readwriteCharacteristic setDescriptors:@[readwriteCharacteristicDescription1]];
         /*
          只读的Characteristic
          properties:CBCharacteristicPropertyRead
          permissions CBAttributePermissionsReadable
          */
         CBMutableCharacteristic *readCharacteristic = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:readCharacteristicUUID] properties:CBCharacteristicPropertyRead value:nil permissions:CBAttributePermissionsReadable];
         //service1初始化并加入两个characteristics
         CBMutableService *service1 = [[CBMutableService alloc]initWithType:[CBUUID UUIDWithString:ServiceUUID1] primary:YES];
         [service1 setCharacteristics:@[notiyCharacteristic,readwriteCharacteristic]];
         //service2初始化并加入一个characteristics
         CBMutableService *service2 = [[CBMutableService alloc]initWithType:[CBUUID UUIDWithString:ServiceUUID2] primary:YES];
         [service2 setCharacteristics:@[readCharacteristic]];
         //添加后就会调用代理的- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error
         [peripheralManager addService:service1];
         [peripheralManager addService:service2];
  }

3. 开启广播advertising

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//perihpheral添加了service
- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error{
     if  (error == nil) {
         serviceNum++;
     }
     //因为我们添加了2个服务,所以想两次都添加完成后才去发送广播
     if  (serviceNum==2) {
         //添加服务后可以在此向外界发出通告 调用完这个方法后会调用代理的
         //(void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error
         [peripheralManager startAdvertising:@{
                                               CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:ServiceUUID1],[CBUUID UUIDWithString:ServiceUUID2]],
                                               CBAdvertisementDataLocalNameKey : LocalNameKey
                                              }
          ];
     }
}
//peripheral开始发送advertising
- (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error{
     NSLog(@ "in peripheralManagerDidStartAdvertisiong" );
}

4. 对central的操作进行响应

- 4.1 读characteristics请求

- 4.2 写characteristics请求

- 4.3 订阅和取消订阅characteristics

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//订阅characteristics
-(void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic{
     NSLog(@ "订阅了 %@的数据" ,characteristic.UUID);
     //每秒执行一次给主设备发送一个当前时间的秒数
     timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(sendData:) userInfo:characteristic  repeats:YES];
}
//取消订阅characteristics
-(void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic{
     NSLog(@ "取消订阅 %@的数据" ,characteristic.UUID);
     //取消回应
     [timer invalidate];
}
//发送数据,发送当前时间的秒数
-(BOOL)sendData:(NSTimer *)t {
     CBMutableCharacteristic *characteristic = t.userInfo;
     NSDateFormatter *dft = [[NSDateFormatter alloc]init];
     [dft setDateFormat:@ "ss" ];
     NSLog(@ "%@" ,[dft stringFromDate:[NSDate date]]);
     //执行回应Central通知数据
     return   [peripheralManager updateValue:[[dft stringFromDate:[NSDate date]] dataUsingEncoding:NSUTF8StringEncoding] forCharacteristic:(CBMutableCharacteristic *)characteristic onSubscribedCentrals:nil];
}
//读characteristics请求
- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request{
     NSLog(@ "didReceiveReadRequest" );
     //判断是否有读数据的权限
     if  (request.characteristic.properties & CBCharacteristicPropertyRead) {
         NSData *data = request.characteristic.value;
         [request setValue:data];
         //对请求作出成功响应
         [peripheralManager respondToRequest:request withResult:CBATTErrorSuccess];
     } else {
         [peripheralManager respondToRequest:request withResult:CBATTErrorWriteNotPermitted];
     }
}
//写characteristics请求
- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests{
     NSLog(@ "didReceiveWriteRequests" );
     CBATTRequest *request = requests[0];
     //判断是否有写数据的权限
     if  (request.characteristic.properties & CBCharacteristicPropertyWrite) {
         //需要转换成CBMutableCharacteristic对象才能进行写值
         CBMutableCharacteristic *c =(CBMutableCharacteristic *)request.characteristic;
         c.value = request.value;
         [peripheralManager respondToRequest:request withResult:CBATTErrorSuccess];
     } else {
         [peripheralManager respondToRequest:request withResult:CBATTErrorWriteNotPermitted];
     }
}

代码下载:

我博客中大部分示例代码都上传到了github,地址是:https://github.com/coolnameismy/demo,点击跳转代码下载地址

本文代码存放目录是BleDemo

如果大家支持,请follow我的github账号,并star我的项目,有其他问题可以在blog中给我留言 blog的RSS订阅

iOS 蓝牙开发(一)蓝牙相关基础知识

iOS 蓝牙开发(二)iOS 连接外设的代码实现

iOS 蓝牙开发(四)BabyBluetooth蓝牙库介绍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值