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

还是这张图,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 xcode2 开发证书和手机(蓝牙程序需要使用使用真机调试,使用模拟器也可以调试,但是方法很蛋疼,我会放在最后说),如果不行可以使用osx程序调试3 蓝牙外设

实现步骤

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

设置当前ViewController实现CBPeripheralManagerDelegate委托

@interface BePeripheralViewController : UIViewController<CBPeripheralManagerDelegate> 

初始化peripheralManager

/*和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。


//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; } } 

//配置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

//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


//订阅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

转载于:https://www.cnblogs.com/Free-Thinker/p/9178844.html

ios蓝牙开发(三)app作为外设被连接的实现相关推荐

  1. iOS蓝牙开发---CoreBluetooth[BLE 4.0] 初级篇[内附Demo地址]

    一.蓝牙基础知识 (一)常见简称 1.MFI  make for ipad ,iphone, itouch 专们为苹果设备制作的设备,开发使用ExternalAccessory 框架(认证流程貌似挺复 ...

  2. iOS 蓝牙开发 BabyBluetooth蓝牙库介绍

    BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容iOS和Mac OS X. 特色: 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮 ...

  3. iOS蓝牙开发数据实时传输

    随着iOS项目开发  很多app需要通过蓝牙与设备连接 蓝牙开发注意: 先定义中心设备和外围设备以及遵守蓝牙协议 @interface ViewController()<CBCentralMan ...

  4. Android 蓝牙开发(三) -- 低功耗蓝牙开发

    Android 蓝牙开发(一) – 传统蓝牙聊天室 Android 蓝牙开发(三) – 低功耗蓝牙开发 项目工程BluetoothDemo 前面已经学习了经典蓝牙开发,学习了蓝牙的配对连接和通信,又通 ...

  5. iOS 蓝牙开发资料记录

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

  6. iOS传感器开发——为APP添加手机密码、指纹进行安全验证

    iOS传感器开发--为APP添加手机密码.指纹进行安全验证 一.引言 iPhone5s之后,iPhone硬件上已支持进行指纹识别的功能,相应的,一些新的api也可以应用于APP中,进行用户安全的验证. ...

  7. nimble 蓝牙开发三:nimble BLE 应用介绍

    目录 nimble 蓝牙开发三:nimble BLE 应用介绍 BLE 应用类型 未连接状态 未连接状态下的 BLE 设备应用 未连接状态的手机 连接状态 连接状态下的 BLE 设备 连接状态下的手机 ...

  8. iOS蓝牙开发连接系统或其他APP已经连接、配对成功的蓝牙设备

    在蓝牙开发的时候,扫描外设的方法扫描到的设备只能是没有被连接的设备,也就是说如果有设备在本手机中已经连接配对成功了之后就不会被 [_centralManager scanForPeripheralsW ...

  9. iOS蓝牙开发:蓝牙连接和数据读写

    当下蓝牙开发可谓是越来越火,不论是智能穿戴的兴起还是蓝牙家具,车联网蓝牙等等,很多同学也会接触到蓝牙的项目,我从事蓝牙开发也有一段时间了,经手了两个项目.废话不多说了,先向大家简单的介绍有关蓝牙开发的 ...

  10. Andorid/IOS 蓝牙开发总结

    IOS 蓝牙 ios 蓝牙依赖CoreBluetooth 库 1 首先增加库 CoreBluetooth    general-> Linked Frameworks and lib 2 权限i ...

最新文章

  1. 搜狗·疫情数据爬取(Python)
  2. 什么是 lnmp 实现原理。
  3. 一拍即合、一见钟情之后,智慧城市的“福利”来啦……
  4. linux watch
  5. python变量定义 关键字_(四)Robot Framework 基础关键字
  6. 【iOS安全】iOS应用安全开发总结
  7. MySQL 的 MRR 到底是什么?
  8. snapchat忘记账户_如何删除您的Snapchat帐户
  9. Entry name ‘META-INF/xxxxxxxx‘ collided 解决方法
  10. xp系统蓝屏代码7b_蓝屏代码7b怎么修复
  11. 我的世界服务器无限开号,我的世界开挂指令大全表一览!39条命令无限可能性
  12. 优化-处理大量定时任务的思路
  13. 差之毫厘:etcd 3 完美支持 HTTP 访问
  14. c语言课程设计文献检索,文献检索课学习心得三篇(2)
  15. mysql 管理instance_MySQL从零开始——第三章 MySQL体系结构
  16. 计算机结构体系:循环展开题型 (非凭感觉的方法详解)
  17. PDF尺寸怎么调整?两个实用途径
  18. interrupt和park的区别
  19. html+css+js实现的图片轮播图下方配文字可变图片可点击
  20. sql要学mysql还是php,MySQL_与MSSQL对比学习MYSQL的心得(一)--基本语法,这一期主要是学习MYSQL的基本 - phpStudy...

热门文章

  1. 几种字符串到byte[] 数组转化为String 的方法
  2. Vs中新建 网站 和Web应用程序的区别
  3. python做定时任务的方式及优缺点_Python3-定时任务四种实现方式
  4. python 3.5 format_Python3 format及字符串格式化
  5. 随机抽样一致算法(Random sample consensus,RANSAC)
  6. 在Windows下使用CMake+MinGW搭建C/C++编译环境
  7. admin.php wordpress,wordpress 中使用自带 admin-ajax.php
  8. Syslink Control使用技巧
  9. php trace 图形,PHP Trace 设计原理
  10. js计算器代码加减乘除_理不清亲戚关系,程序员直接写了一个亲戚关系计算器,来试试?...