当前位置: 首页 > news >正文

Core Bluetooth下实现两个设备进行互联

一、外设管理者 - 发布广告

如果两部手机在BLE的基础上进行连接,需要让其中一部手机作为外设,外设需要进行广播自己需要发布的数据,以供中心设备的接收和处理。

实现外设广播数据并且处理发送过程当中的流量限制如下:

1.初始化外设管理者

2.设置外设管理者的代理

3.自动调用外设管理者状态的代理方法 - 判断外设管理者的设备是否开启

  •    3.1.初始化特征
  •    3.2.初始化服务
  •    3.3.把特征加到服务数组当中
  •    3.4.把服务加到外设管理者中 - 完整的外设管理者

4.当有中心设备订阅了外设当中的特征时,调用以下方法:

- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic;

 

在此方法中,获取到需要发送的数据并且进行发送。

  • 4.1.获取textView当中的文本作为发送的数据
  • 4.2.校准发送数据的位置,因为从第一个字节开发发送,所以设置为0
  • 4.3.开始发送数据(有数据,有数据当中的位置)

5.当中心设备取消订阅外设当中的特征时,调用一下方法:

- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic;

6.发送数据

  • 6.1.做一个结尾标注,如果这个标注有值,意味着数据发送到结尾了。判断是否发送成功,如果成功,给标注重新赋值NO,以便下一次进行发送。如果发送不成功,等待下一次发送,或者退出。
  • 6.2.如果标注没有值,进行判断,数据的位置如果大于数据的长度,直接返回(证明发送完成)
  • 6.3.如果数据的位置不大于数据的长度,设置发送状态为YES,开始循环发送数据内容。
  • 6.4.计算将要发送的数据大小
  • 如果发送的数据大于20字节,设置数据大小为20字节
  • 把所有文本数据转换为NSData数据,进行截取,20个字节大小
  • 6.5.发送截取的数据进行广播
  • 6.6.如果发送的数据是nil,直接返回
  • 6.7.把发送的二进制数据转换为字符串,输出字符串内容。
  • 6.8.数据位置进行加运算(以便把一个长文本截取为20个字节每段进行发送)
  • 6.9.判断数据位置是否大于等于数据长度(判断是否发送完成)

            6.9.1.设置结尾标注状态为YES,发送结尾标注,如果结尾标注有值(代表数据发送完成),为了再次发送数据,重置结尾标注状态为NO
7.当订阅内容进行更新时,调用下面方法:

- (void)peripheralManagerIsReadyToUpdateSubscribers:(CBPeripheralManager *)peripheral;

如果数据更新,再次发送数据。
8.当textView当中数据进行改变时,应该停止广播

9.当textView开始编辑时,在导航栏右侧添加完成按钮,点击这个按钮销毁键盘。

10.处理开始/结束广播开关

  • 10.1.如果开始广播
  • 10.2.让外设管理者广播带有XX服务的数据
  • 10.3.结束广播

 

二、中心管理者 - 接收数据

1.初始化中心管理者并且设置代理和队列

2.初始化接收数据数组

3.中心管理者的代理方法

  • 1.中心设备的开关状态
    • 1.如果中心设备为打开,直接返回
    • 2.如果中心设备状态是打开状态,开始扫描外设
  • 2.扫描具有XX服务的外设,不进行过滤处理(费电)
  • 3.发现具有XX服务的外设后,调用发现外设的代理方法
    • 1.判断如果信号强度是否超出合理范围(-15 ~ -35)
    • 2.判断外设数据是否是发现的这个外设设备,如果是直接返回
    • 3.如果不是,让外设属性持有发现的这个外设,并且进行连接


4.如果链接外设失败,调用以下代理方法
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;

   1.输出链接失败的设备和错误描述
   2.清除链接数据

  • 1.如果外设状态是未链接,直接返回
  • 2.如果外设的服务不为空,遍历服务,如果服务的特征不为空,遍历服务的特征,如果特征的UUID是外设当中特征的UUID,判断特征是否在广播,如果在广播,停止广播,返回。
  • 3.如果外设的服务为空,直接取消外设链接。

