You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
5.8 KiB

//
// RTKLEProfile.h
// RTKLEFoundation
//
// Created by jerome_gu on 2019/4/10.
// Copyright © 2019 Realtek. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>
#ifdef RTK_SDK_IS_STATIC_LIBRARY
#import "RTKLEPeripheral.h"
#else
#import <RTKLEFoundation/RTKLEPeripheral.h>
#endif
NS_ASSUME_NONNULL_BEGIN
@class RTKLEProfile;
/**
* The RTKLEProfileDelegate protocol defines methods that a delegate of a RTKLEProfile object must adopt.
*/
@protocol RTKLEProfileDelegate <NSObject>
@required
/**
* Invoked when the underlying central managers state is updated.
* @discussion Commands should only be issued when the underlying central manager state is <code>CBCentralManagerStatePoweredOn</code>
*/
- (void)profileManagerDidUpdateState:(RTKLEProfile *)profile;
@optional
/**
* Invoked when the Profile discovers a peripheral while scanning.
*
* @discussion Depend on the concrete Profile class, only interested peripheral is discovered. The discovered peripheral is typically a subclass of RTKLEPeripheral, which may provide more methods to operate with peripheral.
*/
- (void)profile:(RTKLEProfile *)profile didDiscoverPeripheral:(RTKLEPeripheral *)peripheral;
/**
* Invoked when a connection is successfully created with a peripheral.
*
* @discussion You typically implement this method to perform specific operation.
*/
- (void)profile:(RTKLEProfile *)profile didConnectPeripheral:(RTKLEPeripheral *)peripheral;
/**
* Invoked when the central manager fails to create a connection with a peripheral.
*
* @discussion Unlike the CBCentralManager, this connect methods of RTKLEProfile will time out. When connection time out, the error parameter has a RTKErrorTimeout code.
*/
- (void)profile:(RTKLEProfile *)profile didFailToConnectPeripheral:(RTKLEPeripheral *)peripheral error:(nullable NSError *)error;
/**
* Invoked when an existing connection with a peripheral is torn down.
*/
- (void)profile:(RTKLEProfile *)profile didDisconnectPeripheral:(RTKLEPeripheral *)peripheral error:(nullable NSError *)error;
@end
/**
* RTKLEProfile objects are used to manage scanning, connecting to peripherals.
*
* @discussion Before you call any methods, the underlying CBCentralManager should be in CBManagerStatePoweredOn state.
*/
@interface RTKLEProfile : NSObject <CBCentralManagerDelegate> {
@protected
CBCentralManager *_centralManager;
}
- (instancetype)initWithDelegate:(nullable id <RTKLEProfileDelegate>)delegate;
// Protected accessors
@property (readonly) CBCentralManager *centralManager;
/**
* The delegate that will receive scaning or connection events.
*/
@property (weak) id <RTKLEProfileDelegate> delegate;
@property (nullable, readonly) NSMutableArray <RTKLEPeripheral*> *managedPeripherals;
/**
* The interested advertising services.
* When in scaning, only peripheral which is advertising specified services is returned. This is template method, which means you should override it in subclass.
*/
+ (nullable NSArray<CBUUID *> *)advertiseServiceUUIDs;
/**
* The class used to create peripheral instance.
* This class should be a subclass of RTKLEPeripheral.
*/
+ (Class)concretePeripheralClass;
// Scan expected peripheral nearby.
// protected
@property (readonly) NSPointerArray *scanedPeripherals;
/**
* Indicates whether is currently scanning.
*/
@property (readonly) BOOL isScaning;
/**
* Scan for interested peripherals.
* @discussion RTKLEProfile only report scaned peripherals which pass some rule. A common rule check if the peripheral is advertising service specified by return value of -advertiseServiceUUIDs method.
*/
- (void)scanForPeripherals;
/**
* Similar to -scanForPeripherals, while will report a scaned peripheral event each time it receive an advertisement.
*/
- (void)scanForPeripheralsWithDuplicateReport;
/**
* Stop scaning.
*/
- (void)stopScan;
/* Deprecated */
/*
- (void)addPeripheral:(RTKLEPeripheral *)peripheral;
- (void)removePeripheral:(RTKLEPeripheral *)peripheral;
- (void)removeAllPeripherals;
- (void)touch:(RTKLEPeripheral *)peripheral;
*/
/**
* Return all known RTKLEPeripheral instances whose underlying CBPeripheral is equal to the peripheral passed in.
*/
- (NSArray <RTKLEPeripheral*> *)peripheralsUsingCBPeripheral:(CBPeripheral *)peripheral;
/**
* Instantiate a RTKLEPeripheral object which have a underlying CBPeripheral equal to the pass in peripheral.
* @discussion The return peripheral object is managed by the RTKLEProfile.
*/
- (nullable RTKLEPeripheral *)instantiatePeripheralWithCBPeripheral:(CBPeripheral *)peripheral;
/**
* Returns a list of the RTK peripherals connected to the system whose services match the profile.
*/
- (NSArray <RTKLEPeripheral*> *)retrieveConnectedPeripherals;
@end
#define RTKDistantInterval 31536000.
@interface RTKLEProfile (Connection)
/**
* Establishes a connection to a peripheral with 10s timeout interval.
*/
- (void)connectTo:(RTKLEPeripheral *)peripheral;
/**
* Establishes a connection to a peripheral.
* When connection estabilished successfully, its delegate -profile:didConnectPeripheral will be invoked. otherwise -profile:didFailToConnectPeripheral is invoked.
*/
- (void)connectTo:(RTKLEPeripheral *)peripheral withTimeout:(NSTimeInterval)timeout;
/**
* Cancels an active or pending local connection to a peripheral.
*/
- (void)cancelConnectionWith:(RTKLEPeripheral *)peripheral;
/**
* Cancels active or pending local connections to all peripheral.
*/
- (void)cancelAllPeripheralConnections;
/* Protected */
- (void)_connectTo:(RTKLEPeripheral *)peripheral withTimeout:(NSTimeInterval)timeout completionHandler:(nullable RTKLECompletionBlock)handler;
- (void)_cancelConnectionWith:(RTKLEPeripheral *)peripheral;
- (void)validatePeripheralAndOpen:(RTKLEPeripheral *)peripheral withCompletion:(RTKLECompletionBlock)handler;
@end
NS_ASSUME_NONNULL_END