1.基本概念

<1>中心者模式:常用的(其实99.99%)就是使用中心者模式作为开发,就是我们手机作为主机,连接蓝牙外设。由于开发只用到了中心者模式,所以我也只介绍中心者模式。

<2>管理者模式:这个基本用到的比较少,我们手机自己作为外设,自己创建服务和特征,然后有其他的设备连接我们的手机。

<3>服务(services):蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口。

<4>特征(characteristic):存在于服务下面的,一个服务下面也可以存在多个特征,特征可以理解成具体实现功能的窗口,一般特征都会有value,也就是特征值,特征是与外界交互的最小单位。

<5>UUID:以理解成蓝牙上的唯一标识符(硬件上肯定不是这个意思,但是这样理解便于我们开发),为了区分不同的服务和特征,或者给服务和特征取名字,我们就用UUID来代表服务和特征。

<6>外设名字(name):不是每一个蓝牙外设都是拥有name的。在开发的时候,当你发现name属性为空,这是很正常的,我曾经就因为这个问题纠结了很久。

2.具体的操作流程

<1>遵循两个协议

CBCentralManagerDelegate(中心管理的协议),CBPeripheralDelegate(外设的协议),并打开手机的蓝牙。

<2>创建一个中心管理(CBCentralManager),并设置代理。

代理一旦设置,就会走协议(CBCentralManagerDelegate)里面的方法。

<3>扫描周围的外设

当-(void)centralManagerDidUpdateState:(CBCentralManager *)central方法检测到本机蓝牙开启的时候,开始扫描([central scanForPeripheralsWithServices:nil options:nil];)周围的外设,必须是本机蓝牙开启之后才去扫描周围外设。

<4>获取扫描到的外设

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI;会返回扫描到的外设。如果你不关闭扫描,这个方法会一直被调用。

<5>连接外设

在上一步中选择一个外设进行连接。

- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;

在下面三个方法中可以返回蓝牙连接的状态。如果连接成功,我们就开始设置外设的代理,并获取该外设的服务;

-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;

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

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

[peripheral setDelegate:self];

[peripheral discoverServices:nil];

<6>获取已连接外设的服务

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;

该方法可以返回已连接外设的服务。在这里我们找到我们需要的服务,并获取对应服务的特征。

<7>获取对应服务的特征

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;

这个方法会给出你选择的服务里面的特种。在这里,我们找到我们需要的特种,并作为全局变量存储起来,因为我们在后面对外设进行写操作的时候会用到。这一点切记!

<8>对外设进行写操作

- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;

这里注意的是,一定要确保二进制流的正确性,检查特征的属性是否为可写,特征就是将上一步拿到的特征传入即可,type有两种,根据具体的硬件进行选择即可。对于读操作,因为比较简单,这里就不多说了。

到这里,作为中心者模式,大体的流程都已经走完。

3.使用过成功可能会遇到的坑

<1>必须在蓝牙打开的时候,才能调用扫描外围设备的API。

<2>中心外设向别的外设写入对数据的时候,一定要保证二进制串的正确性(这方面上我是吃过很大的亏的)。

4.推荐的第三方

在此,本来我是想自己封装一套蓝牙的调用机制,但是我看了BabyBlueTooth之后就放弃了。所以我强烈推荐BabyBlueTooth这个第三方库,想要的同学可以去github上面进行搜索。

5.最后附上demo地址

由于我的代码是基于我们的智能密码锁写出来的,里面的规则不便拿出来共享。所以,还是建议看BabyBlueTooth的Demo。如有任何疑问请添加QQ:2799569272,一起讨论。

iOS开发 最近开发了蓝牙模块,在此记录总结一下(转载)的更多相关文章

  1. 基于Neptune开发板的键盘蓝牙模块DIY指南

    目录: 1.下载开发板程序2.安装USB串口(CH340)驱动3.安装烧写工具4.烧写开发板程序 本期我们带来基于润和Neptune开发板(以下简称Neptune开发板)的键盘蓝牙模块DIY指南,利用 ...

  2. 51单片机 HC05蓝牙模块

    一.注意事项 1.烧写程序时,要把蓝牙tx,rx信号线拔掉,对烧写程序有影响. 2.执行HC05集命令时,均以\r\n结尾.串口中断若选择“发送新行”时,不用添加\r\n.原理相同. 二.准备软硬件 ...

  3. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  4. iOS蓝牙开发(二)蓝牙相关基础知识

    原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...

  5. iOS蓝牙开发(一)蓝牙相关基础知识(转)

    转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad , ...

  6. iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  7. BLK-MD-BC04-B蓝牙模块开发说明

    BLK-MD-BC04-B蓝牙模块开发说明 日期:2011-9-24 浏览次数:4178     BLK-MD-BC04-B蓝牙通信模块, BLK-MD-BC04-B蓝牙通信模块 为本公司自主开发的智 ...

  8. iOS开发--通过MultipeerConnectivity完成蓝牙通讯

    iOS开发–通过MultipeerConnectivity完成蓝牙通讯 iOS蓝牙通讯的三种方式: GameKit.framework:iOS7之前的蓝牙通讯框架,从iOS7开始过期,但是目前已经被淘 ...

  9. 【转】android蓝牙开发---与蓝牙模块进行通信--不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利, ...

  10. 【Arduino】开发入门【十】Arduino蓝牙模块与Android实现通信

    [Arduino]开发入门[十]蓝牙模块 首先show一下新入手的蓝牙模块 蓝牙参数特点 1.蓝牙核心模块使用HC-06从模块,引出接口包括VCC,GND,TXD,RXD,预留LED状态输出脚,单片机 ...

随机推荐

  1. zepto.js 自定义打包集成其他模块构建流程

    1.首先在自己的电脑上要安装Node.js和npm包管理工具: 2.从github上下载zepto.js的源文件包到本地磁盘(例如:E:\Learning\JS): 地址:https://github ...

  2. masscan banners 不显示

    https://github.com/robertdavidgraham/masscan/issues/221

  3. QML与C++混合编程详解

    1.QML与C++为什么要混合编程 QML与C++为什么要混合编程,简单来说,就是使用QML高效便捷地构建UI,而C++则用来实现业务逻辑和复杂算法,下面介绍了两者间交互的方法与技巧. 2.QML访问 ...

  4. Android Sshd使用

    1. 介绍 因为某些原因, 笔者需要在android上开发,  使用adb比较麻烦, 于是想使用sshd. 推荐的软件是openssh, 其他选择有dropbear, mosh.当然还有其他选择, 如 ...

  5. (4) python--seaborn

    seaborn封装了matplotlib的一些风格,简单的介绍一下

  6. Fiddler抓包4-工具介绍(request和response)【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6719717.html 前言 本篇简单的介绍下fiddler界面的几块区域,以及各自区域到 ...

  7. codevs——1553 互斥的数

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解     题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同 ...

  8. HDU 3237 Tree(树链剖分)(线段树区间取反,最大值)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 9123   Accepted: 2411 Description ...

  9. php的function() use($args)用法

    使用use返回 aaa aaa.使用函数传参数aaa bbb. use的参数必须是已经存在的,如果没有定义返回Notice: Undefined variable: word ,使用函数参数方式不需要 ...

  10. linux-设置环境变量-export

    Linux export命令用于设置或显示环境变量. 在shell中执行程序时,shell会提供一组环境变量.export可新增,修改或删除环境变量,供后续执行的程序使用.export的效力仅及于该次 ...