zoukankan      html  css  js  c++  java
  • 蓝牙开发<coreBluetooth/CoreBluetooth.h>

    /*
     建立中心设备
     扫描外设(Discover Peripheral)
     连接外设(Connect Peripheral)
     扫描外设中的服务和特征(Discover Services And Charateristics)
     利用特征与外设做数据交互(Explore And Interact)
     断开连接(Disconnect)
     */
    
    #import "ViewController.h"
    #import <coreBluetooth/CoreBluetooth.h>
    
    @interface ViewController ()<CBCentralManagerDelegate, CBPeripheralDelegate>
    
    @property (nonatomic, strong) CBCentralManager *mgr;
    /** 发现的外设数组*/
    @property (nonatomic, strong) NSMutableArray *peripheralArray;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 1.建立中心设备
        // queque:如果说你传空,在主队列
        self.mgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
        
        // 2.扫描外设
        
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        
        // 最后一步,断开连接
        [self.mgr stopScan];
    }
    
    #pragma CBCentralManagerDelegate
    /*
    state:
    CBManagerStateUnknown = 0, 未知
    CBManagerStateResetting, 重置
    CBManagerStateUnsupported, 不支持
    CBManagerStateUnauthorized, 未经授权
    CBManagerStatePoweredOff, 没有启动
    CBManagerStatePoweredOn, 开启
     */
    - (void)centralManagerDidUpdateState:(CBCentralManager *)central {
        
        NSLog(@"state = %zd", central.state);
        // 蓝牙开启
        if (central.state == CBManagerStateUnknown) {
            
            NSLog(@"未知的蓝牙");
        }
        if (central.state == CBManagerStatePoweredOn) {
            
            // 2.扫描外设
            [self.mgr scanForPeripheralsWithServices:nil options:nil];
        }
    }
    
    /**
     3.连接外设(Connect Peripheral)
     @param peripheral 外设
     @param advertisementData 相关的二进制数据
     @param RSSI 信号强度
     */
    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {
        
        // 1.记录外设,必须要有数组进来行存储
        if ([self.peripheralArray containsObject:peripheral]) {
            
            [self.peripheralArray addObject:peripheral];
        }
        // 2.隐藏步骤,tableview表格列表(省略了)
        // 3.连接外围设备
        [self.mgr connectPeripheral:peripheral options:nil];
        // 4.设置外设的代理
        peripheral.delegate = self;
        
        
    }
    
    // 连接到外设之后,会调用这个代理方法
    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
        
        // 扫描服务
        // 传nil代表扫描所有服务
        [peripheral discoverServices:nil];
        
    }
    
    #pragma CBPeripheralDelegate
    // 外设扫描里面的服务
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
        
        // 获取外设的服务
        for (CBService *service in peripheral.services) {
            
            if ([service.UUID.UUIDString isEqualToString:@"123"]) {
                // uuid一致,那就开始扫描特征
                [peripheral discoverCharacteristics:nil forService:service];
                
            }
        }
    }
    
    // 当发现到特征的时候会调用
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
        
        //
        for (CBCharacteristic *characteristic in service.characteristics) {
            
            if ([characteristic.UUID.UUIDString isEqualToString:@"123456"]) {
                
    //            [peripheral readValueForDescriptor:<#(nonnull CBDescriptor *)#>];
                
    //            [peripheral writeValue:<#(nonnull NSData *)#> forDescriptor:<#(nonnull CBDescriptor *)#>];
            }
        }
    }
    
    
    
    - (NSMutableArray *)peripheralArray {
        
        if (!_peripheralArray) {
            
            _peripheralArray = [NSMutableArray array];
        }
        return _peripheralArray;
    }
  • 相关阅读:
    页面性能:如何系统地优化页面?
    为什么CSS动画比JavaScript高效?
    Code Review
    浏览器中的页面之CSS是如何影响到渲染流程的
    async / await
    手撸Promise
    Promise
    宏任务和微任务
    有点恶心,随手写点儿
    关于判断用户输入的是不是int类型,这次没有正则表达式
  • 原文地址:https://www.cnblogs.com/xuzb/p/8966061.html
Copyright © 2011-2022 走看看