iphone4s蓝牙怎么用(iphone4s 蓝牙)

今天跟大家分享一下iphone4s蓝牙怎么用(iphone4s 蓝牙),以下是这个问题的总结,希望对你有帮助,让我们看一看。

这篇文章的目的:教你实现设备的扫描,连接,数据收发,蓝牙数据解析。对于说法有误的地方也请老司机予以指正。

iphone4s蓝牙怎么用(iphone4s 蓝牙)

目录

0、思维导图1、苹果对蓝牙设备有什么要求2、操作蓝牙设备使用什么库3、如何扫描4、如何连接5、如何发送数据和接收数据6、如何解析数据

思维导图

这张是蓝牙知识的结构图,下面的内容将围绕这些东西展开进行。

其中ADVERTISEMENT DATA显示的就是广播信息。

iOS蓝牙无法直接获取设备蓝牙MAC地址,可以将MAC地址放到这里广播出来

FEEO是ServiceUUIDs,里面的FF01、FF02是CBCharacteristic的UUID

Properties是特征的属性,可以看出FF01具有读的权限,FF02具有读写的权限。特征拥有的权限类别有如下几种:

typedef NS_OPTIONS(NSUInteger, CBCharacteristicProperties{ CBCharacteristicPropertyBroadcast = 0x01, CBCharacteristicPropertyRead = 0x02, CBCharacteristicPropertyWriteWithoutResponse = 0x04, CBCharacteristicPropertyWrite = 0x08, CBCharacteristicPropertyNotify = 0x10, CBCharacteristicPropertyIndicate = 0x20, CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40, CBCharacteristicPropertyExtendedProperties = 0x80, CBCharacteristicPropertyNotifyEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x100, CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x200};

5、如何发送并接收数据

通过上面的步骤我们发现CBCentralManagerDelegate提供了蓝牙状态监测、扫描、连接的代理方法,但是CBPeripheralDelegate的代理方法却还没使用。别急,马上就要用到了,通过名称判断这个代理的作用,肯定是跟Peripheral有关,我们进入系统API,看它的代理方法都有什么,因为这里的代理方法较多,我就挑选几个常用的拿出来说明一下。

1)、代理方法

//发现服务的回调- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error;//发现特征的回调- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error;//读数据的回调- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;//是否写入成功的回调 – (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;

2)、步骤

通过这几个方法我们构建一个流程:连接成功->获取指定的服务->获取指定的特征->订阅指定特征值->通过具有写权限的特征值写数据->在didUpdateValueForCharacteristic回调中读取蓝牙反馈值

解释一下订阅特征值:特征值具有Notify权限才可以进行订阅,订阅之后该特征值的value发生变化才会回调didUpdateValueForCharacteristic

3)、实现上面流程的实例代码

//连接成功- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{ //连接成功之后寻找服务,传nil会寻找所有服务 [peripheral discoverServices:nil];}//发现服务的回调- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{ if (!error) { for (CBService *service in peripheral.services) { NSLog(@”serviceUUID:%@”, service.UUID.UUIDString); if ([service.UUID.UUIDString isEqualToString:ST_SERVICE_UUID]) { //发现特定服务的特征值 [service.peripheral discoverCharacteristics:nil forService:service]; } } }}//发现characteristics,由发现服务调用(上一步),获取读和写的characteristics- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { for (CBCharacteristic *characteristic in service.characteristics) { //有时读写的操作是由一个characteristic完成 if ([characteristic.UUID.UUIDString isEqualToString:ST_CHARACTERISTIC_UUID_READ]) { self.read = characteristic; [self.peripheral setNotifyValue:YES forCharacteristic:self.read]; } else if ([characteristic.UUID.UUIDString isEqualToString:ST_CHARACTERISTIC_UUID_WRITE]) { self.write = characteristic; } }}//是否写入成功的代理- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{ if (error) { NSLog(@”===写入错误:%@”,error); }else{ NSLog(@”===写入成功”); }}//数据接收- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if([characteristic.UUID.UUIDString isEqualToString:ST_CHARACTERISTIC_UUID_READ]){ //获取订阅特征回复的数据 NSData *value = characteristic.value; NSLog(@”蓝牙回复:%@”,value); }}

比如我们要获取蓝牙电量,由硬件文档查询得知该指令是**0x1B9901**,那么获取电量的方法就可以写成

– (void)getBattery{ Byte value[3]={0}; value[0]=x1B; value[1]=x99; value[2]=x01; NSData * data = [NSData dataWithBytes:&value length:sizeof(value)]; //发送数据 [self.peripheral writeValue:data forCharacteristic:self.write type:CBCharacteristicWriteWithoutResponse];}

如果写入成功,我们将会在didUpdateValueForCharacteristic方法中获取蓝牙回复的信息。

6、如何解析蓝牙数据

如果你顺利完成了上一步的操作,并且看到了蓝牙返回的数据,那么恭喜你,蓝牙的常用操作你已经了解大半了。因为蓝牙的任务大部分就是围绕发送指令,获取指令,将蓝牙数据呈现给用户。上一步我们已经获取了蓝牙指令,但是获取的却是0x567b0629这样的数据,这是什么意思呢。这时我们参考硬件文档,看到这样一段:

那么我们就可以得出设备电量是 60%。

对数据解析的流程就是:判断校验和是否正确,是不是一条正确的数据->该条数据是不是我们需要的电量数据,即首字节为0x567b->根据定义规则解析电量,传给view显示。其中第一步校验数据,视情况而定,也有不需要的情况。

本站部分内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规等内容,请举报!一经查实,本站将立刻删除。
本站部分内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如发现本站有涉嫌抄袭侵权/违法违规等内容,请<举报!一经查实,本站将立刻删除。