1. 插件接入步骤
1.1 项目引入插件
1.1.1 dependencyResolutionManagement管理
- 在工程的根目录下的setting.gradle添加jitpack支持
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
repositories {
//申明仓库地址
maven { url 'https://jitpack.io' }
//其他仓库配置
...
}
}
- 在App目录下的build.gradle添加依赖
dependencies {
//申明依赖,X.Y.Z需修改成具体的版本号
implementation("com.github.YolandaQingniu:qnscalesdkX:X.Y.Z")
//其他三方依赖
...
}
1.1.2 allprojects管理
在工程的根目录下的 build.gradle添加jitpack支持
allprojects { repositories { //其它仓库配置 maven { url 'https://jitpack.io' } //其他仓库配置 ... } }在App目录下的build.gradle添加依赖
dependencies { //申明依赖,X.Y.Z需修改成具体的版本号 implementation("com.github.YolandaQingniu:qnscalesdkX:X.Y.Z") //其他三方依赖 ... }
1.2 配置项目蓝牙权限使用说明
app的targetSdk>30,且手机的系统版本为安卓12及以上,则需要以下权限
android.permission.BLUETOOTH_ADVERTISE
android.permission.BLUETOOTH_SCAN
android.permission.BLUETOOTH_CONNECT
否则需要以下权限
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.ACCESS_COARSE_LOCATION
android.permission.ACCESS_FINE_LOCATION
1.3 混淆配置
-keep class com.qingniu.scale.model.BleScaleData{*;}
-keep class com.jieli.** {*;}
1.4 初始插件
//获取项目中授权文件地址
String encryptPath = "file:///android_asset/123456789.qn";
//实例化插件, QNBleApi为单例对象
QNBleApi bleApi = QNBleApi.getInstance(this);
//获取插件授权
bleApi.initSdk("123456789", encryptPath, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
}
});
1.5 监听系统蓝牙状态变化(QNBleStateListener)
/*
enum QNBLEState {
Unknown,
setting,
Unsupported,
Unauthiorized,
PoweredOff,
PoweredOn;
*/
bleApi.setBleStateListener(new QNBleStateListener() {
@Override
public void onBleSystemState(QNBLEState qnbleState) {
}
});
1.6 监听扫描状态的变化(QNBleDeviceDiscoveryListener)
bleApi.setBleDeviceDiscoveryListener(new QNBleDeviceDiscoveryListener() {
@Override
public void onDeviceDiscover(QNBleDevice device) {
//当启动扫描,扫描到设备时会回调该函数。此处仅回调所支持的设备
}
@Override
public void onStartScan() {
//启动扫描时,会回调该函数
}
@Override
public void onStopScan() {
//停止扫描时,会回调该函数
}
@Override
public void onScanFail(int code) {
//启动扫描失败回调
}
});
1.7 监听设备连接状态变化(QNBleConnectionChangeListener)
bleApi.setBleConnectionChangeListener(new QNBleConnectionChangeListener() {
@Override
public void onConnecting(QNBleDevice device) {
//设备正在连接时回调
}
//已连接
@Override
public void onConnected(QNBleDevice device) {
//设备已连接时回调
}
@Override
public void onServiceSearchComplete(QNBleDevice device) {
//设备的服务搜索完成
}
@Override
public void onDisconnecting(QNBleDevice device) {
//设备正在断开时回调
}
@Override
public void onDisconnected(QNBleDevice device) {
//设备已断开时回调
}
@Override
public void onConnectError(QNBleDevice device, int errorCode) {
//设备出现了连接错误回调
}
@Override
public void onStartInteracting(QNBleDevice device) {
//设备可以进行交互,即可以下发设备对应的操作指令
}
});
1.8 监听设备数据交互(QNUserScaleDataListener)
bleApi.setDataListener(new QNUserScaleDataListener() {
//向秤端注册用户成功,回调秤端分配的用户坑位
@Override
public void registerUserComplete(QNBleDevice device, QNUser user) {
//注册用户时,秤端分配的坑位。app端应将该坑位、用户id、设备mac进行关联保存。下次该用户连接该设备时需用到该index进行秤端用户访问测量
int index = user.index;
}
//设备测量过程实时重量的回调, weight实时体重,单位kg
@Override
public void onGetUnsteadyWeight(QNBleDevice device, double weight) {
}
//设备测量完成测量数据回调, data 测量数据
@Override
public void onGetScaleData(QNBleDevice device, QNScaleData data) {
Date measureDate = data.getMeasureTime();
double weight = data.getWeight();//测量体重
List<QNScaleItemData> allTarget = data.getAllItem();
for (QNScaleItemData item: allTarget) {
item.getType() //指标类型,见QNScaleType
item.getValue() //指标数值
}
}
// 当前访问用户存储数据及未知存储回调,storedDataList 存储数据列表,通过QNScaleStoreData对象中的isDataComplete判断是否为未知测量数据,false为未知测量数据,true为已知测量数据
@Override
public void onGetStoredScale(QNBleDevice device, List<QNScaleStoreData> storedDataList) {
//对于未知测量数据,可通知相关用户,让用户选择这笔数据是否是自己的
ArrayList<QNScaleStoreData> unknowStoreDataList = new ArrayList<>();
for (QNScaleStoreData storeData : storedDataList) {
if(!storeData.isDataComplete()){
unknowStoreDataList.add(storeData);
} else {
//已知当前用户的存储数据,该存储数据可直接归属到该用户下
QNScaleData scaleData = storeData.generateScaleData();
for (QNScaleItemData item: scaleData.getAllItem()) {
item.type //指标类型,见QNScaleType
item.value //指标数值
}
}
}
}
//测量过程中的连接状态
@Override
public void onScaleStateChange(QNBleDevice device, int status) {
}
@Override
public void onScaleEventChange(QNBleDevice device, int scaleEvent) {
}
//向设备中指定用户坑位反写上一笔有效测量数据hmac(指体脂秤大于0的数据hmac)。该方式有助于用户生物阻抗测量稳定性,若无需加强稳定性可直接返回nil
@Override
public String getLastDataHmac(QNBleDevice qnBleDevice, QNUser qnUser) {
//从用户测量测量历史数据中,获取最后一条体脂率大于0的测量数据中的hmac。hmac由测量数据产生,见QNScaleData对象
String hmac = lastVailDataHmac;
return hmac;
}
});
1.9 扫描周围设备
bleApi.startBleDeviceDiscovery(new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
}
});
1.10 连接设备
//建议先停止扫描
bleApi.stopBleDeviceDiscovery(new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
}
});
//设置秤端单位
QNConfig sdkConfig = bleApi.getConfig()
sdkConfig.unit = 0; //0-kg,1-lb,2-斤,3-st:lb,4-st,
sdkConfig.save();
QNUserScaleConfig config = new QNUserScaleConfig();
//已注册的秤端用户列表,在本次连接时,会向秤端删除该数组不包含的秤端用户
ArrayList<QNUser> deviceUserList = new ArrayList<>();
config.setUserlist(deviceUserList);
//本次连接的秤端用户 mQNBleApi.buildUser(mUser.getUserId(),
String userId = "";
int height = 170;//用户身高,单位cm
String gender = "male"; //用户性别,"male" 男性,"female" 女性
Date birthday = new Date(631199317000L);//用户生日
int index = 1; //用户坑位,该值由向秤端注册用户时,秤端返回,见registerUserComplete回调函数。若本次连接为该设备新用户需要向用户注册,则该属性无需填写
QNUser user = bleApi.buildUser(userId, height, gender, birthday, 0, UserShape.SHAPE_NONE, UserGoal.GOAL_NONE, 0, index, 0,
new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
}
});;
config.setCurUser(user);
//是否使用访客(即无需向秤端注册用户,秤端不会保存该用户的信息), 注意该字段与user.index中互斥,优先取isVisitor
config.setVisitor(false)
bleApi.connectUserScaleDevice(device, config, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
}
});
1.11 断开设备连接
//若有需要,可主动调用断开设备连接方法
bleApi.disconnectDevice(bleApi, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
}
});
1.12 未知存储数据计算
//未知存储数据归属用户的用户信息
String userId = "";
int height = 170;//用户身高,单位cm
String gender = "male"; //用户性别,"male" 男性,"female" 女性
Date birthday = new Date(631199317000L);//用户生日
QNUser user = mQNBleApi.buildUser(userId, height, gender, birthday, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
}
});
//hmac为本次未知测量数据中的hmac,即QNScaleStoreData中的hmac
//lastHmac为该用户上一笔体脂率大于0八电极测量数据中的hmac,即QNScaleData中的hmac。若用户无上一笔体脂率大于0八电极测量数据则可传nil
QNScaleData scaleData = mQNBleApi.calculateScaleDataByHmac(user, hmac,lastHmac);
2. API
2.1 QNBleApi
插件实例对象,用于调用插件相关API
2.1.1 getInstance
描述:构建QNBleApi对象,为初始化插件的唯一函数
返回值:QNBleApi
2.1.2 getConfig
描述:获取插件配置信息
返回值:
QNConfig
duration:扫描超时时间,默认为0,代表不会出现扫描超时;若设置该指端,在启动扫描指定时间内会自动停止扫描,需自行维护扫描的调用
unit:设置秤端用户单位,但发起设备连接时,会同步单位设置到秤端
- 详情可查看类QNUnit
2.1.3 initSdk
描述:通过传递配置文件路径的方式初始化插件,调
参数:
appId:String: YKB授权的APPID
dataFile:String: 配置文件在项目中的相对路径
callback:QNResultCallback: 函数调用结果回调
返回值:
无
2.1.4 getCurSystemBleState
描述:获取当前系统蓝牙状态
返回值:
- int:QNBLEState.Unknown.ordinal()、QNBLEState.setting.ordinal()、QNBLEState.Unsupported.ordinal()、QNBLEState.Unauthorized.ordinal()、QNBLEState.PoweredOff.ordinal()、QNBLEState.PoweredOn.ordinal()
2.1.5 startBleDeviceDiscovery:
描述:启动扫描周围设备
参数:
- callback:QNResultCallback: 函数调用结果回调
返回值:
无
2.1.6 stopBleDeviceDiscorvery:
描述:停止扫描周围设备
参数:
- callback:QNResultCallback: 函数调用结果回调
返回值:
无
2.1.7 connectUserScaleDevice
描述:发起指定设备连接
参数:
device:QNBleDevice: 扫描到的设备,取自于QNBleDeviceDiscoveryListener中onDeviceDiscover函数回调的device对象
config:QNUserScaleConfig: 本次连接的配置信息
callback:函数调用结果回调
返回值:
无
2.1.8 disconnectDevice:
描述:断开当前连接的设备
参数:
device:QNBleDevice: 当前连接的设备对象,可不赋值
callback:QNResultCallback: 函数调用结果回调
返回值:
无
2.1.9 calculateScaleDataByHmac
描述:重算测量数据,可用于未知存储数据计算,也可以用于对已知测量数据需要改为其他用户测量的数据重算
参数:
user:QNUser: 该笔测量数据归属的用户信息
hmac:String: 本次测量数据的hmac
lastEightHmac:String: 该笔测量数据归属的用户的上一笔体脂率大于0的八电极测量数据,若无则赋nil
返回值:
QNScaleData
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:QNBleDevice: 发现的设备
返回值:
无
2.4 QNBleConnectionChangeListener
2.4.1 onConnecting
描述:当设备处理正在连接时回调
参数:
- device:QNBleDevice: 设备对象
返回值:
无
2.4.2 onConnected
描述:当设备连接成功后回调
参数:
- device:QNBleDevice: 设备对象
返回值:
无
2.4.3 onDisconnecting
描述:当设备正在断开连接时回调
参数:
- device:QNBleDevice: 设备对象
返回值:
无
2.4.4 onDisconnected
描述:当设备已断开连接时回调
参数:
- device:QNBleDevice: 设备对象
返回值:
无
2.4.5 onConnectError:error:
描述:当设备连接异常时回调
参数:
device:QNBleDevice: 设备对象
error:int: 连接错误信息
返回值:
无
2.4.6 onStartInteracting
描述:设备可通讯回调,在该函数之后可调用设备的一些API操作,如更新用户基础体重等
参数:
- device:QNBleDevice: 设备对象
返回值:
无
2.5 QNUserScaleDataListener
2.5.1 onScaleStateChange
描述:设备状态变化的回调,如连接状态、测量状态等
参数:
device:QNBleDevice: 设备对象
state:int: 设备状态,详情可查看类QNScaleStatus中的定义
返回值:
无
2.5.2 onScaleEventChange
描述:设备事件回调,如连接状态、测量状态等
参数:
device:QNBleDevice: 设备对象
scaleEvent:int: 设备事件类型,详情可查看类QNScaleEvent中的定义
返回值:
无
2.5.3 onGetBleVer
描述:设备固件版本信息回调
参数:
device:QNBleDevice: 设备对象
bleVer:int: 固件版本号
返回值:
无
2.5.4 onGetUnsteadyWeight
描述:设备测量实时体重回调
参数:
device:QNBleDevice: 设备对象
weight:double: 当前实时体重,单位kg
返回值:
无
2.5.5 onGetScaleData
描述:当前蓝牙连接测量结果的回调
参数:
device:QNBleDevice: 设备对象
scaleData:QNScaleData: 当前测量数据
返回值:
无
2.5.6 onGetStoredScale
描述:设备当前访问用户的已知存储数据和未知测量数据的回调,非当前访问坑位的用户存储数据不会回调
参数:
device:QNBleDevice: 设备对象
storedDataList:List\
: 存储用户
返回值:
无