欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS进阶--蓝牙技术

程序员文章站 2022-07-06 20:26:48
...

声明:这篇文章关于蓝牙的相关知识的笔记,文章中会其他网上作者的资料。由于有些文章只做参考或统计不足,如涉及版权请在评论区留言~,我会及时更改
当下蓝牙开发可谓是越来越火,不论是智能穿戴的兴起还是物联网蓝牙还是一些其他设备等等,我在最近做了两个蓝牙项目,从最初的只是通过协议实现,到现在对使用的底层协议研究,在调研中使用了很对一些类似于单面机一些机制,如果有 这方面基础的会更好的学习
首先,我们看一下最近比较火的两个蓝牙版本 4.0 和4.1
蓝牙4.0实际是个三位一体的蓝牙技术,它将传统蓝牙、低功耗蓝牙和高速蓝牙技术融合在一起,这三个规格可以组合或者单独使用。也就是说 BLE是蓝牙4.0增加的,之前没有?(TBD)
蓝牙4.0专门面向对成本和功耗都有较高要求的无线方案,其主打特性就是省电、省电、省电。极低的运行和待机功耗使得一粒纽扣电池甚至可连续工作一年之久。它有低功耗、经典、高速三种协议模式。其中:高速蓝牙主攻数据交换与传输;经典蓝牙则以信息沟通、设备连接为重点;低功耗蓝牙以不需占用太多带宽的设备连接为主。这三种协议规范能够互相组合搭配,从而适应更广泛的应用模式。正因为有了三种可以互相组合搭配的协议,蓝牙4.0因此成为唯一一个综合协议规范。它有着极低的运行和待机功耗。此外,低成本和跨厂商互操作性,3毫秒低延迟、AES-128加密等诸多特色,可以用于计步器、心律监视器、智能仪表、传感器物联网等众多领域,大大扩展蓝牙技术的应用范围。

蓝牙4.1主打IOT(Internet Of Things全联网),最新的蓝牙4.1标准是个很有前途的技术,其智能、低功耗、高传输速度、连接简单的特性将适合用在许多新兴设备上。
蓝牙4.1设备可以同时作为发射方和接受方,并且可以连接到多个设备上。举个例子,智能手表可以作为发射方向手机发射身体健康指数,同时作为接受方连接到蓝牙耳机、手环或其他设备上。蓝牙4.1使得批量数据可以以更高的速率传输,当然这并不意味着可以用蓝牙高速传输流媒体视频,这一改进的主要针对的还是刚刚兴起的可穿戴设备。例如已经比较常见的健康手环,其发送出的数据流并不大,通过蓝牙4.1能够更快速地将跑步、游泳、骑车过程中收集到。因为新标准加入了对IPv6专用通道联机的支持,通过IPv6连接到网络,实现与Wi-Fi相同的功能,解决可穿戴设备上网不易的问题。
蓝牙4.0和4.1的比较
iOS进阶--蓝牙技术

蓝牙4.0低功耗(BLE)

TI低功耗蓝牙(BLE)介绍 这是现在开发应用中常用的
① 低功耗蓝牙Bluetooth Low Energy(BLE)是蓝牙4.0增加的。(?TBD) ,苹果系列都支持4.0.
② Android4.3(API级别18)引入内置平台支持BLE的central角色,同时提供API和app应用程序用来发现设备,查询服务,和读/写characteristics。与传统蓝牙(ClassicBluetooth)不同,蓝牙低功耗(BLE)的目的是提供更显著的低功耗。这使得Android应用程序可以和具有低功耗的要求BLE设备,如接近传感器,心脏速率监视器,健身设备等进行通信。
③ BLE低功耗蓝牙软件有2个主要组成: OSAL操作系统抽象层和 HAL硬件抽象层,多个Task任务和事件在OSAL管理下工作,而每个任务和事件又包括3个组成:BLE 协议栈,profiles和应用程序。
那接下来我们先看一下硬件中的蓝牙协议实现

蓝牙协议的组成

iOS进阶--蓝牙技术
蓝牙协议体系中的协议按SIG的关注程度分为四层:
1.核心协议:BaseBand、LMP、L2CAP、SDP;
2.电缆替代协议:RFCOMM;
3.电话传送控制协议:TCS-Binary、AT命令集;
4.选用协议:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、WAE。

除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口。在图1中,HCI位于L2CAP的下层,但HCI也可位于L2CAP上层。
蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。
这些都是一些供我们需要了解的资料,我们可以简单了解一下。

iOS应用

下面,我将就在iOS应用中的学习与大家分享:
首先,我们先了解我们在开发中要使用的几个概念
服务(services):蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口;
特征(characteristic):存在于服务下面的,一个服务下面也可以存在多个特征,特征可以理解成具体实现功能的窗口,一般特征都会有value,也就是特征值,特征是与外界交互的最小单位;
UUID:可以理解成蓝牙上的唯一标识符(硬件上肯定不是这个意思,但是这样理解便于我们开发),为了区分不同的服务和特征,或者给服务和特征取名字,我们就用UUID来代表服务和特征。
然后,我们引进框架,实现CBPeripheralDelegate代理方法和两个协议
/* 中心管理者 /
@property (nonatomic, strong) CBCentralManager *cMgr;
/* 连接到的外设 /
@property (nonatomic, strong) CBPeripheral *peripheral;
实现代理方法
发现服务


- (void) peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
//发现服务实现方法
}

特征发现
- (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
NSLog(@"特征发现");
//发现特征进行特征辨别
}

上行广播发射服务

- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
// 收到广播实现的方法
}

另外,如果我们想实现下行写入的话吗,需要硬件支持写入,并开放uuid

 [self.peripheral writeValue:data forCharacteristic:self.txCharacteristic type:CBCharacteristicWriteWithoutResponse];

当然,关于广播包内容和写入内容,建议与硬件工程师一起沟通。。。。
欢迎一起交流学习,写的不是很准确的地方还请大家批评指正