对iOS蓝牙的一些探索
蓝牙是瑞典的爱立信公司在1994年发明的,到现在已有20多年的历史,大概经历了以下几个版本。
1和1.1版本,主要用于耳机和设备之间的无线通信
2.0和2.1版本,增加了数据的传输速度,因此可以允许立体声音乐从手机播放器传都无线耳机上
3.0版本,允许更高的数据传输速率,可以做到在设备间传输大文件
4.0版本,我们称之为蓝牙智能
核心与特点
蓝牙,是一个基于点对点的通信系统,其中一台拥有数据的设备作为服务器,另一台消费数据的设备作为客户端,作为一个无线技术标准,可以实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换。
两部iphone手机,手机A里面有一手好听的歌曲,手机B里面没有,可以把手机A里面的歌曲通过蓝牙设备传送给B手机,那么A手机就是服务器,B手机就是客户端了。
蓝牙具有实现简单的特点,作为一个无线技术标准,可以实现固定设备,移动设备和楼宇个人域网之间的短距离数据交换,不需要系统层的驱动。换句话说,应用既可以是驱动,也可以是软件。
蓝牙开发
最常用的蓝牙sdk 是CoreBluetooth.framework 提供的。它是从ios5开始可用,是专门为蓝牙设备设计的。
在ios中,一般服务器叫做外围设备,客户端叫做中心设备。Ios设备作为客户端从一个蓝牙设备读取数据,可以用CoreBluetooth.framework里的CBCentralManager这个类来做事情。Ios设备作为服务端发送数据,则用CBPeripheral 类来表示。
客户端的功能实现的基本思路就是,实例化CBCentralManager 类,然后设置代理,扫描周围服务端,若扫描到之后,则进行连接,连接成功之后,就可以顺利接收数据了。
具体实现步骤:
创建客户端
centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:nil];
扫描外围设备
[cetralManager scanForPeripheralsWithServices:nil options:nil];
找到外围设备后,通过CBCentralManagerDelegate 的 centralManager:didDiscoverPeripheral:advertismentData:RSSI:方法可以获取外围设备的详细信息。
发现外围设备,并连接软件而言,其用户体验的量化标准便是appstore的评分。
[centralManager connectPeripheral:peripheral options:nil];
寻找外围设备提供的服务
在委托方法didConnectPeripheral中发现外围设备提供的服务。
[Peripheral discoverServices:nil];
外围设备提供的服务列表是通过 CBCentralManagerDelegate 中的另一个委托方法 peripheral:didDiscoverServices:通知的。
从相应匹配的服务中发现符合特性
通过didDiscoverCharacteristcsForService:error:委托回调可以得到制定服务的特性列表。
收到数据,或者处理数据
通过委托方法 peripheral:didUpdateValueForCharacteristic:error:中接收数据。
服务端的实现方法与客户端大同小异,服务端是通过CBPeripheral类来实现,它的大概思路为,创建实例化对象,设置代理,创建服务设备,然后与客户端进行连接,若发现已经连接,则可以向客户端发送数据。
具体实现方法:
初始化外围设备管理器
manager = [[CBPeripheralManager alloc]initWithDelegate:self queue:nil]
外围设备管理器委托。
通过CBPeripheralManager 的代理方法 peripheralManagerDidUpdateState:来实现委托。
创建外围设备服务
CBUUID *serviceUUID = [CBUUID UUIDWithString:kServiceUUID];
service = [[CBMutableService alloc] initWithType:serviceUUID primary:YES];
CBUUID * charcteristicUUID = [CBUUID UUIDWithString:k CharcteristicUUID];
characteristic = [[CBMutableCharcteristic alloc]initWithType:kCharacteristicUUID properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];
[service setCharacteristics:@[characteristic]];
[manager addService:service];
外围设备的didAddService 委托
添加服务器之后,就是开启广播。在成功添加服务器的委托回调里开启广播
[manager dtartAdvertising:@{CBAdertisementDataLocalNameKey:@“namekey”,CBAdertisementDataServiceUUIDkey:@[[CBUUID UUID WithString:kServiceUUID]]}];
中心设备订阅委托回调didSubscribeToCharacteristic
[subscribedCentrals addObject:central];
通知已订阅设备
[manager updateValue:data forCharacteristic:characteristic onSubscribedCentrals:subscribedCentrals];
小结
蓝牙的发展,是我们生活智能化的萌芽,它就像我们人类的语言一样,可以让智能设备更好的交流沟通,让科技之间更好的协作,也是软件与硬件连接的一个桥梁,蓝牙技术值得你我进行深入探索。
本文作者:班建华(点融黑帮),来自点融北京技术团队,拥有三年金融行业软件研发经验,热爱软件开发,喜欢探索新的技术。