对iOS蓝牙的一些探索

作者: 点融黑帮 | 来源:发表于2016-11-28 11:41 被阅读327次

    蓝牙是瑞典的爱立信公司在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];

    小结

    蓝牙的发展,是我们生活智能化的萌芽,它就像我们人类的语言一样,可以让智能设备更好的交流沟通,让科技之间更好的协作,也是软件与硬件连接的一个桥梁,蓝牙技术值得你我进行深入探索。

    本文作者:班建华(点融黑帮),来自点融北京技术团队,拥有三年金融行业软件研发经验,热爱软件开发,喜欢探索新的技术。

    相关文章

      网友评论

        本文标题:对iOS蓝牙的一些探索

        本文链接:https://www.haomeiwen.com/subject/nfaiuttx.html