1. 插件接入步骤
1.1 项目引入插件
1.1.1 通过cocoapods方式
//在项目Podfile文件中,增加插件及指定版本的引入
pod 'QNSDK', '2.29.0' //此处版本号可根据github中显示的最新版本进行引入
1.1.2 通过carthage方式
//在项目Cartfile文件中,增加插件引入
github "https://github.com/YolandaQingniu/sdk-ios-demo.git"
1.1.3 手动导入方式
1. 将.a文件放置项目中的指定位置
2. 在【TARGETS】-> 【Build Setting】->【Search Paths】->【LibrarySearch Paths】中添加SDK路径
3. 配置链接器 【TARGETS】-> 【Build Setting】-> 【Linking】-> 【Other Linker Flags】中添加 -ObjC、-all_load、-force_load [SDK路径] 其中之一
1.2 配置项目蓝牙权限使用说明
在项目的Info.plist文件中,增加 Privacy - Bluetooth Peripheral Usage Description、Privacy - Bluetooth Always Usage Description 键,进行蓝牙的使用说明
1.3 导入插件API头文件
#import <QNSDK/QNDeviceSDK.h>
1.4 初始插件
//获取项目中授权文件地址
NSString *file = [[NSBundle mainBundle] pathForResource:@"123456789" ofType:@"qn"];
//实例化插件, QNBleApi为单例对象
QNBleApi *bleApi = [QNBleApi sharedBleApi];
//获取插件授权
[bleApi initSdk:@"123456789" firstDataFile:file callback:^(NSError *error) {
if(error) {
//监听异常回调
}
}];
1.5 监听系统蓝牙状态变化(QNBleStateListener)
/*
typedef NS_ENUM(NSUInteger, QNBLEState) {
QNBLEStateUnknown = 0, //未知状态
QNBLEStateResetting = 1, //系统蓝牙正在重置
QNBLEStateUnsupported = 2, //系统不支持蓝牙使用
QNBLEStateUnauthorized = 3, //未授权蓝牙使用
QNBLEStatePoweredOff = 4, //系统蓝牙处于关闭状态
QNBLEStatePoweredOn = 5, //系统蓝牙处于开启状态
};
*/
- (void)onBleSystemState:(QNBLEState)state {
}
bleApi.bleStateListener = self;
1.6 监听扫描状态的变化(QNBleDeviceDiscoveryListener)
//启动扫描时,会回调该函数
- (void)onStartScan {
}
//停止扫描是,会回调该函数
- (void)onStopScan {
}
//当启动扫描,扫描到设备时会回调该函数。此处仅回调所支持的设备
- (void)onDeviceDiscover:(QNBleDevice *)device {
}
bleApi.discoveryListener = self;
1.7 监听设备连接状态变化(QNBleConnectionChangeListener)
//设备正在连接中回调
- (void)onConnecting:(QNBleDevice *)device {
}
//设备连接成功回调
- (void)onConnected:(QNBleDevice *)device {
}
//设备通讯服务已搜索完成,此处一般不涉及逻辑处理
- (void)onServiceSearchComplete:(QNBleDevice *)device {
}
//设备连接失败,会回调失败异常信息
- (void)onConnectError:(QNBleDevice *)device error:(NSError *)error {
}
//设备可以进行交互,即可以下发设备对应的操作指令
- (void)onStartInteracting:(QNBleDevice *)device {
}
//设备正在断开蓝牙连接
- (void)onDisconnecting:(QNBleDevice *)device {
}
//设备已断开
- (void)onDisconnected:(QNBleDevice *)device {
}
1.8 监听设备数据交互(QNUserScaleDataListener)
/* 秤端交互过程状态变化
typedef NS_ENUM(NSInteger, QNScaleState) {
QNScaleStateDisconnected = 0, //未连接
QNScaleStateLinkLoss = -1, //失去连接
QNScaleStateConnected = 1, //已连接
QNScaleStateConnecting = 2, //正在连接
QNScaleStateDisconnecting = 3, //正在断开
QNScaleStateStartMeasure = 4, //正在测量
QNScaleStateRealTime = 5, //正在测量体重
QNScaleStateBodyFat = 7, //正在测量生物阻抗
QNScaleStateMeasureCompleted = 9, //测量完成
}; 仅需关注该类状态
*/
- (void)onScaleStateChange:(QNBleDevice *)device scaleState:(QNScaleState)state {
}
/* 秤端行为状态变化
typedef NS_ENUM(NSInteger, QNScaleEvent) {
QNScaleEventRegistUserSuccess = 4, //注册用户成功
QNScaleEventRegistUserFail = 5, //注册用户失败
QNScaleEventVisitUserSuccess = 6, //访问用户成功
QNScaleEventVisitUserFail = 7, //访问用户失败
QNScaleEventDeleteUserSuccess = 8, //删除用户成功
QNScaleEventDeleteUserFail = 9, //删除用户失败
QNScaleEventSyncUserInfoSuccess = 10, //同步用户信息成功
QNScaleEventSyncUserInfoFail = 11, //同步用户信息失败
QNScaleEventUpdateIdentifyWeightSuccess = 12, //更新用户识别体重成功
QNScaleEventUpdateIdentifyWeightFail = 13, //更新用户识别体重失败
};仅需关注该类状态
*/
- (void)onScaleEventChange:(QNBleDevice *)device scaleEvent:(QNScaleEvent)scaleEvent {
}
//向设备中指定用户坑位反写上一笔有效测量数据hmac(指体脂秤大于0的数据hmac)。该方式有助于用户生物阻抗测量稳定性,若无需加强稳定性可直接返回nil
- (NSString *)getLastDataHmac:(QNBleDevice *)device user:(QNUser *)user {
//从用户测量测量历史数据中,获取最后一条体脂率大于0的测量数据中的hmac。hmac由测量数据产生,见QNScaleData对象
NSString *hmac = lastVailDataHmac;
return hmac;
}
//向秤端注册用户成功,回调秤端分配的用户坑位
- (void)registerUserComplete:(QNBleDevice *)device user:(QNUser *)user {
//注册用户时,秤端分配的坑位。app端应将该坑位、用户id、设备mac进行关联保存。下次该用户连接该设备时需用到该index进行秤端用户访问测量
int index = user.index;
}
/*
设备测量过程实时重量的回调
@param weight 实时体重,单位kg
*/
- (void)onGetUnsteadyWeight:(QNBleDevice *)device weight:(double)weight {
}
/*
设备测量完成测量数据回调
@param scaleData 测量数据
*/
- (void)onGetScaleData:(QNBleDevice *)device data:(QNScaleData *)scaleData {
//测量完成获取完整测量数据
NSDate *measureData = scaleData.measureTime;//测量时间
double weight = scaleData.weight;//测量体重
NSArray <QNScaleItemData *> *allTarget = [scaleData getAllItem];
for (QNScaleItemData *item in allTarget) {
item.type //指标类型,见QNScaleType
item.value //指标数值
}
}
/*
当前访问用户存储数据及未知存储回调
@param storedDataList 存储数据列表,通过QNScaleStoreData对象中的isDataComplete判断是否为未知测量数据,false为未知测量数据,true为已知测量数据
*/
- (void)onGetStoredScale:(QNBleDevice *)device data:(NSArray <QNScaleStoreData *> *)storedDataList {
//对于未知测量数据,可通知相关用户,让用户选择这笔数据是否是自己的
NSMutableArray<QNScaleStoreData *> *unknowStoreDataList = [NSMutableArray array];
for (QNScaleStoreData *storeData in storedDataList) {
if(!storeData.isDataComplete){
[unknowStoreDataList addObject:storeData];
} else {
//已知当前用户的存储数据,该存储数据可直接归属到该用户下
QNScaleData *scaleData = [storeData generateScaleDataWithLastEightHmac: nil];
for (QNScaleItemData *item in allTarget) {
item.type //指标类型,见QNScaleType
item.value //指标数值
}
}
}
}
1.9 扫描周围设备
[bleApi startBleDeviceDiscovery:^(NSError *error) {
}];
1.10 连接设备
//建议先停止扫描
[_bleApi stopBleDeviceDiscorvery:^(NSError *error) { }];
//设置秤端单位
QNConfig *sdkConfig = [QNConfig sharedConfig];
sdkConfig.unit = QNUnitKG;
[sdkConfig save];
QNUserScaleConfig *config = [[QNUserScaleConfig alloc] init];
//已注册的秤端用户列表,在本次连接时,会向秤端删除该数组不包含的秤端用户
NSMutableArray<QNUser *> *deviceUserList = [NSMutableArray array];
config.userlist = deviceUserList;
//本次连接的秤端用户
QNUser *user = [[QNUser alloc] init];
user.height = 170;//用户身高,单位cm
user.gender = @"male";//用户性别,"male" 男性,"female" 女性
user.birthday = [NSDate dateWithTimeIntervalSince1970:631199317];//用户生日
user.index = 1; //用户坑位,该值由向秤端注册用户时,秤端返回,见registerUserComplete回调函数。若本次连接为该设备新用户需要向用户注册,则该属性无需填写
config.curUser = user;
//是否使用访客(即无需向秤端注册用户,秤端不会保存该用户的信息), 注意该字段与user.index中互斥,优先取isVisitor
config.isVisitor = false;
[bleApi connectUserScaleDevice:device config:config callback:^(NSError *error) {
}];
1.11 断开设备连接
//若有需要,可主动调用断开设备连接方法
[bleApi disconnectDevice:nil callback:^(NSError *error) {
}];
1.12 未知存储数据计算
//未知存储数据归属用户的用户信息
QNUser *user = [[QNUser alloc] init];
user.height = 170;//用户身高,单位cm
user.gender = @"male";//用户性别,"male" 男性,"female" 女性
user.birthday = [NSDate dateWithTimeIntervalSince1970:631199317];//用户生日
//hmac为本次未知测量数据中的hmac,即QNScaleStoreData中的hmac
//lastHmac为该用户上一笔体脂率大于0八电极测量数据中的hmac,即QNScaleData中的hmac。若用户无上一笔体脂率大于0八电极测量数据则可传nil
QNScaleData scaleData = [bleApi calculateScaleDataByHmac:user hmac:hmac lastEightHmac:lastHmac callback:^(NSError *error) {
}];
2. API
2.1 QNBleApi
插件实例对象,用于调用插件相关API
2.1.1 sharedBleApi
描述:构建QNBleApi对象单例,为初始化插件的唯一函数
返回值:QNBleApi
2.1.2 getConfig
描述:获取插件配置信息
返回值:
QNConfig
duration:扫描超时时间,默认为0,代表不会出现扫描超时;若设置该指端,在启动扫描指定时间内会自动停止扫描,需自行维护扫描的调用
unit:设置秤端用户单位,但发起设备连接时,会同步单位设置到秤端
- QNUnitKG、QNUnitLB、QNUnitJIN、QNUnitStLb、QNUnitSt
showPowerAlertKey:是否允许系统自动弹框蓝牙权限弹框,需要在initSdk函数前设置
2.1.3 initSdk:firstDataFile:callback:
描述:通过传递配置文件路径的方式初始化插件,调用该函数后,若QNConfig中设置的showPowerAlertKey为true,系统自动弹出询问权限的提示,该提示由系统自动发起
参数:
appId: YKB授权的APPID
dataFile:配置文件在项目中的相对路径
callback:函数调用结果回调
2.1.4 initSdk:dataFileContent:callback:
描述:通过传递配置文件内容的方式初始化插件,调用该函数后,若QNConfig中设置的showPowerAlertKey为true,系统自动弹出询问权限的提示,该提示由系统自动发起
2.1.5 getCurSystemBleState
描述:获取当前系统蓝牙状态
返回值:
- QNBLEState:QNBLEStateUnknown、QNBLEStateResetting、QNBLEStateUnsupported、QNBLEStateUnauthorized、QNBLEStatePoweredOff、QNBLEStatePoweredOn
2.1.6 startBleDeviceDiscovery:
描述:启动扫描周围设备
参数:
- callback:函数调用结果回调
2.1.7 stopBleDeviceDiscorvery:
描述:停止扫描周围设备
参数:
- callback:函数调用结果回调
2.1.8 connectUserScaleDevice:config:callback:
描述:发起指定设备连接
参数:
device:扫描到的设备,取自于QNBleDeviceDiscoveryListener中onDeviceDiscover函数回调的device对象
config:本次连接的配置信息
userlist:秤端已注册用户列表,未在该列表中的用户均会在本次连接的时候向设备删除
curUser:当前连接设备的用户
height:身高,单位cm
gender:性别,男-“male”;女-“female”
birthday:生日
index:秤端用户坑位,当本次连接为向秤端注册用户时,该字段无需赋值。若赋值则走访问设备用户流程
isVisitor:是否使用秤端访客测量,该字段优先级高
callback:函数调用结果回调
2.1.9 disconnectDevice:callback:
描述:断开当前连接的设备
参数:
device:当前连接的设备对象,可不赋值
callback:函数调用结果回调
2.1.10 calculateScaleDataByHmac:hmac:lastEightHmac:callback:
描述:重算测量数据,可用于未知存储数据计算,也可以用于对已知测量数据需要改为其他用户测量的数据重算
参数:
user:该笔测量数据归属的用户信息
height:身高,单位cm
gender:性别,男-“male”;女-“female”
birthday:生日
hmac:本次测量数据的hmac
lastEightHmac:该笔测量数据归属的用户的上一笔体脂率大于0的八电极测量数据,若无则赋nil
callback:函数调用结果
2.2 QNBleStateListener
系统蓝牙状态变化的回调监听
2.2.1 onBleSystemState
描述:当系统蓝牙发生变化时,通过该函数回调
参数:
- state:QNBLEState 状态类型
2.3 QNBleDeviceDiscoveryListener
2.3.1 onStartScan
描述:当启动扫描时回调该函数,如调用startBleDeviceDiscovery函数
2.3.2 onStopScan
描述:当停止扫描时回调该函数,如调用stopBleDeviceDiscorvery函数
2.3.3 onDeviceDiscover
描述:发现周围设备时回调,该函数仅回到YKB的设备
参数:
device:发现的设备
mac:设备mac地址,设备唯一标识
name:设备昵称
modeId:设备类型的标识
bluetoothName:设备蓝牙名
RSSI:设备型号强度
maxUserNum:设备支持最大注册用户数
registeredUserNum:设备已注册的用户数
2.4 QNBleConnectionChangeListener
2.4.1 onConnecting
描述:当设备处理正在连接时回调
参数:
- device:设备对象
2.4.2 onConnected
描述:当设备连接成功后回调
参数:
- device:设备对象
2.4.3 onDisconnecting
描述:当设备正在断开连接时回调
参数:
- device:设备对象
2.4.4 onDisconnected
描述:当设备已断开连接时回调
参数:
- device:设备对象
2.4.5 onConnectError:error:
描述:当设备连接异常时回调
参数:
device:设备对象
error:连接错误信息
2.4.6 onStartInteracting
描述:设备可通讯回调,在该函数之后可调用设备的一些API操作,如更新用户基础体重等
参数:
device:设备对象
error:连接错误信息
2.5 QNUserScaleDataListener
2.5.1 onScaleStateChange:scaleState:
描述:设备状态变化的回调,如连接状态、测量状态等
参数:
device:设备对象
state:设备状态
QNScaleStateDisconnected 未连接
QNScaleStateLinkLoss 失去连接
QNScaleStateConnected 已连接
QNScaleStateConnecting 正在连接
QNScaleStateDisconnecting 正在断开连接
QNScaleStateStartMeasure 正在测量
QNScaleStateRealTime 正在测量体重
QNScaleStateBodyFat 正在测量生物阻抗
QNScaleStateMeasureCompleted 测量完成
2.5.2 onScaleEventChange:scaleEvent:
描述:设备事件回调,如连接状态、测量状态等
参数:
device:设备对象
scaleEvent:设备事件类型
QNScaleEventRegistUserSuccess 注册用户成功
QNScaleEventRegistUserFail 注册用户失败
QNScaleEventVisitUserSuccess 访问用户成功
QNScaleEventVisitUserFail 访问用户失败
QNScaleEventDeleteUserSuccess 删除用户成功
QNScaleEventDeleteUserFail 删除用户失败
QNScaleEventSyncUserInfoSuccess 同步用户信息成功
QNScaleEventSyncUserInfoFail 同步用户信息失败
QNScaleEventUpdateIdentifyWeightSuccess 更新用户识别体重成功
QNScaleEventUpdateIdentifyWeightFail 更新用户识别体重失败
2.5.3 onGetBleVer:bleVer:
描述:设备固件版本信息回调
参数:
device:设备对象
bleVer:固件版本号
2.5.4 onGetUnsteadyWeight:weight:
描述:设备测量实时体重回调
参数:
device:device
weight:当前实时体重,单位kg
2.5.5 onGetScaleData:data:
描述:当前蓝牙连接测量结果的回调
参数:
device:device
scaleData:当前测量数据
2.5.6 onGetStoredScale:data:
描述:设备当前访问用户的已知存储数据和未知测量数据的回调,非当前访问坑位的用户存储数据不会回调
参数:
device:device
storedDataList:存储用户
weight:测量体重,单位kg
measureTime:测量时间
mac:设备mac地址
isDataComplete:是否是已知数据,true为已知,false为未知
hmac:测量数据hmac