zoukankan      html  css  js  c++  java
  • CoreBluetooth蓝牙4.0的封装

    随着智能家居的发展,蓝牙技术越发重要,尤其是蓝牙4.0.以下是我对蓝牙4.0的封装。

    使用时只需导入这个蓝牙类即可。

    DSBluetoothTool.h

    #import <Foundation/Foundation.h>
    #import <CoreBluetooth/CoreBluetooth.h>
    @protocol DSBluetoothToolDelegate <NSObject>
    @optional
    /*************扫描到蓝牙设备时调用**********************/
    - (void) peripheralFound:(CBPeripheral *)peripheral;
    /*************连接上设备时调用***********************/
    - (void) setConnect;
    /*************断开连接时调用***********************/
    - (void) setDisconnect;
    /*************出现低电量时调用************************/
    - (void) lowBattery;
    /*************读取设备版本号**************************/
    - (void) ballVersions:(NSString *)versions;
    /*************读取设备ID**************************/
    - (void) ID:(NSString *)str;
    @end
    @interface DSBluetoothTool : NSObject<CBCentralManagerDelegate,CBPeripheralDelegate>
    @property (nonatomic, strong)id<DSBluetoothToolDelegate>delegate;
    +(DSBluetoothTool *)shareBluetooth;
    /**
     *  扫描蓝牙
     */
    -(void)scanfBlueToothWith:(int)timeout;
    /**
     *  连接蓝牙设备
     *
     *  @param peripheral 扫描到的蓝牙设备
     */
    -(void)connect:(CBPeripheral *)peripheral;
    /**
     *  断开蓝牙
     *
     *  @param peripheral 需要断开的蓝牙设备
     */
    -(void)disconnect:(CBPeripheral *)peripheral;
    /**
     *  给设备发送指令
    */
    -(void) write:(CBPeripheral *)peripheral data:(NSString *)data;
    /**
     *  读取蓝牙设备广播信息
    */
    -(void) read:(CBPeripheral *)peripheral;
    /**
     *  设备通知
     */
    -(void) notify:(CBPeripheral *)peripheral on:(BOOL)on;
    
    
    @end

    DSBluetoothTool.m

    #import "DSBluetoothTool.h"
    #import "Commonds.h"
    
    @interface DSBluetoothTool()
    @property (nonatomic, strong)CBCentralManager *centeralManager;
    @property (nonatomic, strong)CBPeripheral *peripheral;
    @property (nonatomic, strong)CBCharacteristic *writeCharacter;
    
    @end
    @implementation DSBluetoothTool
    /**
     *  懒加载中心设备
     */
    -(CBCentralManager *)centeralManager{
        if (!_centeralManager) {
            _centeralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
        };
        return _centeralManager;
    }
    +(DSBluetoothTool *)shareBluetooth{
        static DSBluetoothTool *inst;
        if(inst == nil){
            inst  = [[DSBluetoothTool alloc] init];
            
        }
        return inst;
    }
    #pragma mark -- 扫描蓝牙设备
    -(void)scanfBlueToothWith:(int)timeout{
        if (self.centeralManager.state == CBCentralManagerStatePoweredOn) {
            [self.centeralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"0xFFF0"],[CBUUID UUIDWithString:@"0xFFE0"],[CBUUID UUIDWithString:@"0x18F0"]] options:0];
        }
        [NSTimer scheduledTimerWithTimeInterval:timeout target:self selector:@selector(stopScanfBluetooth:) userInfo:nil repeats:NO];
        
    }
    #pragma mark -- 停止扫描蓝牙
    -(void)stopScanfBluetooth:(NSTimer *)timer{
        [self.centeralManager stopScan];
        timer = nil;
    }
    #pragma mark -- 连接蓝牙
    -(void)connect:(CBPeripheral *)peripheral{
        
        if (peripheral.state == CBPeripheralStateDisconnected) {
            [self.centeralManager connectPeripheral:peripheral options:nil];
        }
        NSLog(@"%@",peripheral);
    }
    #pragma mark -- 断开蓝牙
    -(void)disconnect:(CBPeripheral *)peripheral{
        [self.centeralManager cancelPeripheralConnection:peripheral];
    }
    #pragma mark ---CBCentralManagerDelegate(扫描到蓝牙时调用)
    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
        
        self.peripheral = peripheral;
        [self.delegate peripheralFound:self.peripheral];
        
    }
    #pragma mark --- 连接上设备时调用
    -(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
        self.peripheral = peripheral;
        self.peripheral.delegate = self;
        [self.peripheral discoverServices:nil];
        [self.delegate setConnect];
    }
    #pragma mark --- 发送命令
    -(void)write:(CBPeripheral *)peripheral data:(NSString *)data{
    
        [peripheral writeValue: [self convertHexStrToData:data]forCharacteristic:self.writeCharacter type:CBCharacteristicWriteWithoutResponse];
    }
    #pragma mark --- 发现服务时调用
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error{
        for (CBService *service in peripheral.services)
        {
            
            if ([service.UUID isEqual:[CBUUID UUIDWithString:SW20P_SERVICE_UUID]])
            {
                NSLog(@"发现20P的服务: %@", service.UUID);
                [peripheral discoverCharacteristics:nil forService:service];
                
                break;
            }
        }
    }
    #pragma mark -- 发现特征时调用
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error{
        for (CBCharacteristic *characteristic in service.characteristics)
        {
            if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:SW20P_CHAR_UUID]])
            {
                NSLog(@"发现20P的特征:%@ for service: %@", characteristic.UUID, service.UUID);
                
                self.writeCharacter = characteristic;//保存读的特征
                break;
            }
        }
    }
    //中新设备更新状态时调用
    - (void)centralManagerDidUpdateState:(CBCentralManager *)central{
        
    }
    -(void) read:(CBPeripheral *)peripheral{
        
    }
    /**
     *  设备通知
     */
    -(void) notify:(CBPeripheral *)peripheral on:(BOOL)on{
        
    }
    #pragma mark -- 十六进制转换为NSData数据流
    - (NSData *)convertHexStrToData:(NSString *)str {
        if (!str || [str length] == 0) {
            return nil;
        }
        
        NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
        NSRange range;
        if ([str length] % 2 == 0) {
            range = NSMakeRange(0, 2);
        } else {
            range = NSMakeRange(0, 1);
        }
        for (NSInteger i = range.location; i < [str length]; i += 2) {
            unsigned int anInt;
            NSString *hexCharStr = [str substringWithRange:range];
            NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
            
            [scanner scanHexInt:&anInt];
            NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
            [hexData appendData:entity];
            
            range.location += range.length;
            range.length = 2;
        }
        
        
        return hexData;
    }
    
    @end

      

    源码连接地址:http://pan.baidu.com/s/1i4pHKDv

  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/DLS520/p/5106670.html
Copyright © 2011-2022 走看看