上篇文章iOS蓝牙4.0开发Central(CoreBluetooth) - 简书已经讲述了作为中央设备的客户端,现在来讲讲CoreBluetooth作为外围设备的情况。外围设备(Peripheral)负责发布广播服务,告诉周边中央设备它的可以服务及特征。
一般流程:
1、创建外围设备管理器CBPeripheralManager并设置代理
2、设置外围设备的服务和特征,并添加到数据库中
3、对外发布服务的广播
4、接收来自连接上的中心设备的各种请求(读和写)
5、向订阅了特征值改变的中心设备发送通知
详细步骤(附带部分代码):
要求:在Xcode导入CoreBluetooth动态库;
在你的类中引用CoreBluetooth/CoreBluetooth.h;
iOS10还需要加入蓝牙的权限说明NSBluetoothPeripheralUsageDescription
a、创建外围设备的管理对象,并指定代理
b、创建了CBPeripheralManager,会执行它的第一个代理peripheralManagerDidUpdateState:,通过蓝牙的状态来执行下一步动作,当蓝牙开启状态下可以去设置服务和特征。
c、设置外围设备的服务和特征,并添加到数据库
设置服务和特征,外设的服务和特征通常是通过一个128位的蓝牙UUID来表示的,但是通过SIG定义或分发的通用UUID可以被缩短为16位,例如:服务的16位UUID180D,这个UUID是UUID0000180D-0000-1000-8000-00805F9B34FB简便形式.
这里我先定义几个UUID
构建服务和特征树,创建可变特征时,可以指定它的属性、value值和许可。当你给某个特征指定一个值,如果你需要这个该特征的值是可写的或希望这个特征的值在其所属服务的生命周期中是可以改变的,你必须指定这个value值为nil。这样做来确保这个值是动态的和当外设管理器接收来自中心设备的读和写请求是可以被外设管理器请求。
到此就有了两个服务了,第一个服务有一个通知特征和一个可读写的特征,另一个服务只有一个只读的特征。
d、添加服务和特征到数据库中
e、数据库添加成功后会调用- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error代理方法,在代理方法中就可以开始对外广播了
到此,外部的中央设备就可以搜索并连接上了。
f、响应来自连接上的中心设备的读和写请求
当中心设备针对你的可读特征的服务发送请求时,会执行didReceiveReadRequest:的回调,通过判断是否有可读的权限,返回请求成功的响应
写的请求跟读相类似
在这个代理方法中可以取到中心设备写入的值,通过写入的值我们可以编好一些指令,实现某些动作,从而来实现交互。
g、给已经订阅的中心设备发送更新特征的值(Notify)
当中心设备订阅了特征上的值,外设管理器会调用peripheralManager:central:didSubscribeToCharacteristic:方法
需要给中心设备更新数据,都可用CBPeripheralManager 的 updateValue:forCharacteristic:onSubscribedCentrals:把更新数据发送过去,作为外设可以定时给中心设备发送状态更新,也就实现了外设跟中心设备的交互。
中心设备如取消了订阅,外设一样会接收到回调消息
如果需要Demo的请到这GitHub - zshuo50/BLEFollow下载参考,希望对你的学习有所帮助。可以在AppStore下载LightBlue这个软件来作为调试工具,不论是中央设备还是外部设备它都能满足你的需求。