iOS 作为Central蓝牙连接外围(上)

本文介绍了iOS设备作为Central角色连接蓝牙外围设备的过程,包括Central和Peripheral的角色、UUID的解释、BLE中心模式的流程,以及如何初始化CBCentralManager、搜索及连接Peripheral、发现其服务和特征。文章强调了蓝牙连接的难点在于低功耗设备自动断开连接的问题,并提供了基本的蓝牙连接代码示例。
摘要由CSDN通过智能技术生成

今天说一说iOS蓝牙相关的东西,本文背景是公司的蓝牙项目,项目要求是利用手机蓝牙模块与低功耗蓝牙卡进行通信,蓝牙卡信息解析由卡厂商提供,而我们先要做的就是建立手机与蓝牙卡的连接。难点主要集中在与蓝牙卡连接断开部分,因为蓝牙卡是低能耗的,每开启蓝牙卡片蓝牙后它会在8秒后自动断开连接,所以在处理蓝牙连接的的部分逻辑较为复杂。接下来我们把重点放在与蓝牙建立连接的部分,Google之,先来搞清楚与iOS有关的蓝牙库。

先说一下蓝牙版本问题,如果你的设备支持的是蓝牙4.0之前的版本,那么会涉及到一个MFI的概念,MFI(Make For ipod/ipad/iphone)是苹果的一套认证,只有少数的硬件厂商才有苹果的MFI认证,做之前需要搞定这个认证。使用蓝牙4.0的话,由于4.0苹果开放了BLE(Bluetooth Low Energy)通道,就不会有认证的问题了,而且向下兼容。
我们用到的蓝牙库为CoreBluetooth,而蓝牙库中首先要介绍下两个概念Central和Peripheral;

Central 和 Peripheral 在蓝牙交互中的角色

所有涉及蓝牙低功耗的交互中有两个主要的角色:中心Central和外围设备Perpheral。根据一些传统的客户端-服务端结构,Peripheral通常具有其他设备所需要的数据,而Central通常通过使用Perpheral的信息来实现一些特定的功能。

这里我自己理解,如果你的设备连接的是本文这种蓝牙卡或者穿戴设备等,那么你的程序就是作为Central;如果你的设备是与另外一台iPhone设备,那么它既可以作为Central也可以作为Perpheral;

想了解更详细请参照:iOS蓝牙编程指南 – 核心蓝牙概述

UUID

每个蓝牙4.0的设备都是通过服务和特征来展示自己的,一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征。特征是与外界交互的最小单位。比如说,一台蓝牙4.0设备,用特征A来描述自己的出厂信息,用特征B来与收发数据等。

服务和特征都是用UUID来唯一标识的,UUID的概念如果不清楚请自行google,国际蓝牙组织为一些很典型的设备(比如测量心跳和血压的设备)规定了标准的service UUID(特征的UUID比较多,这里就不列举了);

UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。

UUID由以下几部分的组合:

(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。

(2)时钟序列。

(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。

BLE中心模式流程

1.建立中心角色

2.扫描外设(Discover Peripheral)

3.连接外设(Connect Peripheral)

4.扫描外设中的服务和特征(Discover Services And Characteristics)

5.利用特征与外设做数据交互(Explore And Interact)

6.订阅Characteristic的通知

7.断开连接(Disconnect)

代码说明

初始化 CBCentralManager

dispatch_queue_t centralQ = dispatch_queue_create(BLUETOOCH_QUEUE_IDENTIFER, DISPATCH_QUEUE_CONCURRENT);
 _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQ];

上面的代码中,将self设置为代理,用于接收各种 central 事件。将queue设置为nil,则表示直接在主线程中运行,这里是我自己定义的任务队列。

创建Central管理器时,管理器对象会调用代理对象的centralManagerDidUpdateState:方法。我们需要实现这个方法来确保本地设备支持BLE。

初始化 central

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值