有时我们需要将我们的设备作为外设,来为其他中心设备提供服务。需要以下步骤:

1.创建一个CBPeripheralManager实例

2.基于peripheral实例,创建services和characteristics实例。

3.发布services和characteristics到你设备本地数据库

4.广播你创建的服务

5.对中心设备的读写请求做出相应,向订阅数据的中心设备发送数据更新通知

 myPeripheralManager =[[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:nil];

通过唯一的UUID来标示你创建的characteristics和services,UUID为128位,可以通过命令行uuidgen来产生多个UUID,一些通用的UUID为16位标示,但是系统会默认将其补充为128位。自己生成的UUID必须为128位。

CBUUID *heartRateServiceUUID = [CBUUID UUIDWithString: @"180D"];//180D为通用的心率服务IDCBUUID *myCustomServiceUUID =[CBUUID UUIDWithString:@"71DA3FD1-7E10-41C1-B16F-4430B506CDE7"];myCharacteristic =[[CBMutableCharacteristic alloc] initWithType:myCharacteristicUUIDproperties:CBCharacteristicPropertyReadvalue:myValue permissions:CBAttributePermissionsReadable];//创建特征myService = [[CBMutableService alloc] initWithType:myServiceUUID primary:YES];//创建服务myService.characteristics = @[myCharacteristic];//[myPeripheralManager addService:myService];//发布服务,发布之后会加入到本地数据库,之后就不能修改服务了// CBPeripheralManagerDelegate
- (void)peripheralManager:(CBPeripheralManager *)peripheraldidAddService:(CBService *)serviceerror:(NSError *)error {if (error) {NSLog(@"Error publishing service: %@", [error localizedDescription]);}...
}

发布服务到本地数据库之后就可以广播服务了

[myPeripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey :@[myFirstService.UUID, mySecondService.UUID] }];- (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheralerror:(NSError *)error {if (error) {NSLog(@"Error advertising: %@", [error localizedDescription]);}...
}

对中心设备的读写请求相应

- (void)peripheralManager:(CBPeripheralManager *)peripheraldidReceiveReadRequest:(CBATTRequest *)request {if ([request.characteristic.UUID isEqual:myCharacteristic.UUID]) {...if (request.offset > myCharacteristic.value.length) {[myPeripheralManager respondToRequest:requestwithResult:CBATTErrorInvalidOffset];return;}else {request.value = [myCharacteristic.valuesubdataWithRange:NSMakeRange(request.offset,myCharacteristic.value.length - request.offset)];[myPeripheralManager respondToRequest:request withResult:CBATTErrorSuccess];}}
}

对于写请求,在写代理方法中类似实现方式,修改值使用

myCharacteristic.value = request.value;方法。

对于中心设备注册监听的特征

- (void)peripheralManager:(CBPeripheralManager *)peripheralcentral:(CBCentral *)central
didSubscribeToCharacteristic:(CBCharacteristic *)characteristic {NSLog(@"Central subscribed to characteristic %@", characteristic);...
}NSData *updatedValue = // fetch the characteristic's new valueBOOL didSendValue = [myPeripheralManager updateValue:updatedValueforCharacteristic:characteristic onSubscribedCentrals:nil];//如果用于更新的队列满了,会返回NO,当有队列有空位时会调用peripheralManagerIsReadyToUpdateSubscribers: 方法,你可以在这个方法里重新发送更新数据

其他需要注意的事项:

1.限制广播数据的大小,最大为28byte + 10byte(专用于localNameKey),在广播的字典里,只能传入 CBAdvertisementDataLocalNameKey and CBAdvertisementDataServiceUUIDsKey类型的数据。

2.在不需要时,停止广播

[myPeripheralManager stopAdvertising];

3.对于敏感数据,进行配对验证,对于需要订阅的数据设置,订阅权限。

myCharacteristic = [[CBMutableCharacteristic alloc]initWithType:myCharacteristicUUIDproperties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotifyvalue:nil permissions:CBAttributePermissionsReadable];emailCharacteristic = [[CBMutableCharacteristic alloc]initWithType:emailCharacteristicUUIDproperties:CBCharacteristicPropertyRead| CBCharacteristicPropertyNotifyEncryptionRequiredvalue:nil permissions:CBAttributePermissionsReadEncryptionRequired];

iOS蓝牙开发(三)实现外设功能相关推荐

  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. nimble 蓝牙开发三:nimble BLE 应用介绍

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

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

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

  5. iOS 蓝牙开发资料记录

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

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

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

  7. Andorid/IOS 蓝牙开发总结

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

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

    蓝牙开发说简单也简单,说不简单也有点难,开发人员在首次开发蓝牙前首先需要搞清楚蓝牙开发的概念,还要了解掌握蓝牙开发的一整套流程,这样才能快速上手开发蓝牙. 蓝牙开发分为两种模式:管理者模式和中心者模式 ...

  9. ios 蓝牙开发总结

    随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低.从iOS的发展史也不难看出 ...

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

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

最新文章

  1. tensolrflow之基础变量
  2. 【哲学】不可知论是什么?agnosticism
  3. 10 分钟上手 Vue 组件 Vue-Draggable
  4. Binary Formats in JavaScript: Base64, Deflate, and UTF8
  5. Android一个自定义的进度环:ProgressChart
  6. 技术博客么?开始每天一更
  7. 计算机多媒体技术怎么考一建,一建考试视频
  8. 计算机组成与设计第五版英文_教学设计gt;小学信息技术计算机的组成教师资格证面试模板...
  9. 陆奇李开复余凯谈AI十年机遇,Hinton和LeCun会如何评价?
  10. mysql 5.6.23 免安装_MYSQL 免安装版的环境配置
  11. 「AtCoder Grand018A」Getting Difference(GCD)
  12. Google发布Java 核心工具库——Guava 28.0
  13. Java正则表达式语法规则(具体)
  14. MATLAB生成M序列和Gold序列
  15. 【Windows】文件夹被占用删除不掉
  16. 屏蔽跑跑卡丁车结束后的广告
  17. 人工智能机器学习底层原理剖析,人造神经元,您一定能看懂,通俗解释把AI“黑话”转化为“白话文”
  18. Flink系列之Flink流式计算引擎基础理论
  19. Docker-镜像的优化
  20. SQL Server 2012 SP1 企业版

热门文章

  1. 常见GIS工具软件介绍
  2. WPF MVVM框架 漂亮界面风格的WPF
  3. 【项目管理一点通】(48) 项目结项
  4. 前程无忧岗位数据爬取+Tableau可视化分析
  5. 使用yolov5训练PASCAL VOC2012数据集以及遇到的坑
  6. c语言大学生信息管理系统实验报告,c语言学生信息管理系统实训报告
  7. 基于单片机智能自动浇花控制系统设计(毕业设计)
  8. 单片机各种通信协议详解
  9. python代码颜色搭配_python配色_python 配色_python配色方案 - 云+社区 - 腾讯云
  10. 易语言API HOOK DeviceIOControl修改磁盘序列号