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\: 存储用户

返回值:

results matching ""

    No results matching ""