5.如果连接到外设,调用下面代理方法:
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;

  • 1.停止外设扫描
  • 2.清空数据数组
  • 3.设置外设代理
  • 4.通过外设搜索具体的XX服务

4.外设的代理方法

1.如果找到XX服务,会调用发现服务的代理方法,如下:
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error;

  • 1.判断如果存在错误,输出错误的描述,并且清空连接的数据,返回。
  • 2.如果不存在错误,通过该服务找到具体的XX特征。

2.如果XX特征被找到,调用下面代理方法:
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error;

  • 1.判断如果存在错误,输出错误描述,并且清空连接的数据,返回。
  • 2.遍历该服务当中的特征,找到我们需要的XX特征,找到后,让外设设置该特征的通知值为YES,以便获得该特征的通知。
  • 3.设置完成,等待数据进来。

3.外设的特征进行更新时,调用下面方法:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;

1.如果出错,输出错误描述,并且返回。
2.如果没出错,将接受的特征数据转换为字符串,解码UIF-8。
3.判断是否接受到了完整数据(判断数据是否包含结尾标识(EOM))

  • 1.如果包含,展示数据在空的textView当中。
  • 2.外设设置该特征的通知为NO(取消订阅该通知)
  • 3.中心管理者断开与外设的连接。
  • 4.如果没有接受到完整的数据

            1.将该特征的数据拼接到数据属性当中进行保存(拼接)
             2.输出获得的拼接数据
4.当订阅状态发生改变时(订阅/取消订阅发生时)调用下面方法:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;

  • 1.如果出现错误,输出错误描述
  • 2.如果特征不匹配,直接返回
  • 3.如果特征正在通知状态,输出具体哪个特征在发送通知。
  • 4.如果特征没有在通知状态,让中心设备与外设断开连接。
  • 5.一旦与外设断开连接,调用下面代理方法:

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;

    1.设置本地发现的外设为nil。
    2.重新开始扫描外设。

转载于:https://www.cnblogs.com/northWolves/p/6030454.html

相关文章:

  • MyEclipse开发WebService教程
  • noi 2989 糖果
  • 微软Hyper-v管理——迁移虚拟(奇葩问题)
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • 每天学点数据结构与算法
  • Zabbix服务器监控系统部署之自定义监控项的添加及配置(二)
  • PYTHON 黑帽编程 1.5 使用 WIRESHARK 练习网络协议分析
  • Javascript 函数节流
  • 利用python做数据分析(六)-reindex
  • GitHub 小试
  • Actor模式的弊端
  • 广告
  • 自学的IT程序员通常缺少哪些技能
  • IOS中获取各种文件的目录路径的方法
  • 怎么样抢注新域名
  • Angular 2 DI - IoC DI - 1
  • Angular2开发踩坑系列-生产环境编译
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • eclipse的离线汉化
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript实现分页效果
  • Linux各目录及每个目录的详细介绍
  • vue 配置sass、scss全局变量
  • Wamp集成环境 添加PHP的新版本
  • yii2权限控制rbac之rule详细讲解
  • 前端js -- this指向总结。
  • 前嗅ForeSpider采集配置界面介绍
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 树莓派 - 使用须知
  • 微信小程序填坑清单
  • 详解NodeJs流之一
  • 学习HTTP相关知识笔记
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 在Mac OS X上安装 Ruby运行环境
  • 自制字幕遮挡器
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​520就是要宠粉,你的心头书我买单
  • ​如何防止网络攻击?
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #if和#ifdef区别
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (初研) Sentence-embedding fine-tune notebook
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (九)c52学习之旅-定时器
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转) Face-Resources
  • (转) ns2/nam与nam实现相关的文件
  • (转)详解PHP处理密码的几种方式
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .apk 成为历史!
  • .net core控制台应用程序初识