1,创建蓝牙工程
2,导入头文件
#import
3,实现代理:
4,创建中心设备和外部设备数组,并初始化。
中心设备和外设联机的文字描述为:
1):iOS这边蓝牙中心管理器开始扫描广播包(扫描的时长可以自己写一个定时器控制,并且可以设定扫描的具体条件)
2):外设开始广播(当然外设的广播时长也是可以设定的,这是硬件那边的事,不太懂)
3):iOS发现有广播包,就请求连接外设(这是底层自动实现,我们不需要写代码),之后外设会接收到连接请求,如果外设接收这个连接请求,就会给iOS那边发送一个连接请求的确认包,当iOS这边收到这个包后,两边设备就完成了连接.
4):连接成功之后IOS这边就可以读取外设的相关信息了,比如服务号CBService,特征值号CBCharacteristic,还有外设的一些硬件信息,电池电量,信号强度RSSI什么的.
5):在正常连接的过程中总会出现点意外,如果两个设备突然断掉了连接,一般我们还是希望它们能够再次连接的,这里就得要看硬件和iOS程序里对于连接断开的处理代码了.
6):外设和IOS端也可以主动发起断开连接的请求.
//中心设备
@property (nonatomic,strong)CBCentralManager *cBCenterMgr;
//外部设备数组
@property (nonatomic,strong)NSMutableArray *perpheralArray;
5,实现代理方法
#pragma mark----CBCentralManagerDelegate
//判断中心设备蓝牙开启状态,如果开启,则启动扫描。
这个方法主要是来检查IOS设备的蓝牙硬件的状态的,比如说设备不支持蓝牙4.0,或者说设备的蓝牙没有开启,没有被授权什么的,一般是确定了iOS设备的蓝牙处于打开的情况下,才应该执行扫描的动作,
- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
//发现设备,如果发现设备,则加入中心设备数组。
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
//链接蓝牙设备。
- (void)connectPeripheral:(CBPeripheral *)peripheral options:(NSDictionary *)options;
//取消连接设备。
- (void)cancelPeripheralConnection:(CBPeripheral *)peripheral;
//链接外设成功回调,在这个方法里,可以执行停止中心设备的扫描的操作。
如果能回调到下面这个方法,说明已经成功连接外设了
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
//断开外设后回调,在这个方法里,可以执行重连等操作。
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
#pragma mark----CBPeripheralDelegate
//扫描外设中的服务
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
[peripheral discoverCharacteristics:nil forService:service];
}
//扫描服务中的特征,在这个方法中,可以取到特定的特征。
能进入到这个方法,说明已经读取到某个特征值UUID了,到达这一步,我们基本上也完成对外设的层层剥离了,接下来就是一些对某个特征值的读写操作了,当然我们首先要找到我们需要写数据的特征值UUID了,这里我们可以简单地通过循环来找出外设含有的某个特征值UUID。
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
//中心读取外设实时数据
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
if (characteristic.isNotifying) {
[peripheral readValueForCharacteristic:characteristic];
}
}
//检测中心向外设写数据是否成功
-(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
//获取外设发来的数据,不论是read和notify,获取数据都是从这个方法中读取。
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
6,设置通知,往特征里写数据。(写入数据和设置通知的特征是不同的两个特征),可以根据通过 characteristic.properties来查看各个特征的属性值,先设置通知,再写入值。
- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;
- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;
7,取出从外设传来的数据。