ios蓝牙开发(三)app作为外设被连接的实现
再上一节说了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作为外设被连接的实现相关推荐
- iOS蓝牙开发---CoreBluetooth[BLE 4.0] 初级篇[内附Demo地址]
一.蓝牙基础知识 (一)常见简称 1.MFI make for ipad ,iphone, itouch 专们为苹果设备制作的设备,开发使用ExternalAccessory 框架(认证流程貌似挺复 ...
- iOS 蓝牙开发 BabyBluetooth蓝牙库介绍
BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容iOS和Mac OS X. 特色: 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮 ...
- iOS蓝牙开发数据实时传输
随着iOS项目开发 很多app需要通过蓝牙与设备连接 蓝牙开发注意: 先定义中心设备和外围设备以及遵守蓝牙协议 @interface ViewController()<CBCentralMan ...
- Android 蓝牙开发(三) -- 低功耗蓝牙开发
Android 蓝牙开发(一) – 传统蓝牙聊天室 Android 蓝牙开发(三) – 低功耗蓝牙开发 项目工程BluetoothDemo 前面已经学习了经典蓝牙开发,学习了蓝牙的配对连接和通信,又通 ...
- iOS 蓝牙开发资料记录
一.蓝牙基础认识: 1.iOS蓝牙开发: iOS蓝牙开发:蓝牙连接和数据读写 iOS蓝牙后台运行 iOS关于app连接已配对设备的问题(ancs协议的锅) iOS蓝牙空 ...
- iOS传感器开发——为APP添加手机密码、指纹进行安全验证
iOS传感器开发--为APP添加手机密码.指纹进行安全验证 一.引言 iPhone5s之后,iPhone硬件上已支持进行指纹识别的功能,相应的,一些新的api也可以应用于APP中,进行用户安全的验证. ...
- nimble 蓝牙开发三:nimble BLE 应用介绍
目录 nimble 蓝牙开发三:nimble BLE 应用介绍 BLE 应用类型 未连接状态 未连接状态下的 BLE 设备应用 未连接状态的手机 连接状态 连接状态下的 BLE 设备 连接状态下的手机 ...
- iOS蓝牙开发连接系统或其他APP已经连接、配对成功的蓝牙设备
在蓝牙开发的时候,扫描外设的方法扫描到的设备只能是没有被连接的设备,也就是说如果有设备在本手机中已经连接配对成功了之后就不会被 [_centralManager scanForPeripheralsW ...
- iOS蓝牙开发:蓝牙连接和数据读写
当下蓝牙开发可谓是越来越火,不论是智能穿戴的兴起还是蓝牙家具,车联网蓝牙等等,很多同学也会接触到蓝牙的项目,我从事蓝牙开发也有一段时间了,经手了两个项目.废话不多说了,先向大家简单的介绍有关蓝牙开发的 ...
- Andorid/IOS 蓝牙开发总结
IOS 蓝牙 ios 蓝牙依赖CoreBluetooth 库 1 首先增加库 CoreBluetooth general-> Linked Frameworks and lib 2 权限i ...
最新文章
- 搜狗·疫情数据爬取(Python)
- 什么是 lnmp 实现原理。
- 一拍即合、一见钟情之后,智慧城市的“福利”来啦……
- linux watch
- python变量定义 关键字_(四)Robot Framework 基础关键字
- 【iOS安全】iOS应用安全开发总结
- MySQL 的 MRR 到底是什么?
- snapchat忘记账户_如何删除您的Snapchat帐户
- Entry name ‘META-INF/xxxxxxxx‘ collided 解决方法
- xp系统蓝屏代码7b_蓝屏代码7b怎么修复
- 我的世界服务器无限开号,我的世界开挂指令大全表一览!39条命令无限可能性
- 优化-处理大量定时任务的思路
- 差之毫厘:etcd 3 完美支持 HTTP 访问
- c语言课程设计文献检索,文献检索课学习心得三篇(2)
- mysql 管理instance_MySQL从零开始——第三章 MySQL体系结构
- 计算机结构体系:循环展开题型 (非凭感觉的方法详解)
- PDF尺寸怎么调整?两个实用途径
- interrupt和park的区别
- html+css+js实现的图片轮播图下方配文字可变图片可点击
- sql要学mysql还是php,MySQL_与MSSQL对比学习MYSQL的心得(一)--基本语法,这一期主要是学习MYSQL的基本 - phpStudy...
热门文章
- 几种字符串到byte[] 数组转化为String 的方法
- Vs中新建 网站 和Web应用程序的区别
- python做定时任务的方式及优缺点_Python3-定时任务四种实现方式
- python 3.5 format_Python3 format及字符串格式化
- 随机抽样一致算法(Random sample consensus,RANSAC)
- 在Windows下使用CMake+MinGW搭建C/C++编译环境
- admin.php wordpress,wordpress 中使用自带 admin-ajax.php
- Syslink Control使用技巧
- php trace 图形,PHP Trace 设计原理
- js计算器代码加减乘除_理不清亲戚关系,程序员直接写了一个亲戚关系计算器,来试试?...