zoukankan      html  css  js  c++  java
  • iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理) 2

    1.创建中心设备,并设置代理

    CBCentralManagerDelegate,CBPeripheralDelegate

    一般情况下,手机是中心设备,蓝牙设备是外围设备。

    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    

    1.创建之后,会进入到改变蓝牙状态的代理方法中。

    - (void)centralManagerDidUpdateState:(CBCentralManager *)central;
    

    在这个方法中,可以判断蓝牙的状态,进行相应的操作。

    CBCentralManagerStateUnknown = CBManagerStateUnknown,
    CBCentralManagerStateResetting = CBManagerStateResetting,
    CBCentralManagerStateUnsupported = CBManagerStateUnsupported,
    CBCentralManagerStateUnauthorized = CBManagerStateUnauthorized,
    CBCentralManagerStatePoweredOff = CBManagerStatePoweredOff,
    CBCentralManagerStatePoweredOn = CBManagerStatePoweredOn,
    

    2.当蓝牙的状态是开启的时候,开始扫描外围设备。如果蓝牙支持后台模式,那么要指定服务的UUID,否则在后台断开之后,连接不上蓝牙,不支持后台的话,就设置成nil。option:CBCentralManagerScanOptionAllowDuplicatesKey 如果为YES,会让中心设备不断的监听外部设备的消息,NO则不能。如果为YES可能会很耗电,根据需求设置就好。

    if (central.state == CBCentralManagerStatePoweredOn) {
            [self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:nil];
        }
    

    3.当扫描到外围设备的时候,就会进入下面方法。

    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<<span style="color: #00b1ff">NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI;
    

    在这个方法中,我们可以根据不同的条件来筛选我们需要连接的外围设备,我这边是根据名字来筛选的。匹配到你需要的设备之后,就开始连接这个设备了。

    if ([peripheral.name isEqualToString:kPeripheralName]) {
            peripheral.delegate = self;
            self.selectedPeripheral = peripheral;
            // 开始连接设备
            [self.centralManager connectPeripheral:self.selectedPeripheral options:nil];
        }
    

    4.连接成功和失败都会进入代理方法。

    - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error ;
    
    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
    

    这里暂停一下,

    如果你附近就一个需要连接的蓝牙,那么直接判断名字来连接就好了,但是如果像蓝牙锁这种,附近可能名字一样的蓝牙有很多,那么你怎么知道你要连接的是哪一个蓝牙呢?那么,在这个时候,就要根据蓝牙的mac地址来区分了。因为iOS7之后,苹果就无法获取设备的mac地址,所以现在的蓝牙大部分是将蓝牙的mac地址写在蓝牙设备系统的sevrice里面,一般UUID是180A(Device Information),而特征的UUID 是2A23(System ID)。根据你需要连接的蓝牙的mac地址,来连接。
    好了继续刚才说的,扫描相应的特征。

    for (CBService *service in peripheral.services) {
            if ([service.UUID isEqual:[CBUUID UUIDWithString:@"180A"]]) {
                [self.selectedPeripheral discoverCharacteristics:nil forService:service];
            }
        }
    

    5.扫描到特征之后,进入代理方法

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;```
    
    在这里就可以进行读写的操作了。读数据有两种方式,一种是read,一种是notify。我们可以用LightBlue来看到这个特征是否是支持notify,一般固定不变的数据都是用read,会有改变的数据用notify。
    
    

    for (CBCharacteristic *characteristic in service.characteristics) {
    if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A23"]]) {
    // 这里是读取Mac地址,数据固定,用readValueForCharacteristic,不用setNotifyValue:setNotifyValue
    [self.selectedPeripheral readValueForCharacteristic:characteristic];
    }
    }

    
    6.读取到数据的时候,进入代理方法。
    
    
    • (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error;
    
    在这里根据公司定下的数据规则来解析数据就好了。
    我这边把mac地址的解析出来了,当例子来看吧。
    
    

    NSString *orStr = characteristic.value.description;
    if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A23"]]) {
    NSMutableString *macString = [[NSMutableString alloc] init];
    [macString appendString:[[orStr substringWithRange:NSMakeRange(16, 2)] uppercaseString]];
    [macString appendString:@":"];
    [macString appendString:[[orStr substringWithRange:NSMakeRange(14, 2)] uppercaseString]];
    [macString appendString:@":"];
    [macString appendString:[[orStr substringWithRange:NSMakeRange(12, 2)] uppercaseString]];
    [macString appendString:@":"];
    [macString appendString:[[orStr substringWithRange:NSMakeRange(5, 2)] uppercaseString]];
    [macString appendString:@":"];
    [macString appendString:[[orStr substringWithRange:NSMakeRange(3, 2)] uppercaseString]];
    [macString appendString:@":"];
    [macString appendString:[[orStr substringWithRange:NSMakeRange(1, 2)] uppercaseString]];
    }

    
    7.写入数据
  • 相关阅读:
    面向机器学习的特征工程
    卷积可视化,图像理解,deepdream,风格迁移
    损失函数
    开源是如何支撑区块链技术发展的
    揭秘机密计算:弥补最后一个入侵 “漏洞”
    什么是超大规模数据中心?
    比特币是避险资产还是储备资产?
    区块链技术生态持续优化,五大趋势不容忽视
    物联网低功耗广域网(LPWAN)的比较
    碎片化是物联网快速发展的阻碍,也是机会
  • 原文地址:https://www.cnblogs.com/niit-soft-518/p/8608467.html
Copyright © 2011-2022 走看看