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

如果两部手机在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.重新开始扫描外设。

Core Bluetooth下实现两个设备进行互联的更多相关文章

  1. core Bluetooth(蓝牙4.0)

    蓝牙4.0以低功耗著称,一般也叫BLE(Bluetooth Low Energy). 目前主要应用的场景有:智能家居.运动手环和室内导航等. 利用core Bluetooth框架可以实现苹果设备与第三 ...

  2. 【转】Core Bluetooth框架之一:Central与Peripheral

    原文网址:http://southpeak.github.io/blog/2014/07/29/core-bluetoothkuang-jia-zhi-%5B%3F%5D-:centralyu-per ...

  3. Core Bluetooth【官方文档翻译】【02】

    1.中心设备和外围设备以及它们在蓝牙通讯中的角色. 在所有的BLE( Bluetooth low energy,下文简称蓝牙4.0 )通讯中都涉及2个主要的角色:中心设备和外围设备.它是基于传统的客户 ...

  4. Core Bluetooth 概述 【官方文档翻译】

    Core Bluetooth 框架在Mac和iOS平台,为配备了低功耗蓝牙无线技术的设备提供了进行通信所需要的类.例如,您的应用程序可以发现,探索,和低功耗的外围设备进行交互,如心率监视器.数字温控器 ...

  5. iOS 上的蓝牙框架 - Core Bluetooth for iOS

    原文: Core Bluetooth for iOS 6 Core Bluetooth 是在iOS5首次引入的,它允许iOS设备可以使用健康,运动,安全,自动化,娱乐,附近等外设数据.在iOS 6 中 ...

  6. IOS 蓝牙(GameKit、Core Bluetooth)

    GameKit的蓝牙开发注意 ● 只能用于iOS设备之间的连接 ● 只能用于同一个应用程序之间的连接 ● 最好别利用蓝牙发送比较大的数据 /* 关于蓝牙的数据传输  1. 一次性传送,没有中间方法,所 ...

  7. Core BlueTooth官方文档翻译

    本⽂文是苹果<Core Bluetooth Programming Guide>的翻译. 关于Core Bluetooth Core Bluetooth 框架提供了蓝⽛牙低功耗⽆无线设备与 ...

  8. 【转】Core Bluetooth框架之二:后台处理

    原文网址:http://southpeak.github.io/blog/2014/07/31/core-bluetoothkuang-jia-zhi-er-:hou-tai-chu-li/ 在开发B ...

  9. C# 6 与 .NET Core 1.0 高级编程 - 40 ASP.NET Core(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 40 章  ASP.NET Core(下)),不对的地方欢迎指出与交流. 章节出自<Professiona ...

随机推荐

  1. java中的io系统详解(转)

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  2. .net 地址栏传中文乱码 的解决方法

    1.设置web.config文件. <system.web> ...... <globalization requestEncoding="gb2312" res ...

  3. OpenCV——像素数据类型总结<摘>

    1.Unsigned 8bits(一般的图像文件格式使用的大小)IplImage数据结构参数:IPL_DEPTH_8UCvMat数据结构参数:CV_8UC1,CV_8UC2,CV_8UC3,CV_8U ...

  4. zoj Grouping(强连通+缩点+关键路径)

    题意: 给你N个人,M条年龄大小的关系,现在打算把这些人分成不同的集合,使得每个集合的任意两个人之间的年龄是不可比的.问你最小的集合数是多少? 分析: 首先,假设有一个环,那么这个环中的任意两个点之间 ...

  5. 【solr基础教程之一】Solr相关知识点串讲

           Solr是Apache Lucene的一个子项目.Lucene为全文搜索功能提供了完备的API,但它只作为一个API库存在,而不能直接用于搜索.因此,Solr基于Lucene构建了一个完 ...

  6. __m128i的理解[转]

    __m128i被称为128bits的整数,当我们对其赋值时,调用 __m128i _mm_set1_epi32(int i) Sets the four signed 32-bit integer v ...

  7. 在Git中一定要关注的crlf自动转换

    GitHub 第一坑:换行符自动转换 如果你已经做出了错误的选择,也不需要重新安装,可以直接使用命令行来修改设置.很简单,直接打开这货自带的命令行工具 Git Bash,输入以下命令,再敲回车即可: ...

  8. tomcat 项目部署问题

    我本地Tomcat版本:Apache Tomcat/8.0.3.0 服务器端:Apache Tomcat/6.0.37 JVM都是:1.7.0_40-b43 之前项目运行正常,在我更新了一些模块后,重 ...

  9. QObject就有eventFilter,功能很强(随心所欲的进行处理,比如用来QLineEdit分词)

    相信大家都用过词典吧!因为英语不太好...O(∩_∩)O~,所以经常进行划词翻译! 简述 实现 效果 源码 更多参考 实现 原理:鼠标移至某单词之上,获取鼠标位置,然后在对应位置进行取词,翻译! 基于 ...

  10. Arcgis api For silverlight 加载高德地图

    原文 http://www.cnblogs.com/thinkaspx/archive/2012/11/13/2767752.html 地图仅供演示,研究使用.如要商用 请联系厂商. public c ...