# Leftfat
**Repository Path**: codeceo_net/leftfat
## Basic Information
- **Project Name**: Leftfat
- **Description**: 乐福体脂秤
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-01-19
- **Last Updated**: 2024-03-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[English Docs](README_EN.md) | [中文文档](README.md)
相关文档
[乐福开放平台](https://uniquehealth.lefuenergy.com/unique-open-web/#/document) | [PPBluetoothKit iOS SDK](https://uniquehealth.lefuenergy.com/unique-open-web/#/document?url=https://lefuhengqi.apifox.cn/doc-2625647) | [PPBluetoothKit 微信小程序插件](https://uniquehealth.lefuenergy.com/unique-open-web/#/document?url=https://lefuhengqi.apifox.cn/doc-2625745)
[Android示例程序地址](https://gitee.com/shenzhen-lfscale/bluetooth-kit-android-demo.git)
# PPBluetoothKit Android SDK
PPBluetoothKit是针对人体秤和食物秤进行封装的SDK,包含蓝牙连接逻辑、数据解析逻辑、体脂计算。
### 示例程序
为了让客户快速实现称重以及对应的功能而实现,提供了一个示例程序,示例程序中包含体脂计算模块和设备功能模块。
- 设备功能模块目前支持的设备包含:蓝牙秤、食物秤、Torre系列蓝牙WiFi体脂秤。
- 体脂计算模块支持4电极交流算法、4电极直流算法、8电极交流算法。
### 提醒
**在使用您自己的App时请务必替换AppKey、AppSecret和config文件,否则将可能导致您的设备无法在您的App上使用**
### 商用版本程序
- 可在各个应用市场搜索下载 "Unique Health"
## Ⅰ. 集成方式
### 1.1 申请AppKey、AppSecret和config文件
- 先到[乐福开放平台](https://uniquehealth.lefuenergy.com/unique-open-web/#/document)申请AppKey、AppSecret和config文件
- 将config文件放到项目的assets目录下
```mermaid
graph TD
A[进入开放平台] --> B[注册/登录] -- 个人信息入口--> C[获取AppKey和AppSecret] --> D[联系商务授权] -- 授权成功 --> F[下载config文件] --> G[将config文件复制到项目的assets目录下] --> H[拿到AppKey/AppSecret和config文件] -- PPBlutoothKit.initSdk --> I[(初始化SDK)]
```
### 1.2 SDK初始化
```
//使用时请务必替换成你自己的AppKey/AppSecret,需要增加设备配置请联系我司销售顾问
val appKey = ""
val appSecret = ""
/*********************以下内容为SDK的配置项***************************************/
//SDK日志打印控制,true会打印
PPBlutoothKit.setDebug(BuildConfig.DEBUG)
/**
* SDK 初始化 所需参数需要自行到开放平台自行申请,请勿直接使用Demo中的参数,
* @param appKey App的标识
* @param appSecret Appp的密钥
* @param configPath 在开放平台下载相应的配置文件以.config结尾,并放到assets目录下,将config文件全名传给SDK
*/
PPBlutoothKit.initSdk(this, appKey, appSecret, "lefu.config")
```
### 1.3 aar文件导入
- 在需要引入sdk的module下的build.gradle中加入(最新版本请查看ppscalelib的module下的libs)
```
dependencies {
//aar引入
api(name: 'ppblutoothkit-3.2.5-20231129.115853-1', ext: 'aar')
}
```
### 1.4 集成常见问题
- 如果遇到集成后提示“AndroidManifest.xml”相关的报错,请尝试着在主module中加入以下代码解决:
```
android {
packagingOptions {
exclude 'AndroidManifest.xml'
}
}
```
- 如果遇到“.so”类型的文件错误,请尝试清除缓存,并将集成sdk的方式改为api
- 如遇到其他集成的问题请咨询:yanfabu-5@lefu.cc 或联系我们的销售顾问
- 如你有好的建议或优秀的代码你可以在Gitee上提交你的请求,我们会非常感谢你
## Ⅱ .使用说明
### 1.1 蓝牙权限相关
#### 1.1.1 运行环境
由于需要蓝牙连接,Demo需要真机运行,Android手机6.0及以上或HarmonyOS2.0及以上
#### 1.1.2 蓝牙权限相关约定
使用Demo过程中需要您打开蓝牙,打开定位开关,需确保开启和授权必要的权限: 精准定位权限和附近的设备权限 可以查看官方蓝牙权限文档,文档地址:[Google开发者网站关于Bluetooth permissions说明](https://developer.android.com/guide/topics/connectivity/bluetooth/permissions).
- 精准定位权限
- 附近设备权限
- 定位开关
- 蓝牙开关
```
...
```
### 1.2 测量身体数据相关约定
#### 1.2.1 称重测脂注意事项
- 秤支持测脂
- 光脚上称,并接触对应的电极片
- 称重接口返回体重(kg)和阻抗信息
- 人体参数身高、年龄输入正确
#### 1.2.2 体脂计算
##### 基础参数约定
| 类别 | 输入范围 | 单位 |
|:----|:--------|:--:|
| 身高 | 100-220 | cm |
| 年龄 | 10-99 | 岁 |
| 性别 | 0/1 | 女/男 |
| 体重 | 10-200 | kg |
- 需要身高、年龄、性别和对应的阻抗,调用对应的计算库去获得
- 8电极所涉及的体脂数据项需要8电极的秤才可使用
## Ⅲ. 计算体脂 - Caclulate - CalculateManagerActivity
### 1.1 体脂计算所需参数说明
根据蓝牙协议解析出的体重、阻抗,加上用户数据的身高、年龄、性别,计算出体脂率等多项体脂参数信息。
#### 1.1.1 PPBodyBaseModel
| 参数 | 注释| 说明 |
| :-------- | :----- | :----: |
| weight | 体重 | 实际体重*100取整|
| impedance|四电极算法阻抗 |四电极算法字段|
| zTwoLegsDeCode|四电极脚对脚明文阻抗值 |四电极算法字段|
| userModel|用户基础信息对象 |PPUserModel|
| deviceModel-deviceCalcuteType| 对应设备的计算方式 |后面具体说明|
| isHeartRating| 是否正在测量心率 |4&8共有字段|
| unit| 秤端的当前单位 |实时单位|
| heartRate| 心率 |秤端支持心率生效|
| isPlus| 是否是正数 |食物秤生效|
| memberId| 成员Id |秤端支持用户时生效|
| z100KhzLeftArmEnCode| 100KHz左手阻抗加密值 |八电极字段|
| z100KhzLeftLegEnCode| 100KHz左腳阻抗加密值 |八电极字段|
| z100KhzRightArmEnCode| 100KHz右手阻抗加密值 |八电极字段|
| z100KhzRightLegEnCode| 100KHz右腳阻抗加密值 |八电极字段|
| z100KhzTrunkEnCode| 100KHz軀幹阻抗加密值 |八电极字段|
| z20KhzLeftArmEnCode| 20KHz左手阻抗加密值 |八电极字段|
| z20KhzLeftLegEnCode| 20KHz左腳阻抗加密值 |八电极字段|
| z20KhzRightArmEnCode|20KHz右手阻抗加密值 |八电极字段|
| z20KhzRightLegEnCode| 20KHz右腳阻抗加密值 |八电极字段|
| z20KhzTrunkEnCode| 20KHz軀幹阻抗加密值 |八电极字段|
| z100KhzLeftArmDeCode| 100KHz左手阻抗解密值 |八电极字段|
| z100KhzLeftLegDeCode| 100KHz左腳阻抗解密值 |八电极字段|
| z100KhzRightArmDeCode| 100KHz右手阻抗解密值 |八电极字段|
| z100KhzRightLegDeCode| 100KHz右腳阻抗解密值 |八电极字段|
| z100KhzRightArmDeCode| 100KHz左手阻抗解密值 |八电极字段|
| z100KhzTrunkDeCode| 100KHz軀幹阻抗解密值 |八电极字段|
| z20KhzLeftArmDeCode| 20KHz左手阻抗解密值 |八电极字段|
| z20KhzLeftLegDeCode| 20KHz左腳阻抗解密值 |八电极字段|
| z20KhzRightArmDeCode| 20KHz右手阻抗解密值 |八电极字段|
| z20KhzRightLegDeCode| 20KHz右腳阻抗解密值 |八电极字段|
| z20KhzTrunkDeCode| 20KHz軀幹阻抗解密值 |八电极字段|
#### 1.1.2 计算类型说明 PPDeviceModel - deviceCalcuteType
| PPDeviceCalcuteType | 注释| 使用范围 |
| :-------- | :----- | :----: |
| PPDeviceCalcuteTypeInScale | 秤端计算 | 秤端计算的秤|
| PPDeviceCalcuteTypeDirect| 直流 | 四电极直流体脂秤|
| PPDeviceCalcuteTypeAlternate| 四电极交流 | 四电极体脂秤|
| PPDeviceCalcuteTypeAlternate8| 8电极交流算法 | 八电极体脂秤|
| PPDeviceCalcuteTypeNormal| 默认计算方式 | 4电极交流 |
| PPDeviceCalcuteTypeNeedNot| 不需要计算 | 食物秤或人体秤|
| PPDeviceCalcuteTypeAlternate8_0| 8电极算法 |八电极体脂秤|
#### 1.1.3 用户基础信息说明 PPUserModel
| 参数 | 注释| 说明 |
| :-------- | :----- | :----: |
| userHeight| 身高|所有体脂秤|
| age| 年龄 |所有体脂秤|
| sex| 性别 |所有体脂秤|
### 1.2 八电极体脂计算 - Calculate8Activitiy
**八电极计算体脂示例:**
```
//八电极计算类型
val userModel = PPUserModel.Builder()
.setSex(PPUserGender.PPUserGenderFemale) //gender
.setHeight(168)//height 100-220
.setAge(35)//age 10-99
.build()
val weight = 83.00
val deviceModel = PPDeviceModel("", "CF577")//更换成你自己的设备蓝牙名称
var calcuteType: PPScaleDefine.PPDeviceCalcuteType? = PPScaleDefine.PPDeviceCalcuteType.PPDeviceCalcuteTypeAlternate8//CF577系列
if (position == 0) {
calcuteType = PPScaleDefine.PPDeviceCalcuteType.PPDeviceCalcuteTypeAlternate8//8电极算法, bhProduct=1--CF577
} else if (position == 1) {
calcuteType = PPScaleDefine.PPDeviceCalcuteType.PPDeviceCalcuteTypeAlternate8_1//8电极算法,bhProduct =3--CF586
} else if (position == 2) {
calcuteType = PPScaleDefine.PPDeviceCalcuteType.PPDeviceCalcuteTypeAlternate8_0//8电极算法,bhProduct =4--CF597
}
deviceModel.deviceCalcuteType = calcuteType
val bodyBaseModel = PPBodyBaseModel()
bodyBaseModel.weight = ((weight + 0.005) * 100).toInt()
bodyBaseModel.deviceModel = deviceModel
bodyBaseModel.userModel = userModel
bodyBaseModel.z100KhzLeftArmEnCode = 294794323L
bodyBaseModel.z100KhzLeftLegEnCode = 806102147L
bodyBaseModel.z100KhzRightArmEnCode = 26360525L
bodyBaseModel.z100KhzRightLegEnCode = 816581534L
bodyBaseModel.z100KhzTrunkEnCode = 1080247226L
bodyBaseModel.z20KhzLeftArmEnCode = 27983001L
bodyBaseModel.z20KhzLeftLegEnCode = 837194050L
bodyBaseModel.z20KhzRightArmEnCode = 1634195706L
bodyBaseModel.z20KhzRightLegEnCode = 29868463L
bodyBaseModel.z20KhzTrunkEnCode = 1881406429L
val fatModel = PPBodyFatModel(bodyBaseModel)
Log.d("liyp_", fatModel.toString())
```
### 1.3 四电极直流体脂计算 - Calculate4DCActivitiy
**四电极直流计算体脂示例:**
```
val userModel = PPUserModel.Builder()
.setSex(sex) //gender
.setHeight(height)//height 100-220
.setAge(age)//age 10-99
.build()
val deviceModel = PPDeviceModel("", DeviceManager.FL_SCALE)//更换成你自己的设备蓝牙名称
deviceModel.deviceCalcuteType = PPScaleDefine.PPDeviceCalcuteType.PPDeviceCalcuteTypeDirect
val bodyBaseModel = PPBodyBaseModel()
bodyBaseModel.weight = UnitUtil.getWeight(weight)
bodyBaseModel.impedance = impedance
bodyBaseModel.deviceModel = deviceModel
bodyBaseModel.userModel = userModel
bodyBaseModel.unit = PPUnitType.Unit_KG
val ppBodyFatModel = PPBodyFatModel(bodyBaseModel)
Log.d("liyp_", ppBodyFatModel.toString())
```
### 1.4 四电极交流体脂计算 - Calculate4ACActivitiy
**四电极交流计算体脂示例:**
```
val userModel = PPUserModel.Builder()
.setSex(sex) //gender
.setHeight(height)//height 100-220
.setAge(age)//age 10-99
.build()
val deviceModel = PPDeviceModel("", DeviceManager.CF568)///更换成你自己的设备蓝牙名称
deviceModel.deviceCalcuteType = PPScaleDefine.PPDeviceCalcuteType.PPDeviceCalcuteTypeAlternate
val bodyBaseModel = PPBodyBaseModel()
bodyBaseModel.weight = UnitUtil.getWeight(weight)
bodyBaseModel.impedance = impedance
bodyBaseModel.deviceModel = deviceModel
bodyBaseModel.userModel = userModel
bodyBaseModel.unit = PPUnitType.Unit_KG
val ppBodyFatModel = PPBodyFatModel(bodyBaseModel)
Log.d("liyp_", ppBodyFatModel.toString())
```
## Ⅳ. 设备扫描 - Device-ScanDeviceListActivity
### 1.1 设备分类定义- PPDevicePeripheralType
扫描设备会返回PPDeviceModel对象,通过设备的方法:deviceModel.getDevicePeripheralType(),获取设备分类,根据PPDevicePeripheralType区分自己的设备,对应设备功能示例的Activity。
| 分类枚举 | 使用示例类 | 连接方式 | 设备类型 | 协议类型 |
|------|--------|--------|--------|-----|
| PeripheralApple | PeripheralAppleActivity | 连接 | 人体秤 | 2.x |
| PeripheralBanana | PeripheralBananaActivity | 广播 | 人体秤 | 2.x |
| PeripheralCoconut | PeripheralCoconutActivity | 连接 | 人体秤 | 3.x |
| PeripheralDurian | PeripheralDutianActivity | 设备端计算的连接 | 人体秤 | 2.x |
| PeripheralEgg | PeripheralEggActivity | 连接 | 厨房秤 | 2.x |
| PeripheralFish | PeripheralFishActivity | 连接 | 厨房秤 | 3.x |
| PeripheralGrapes | PeripheralGrapesActivity | 广播 | 厨房秤 | 2.x |
| PeripheralHamburger | PeripheralHamburgerActivity | 广播 | 厨房秤 | 3.x |
| PeripheralTorre | PeripheralTorreActivity | 连接 | 人体秤 | Torre |
| PeripheralIce | PeripheralIceActivity | 连接 | 人体秤 | 4.x |
| PeripheralJambul | PeripheralJambulActivity | 广播 | 人体秤 | 3.x |
### 1.2 扫描周围支持的设备-ScanDeviceListActivity
**注意:**
- 如果你在多个页面之间需要启动扫描,建议把扫描逻辑,放到工具类中,并用单例进行包裹
- 如果有连续页面需要调用扫描时,请一定要确保上个页面的蓝牙已停止扫描后,再在第二个页面进行扫描,建议是第二个页面延迟1000ms再启动。
- 如果你需要一直扫描蓝牙,你要在monitorBluetoothWorkState方法中ppBleWorkState返回PPBleWorkState.PPBleWorkSearchTimeOut时重启扫描,以确保循环扫描
```mermaid
graph TD
A[检测蓝牙相关权限] --有权限--> B[检测定位开关和蓝牙开关]
A[检测蓝牙相关权限] --没有权限--> X[申请权限]
X[申请权限] --申请到权限 --> B[检测定位开关和蓝牙开关]
B[检测定位开关和蓝牙开关] --开关均打开--> C[启动蓝牙扫描]
B[检测定位开关和蓝牙开关] --开关未打开--> Y[引导用户打开相应开关] --开关打开--> C[启动蓝牙扫描]
C[启动蓝牙扫描
PPSearchManager.startSearchDeviceList] --> D[扫描到设备
onSearchDevice] -->E[获取设备分类
deviceModel.getDevicePeripheralType] -->F[根据不同的分类处理不同的业务逻辑]
C[启动蓝牙扫描]-->G[蓝牙状态监听
PPBleStateInterface]
G[蓝牙状态监听
PPBleStateInterface]-->G1[主动取消扫描
PPBleStateSearchCanceled]
G[蓝牙状态监听
PPBleStateInterface]-->G2[扫描超时
PPBleWorkSearchTimeOut]
G[蓝牙状态监听
PPBleStateInterface]-->G3[系统蓝牙关闭
PPBleSwitchStateOff]
G[蓝牙状态监听
PPBleStateInterface]-->G4[系统蓝牙打开
PPBleSwitchStateOn]
G2[扫描超时
PPBleWorkSearchTimeOut]--循环扫描-->C[启动蓝牙扫描
PPSearchManager.startSearchDeviceList]
G4[系统蓝牙打开
PPBleSwitchStateOn]--循环扫描-->C[启动蓝牙扫描
PPSearchManager.startSearchDeviceList]
F[根据不同的分类处理不同的业务逻辑]-->H[停止蓝牙扫描
stopSearch]
```
#### 1.2.1 启动扫描 - startSearchDeviceList
```
/** * Get around bluetooth scale devices */
public void startScanDeviceList() { if (ppScale == null) { ppScale = new PPSearchManager();
}
//You can dynamically set the scan time in ms
ppScale.startSearchDeviceList(300000, searchDeviceInfoInterface,bleStateInterface);
}
```
**处理扫描结果-PPSearchDeviceInfoInterface**
```
/**
* @param ppDeviceModel 设备对象
* @param data 广播数据
*/
public void onSearchDevice(PPDeviceModel ppDeviceModel, String data) {}
```
#### 1.2.2 蓝牙相关状态监听-PPBleStateInterface
```
/**
* 蓝牙扫描和连接状态回调
* @param ppBleWorkState 蓝牙状态标识
* @param deviceModel 设备对象
*/
@Override
public void monitorBluetoothWorkState(PPBleWorkState ppBleWorkState, PPDeviceModel deviceModel) {
}
/**
* 系统蓝牙状态回调
* @param ppBleSwitchState 系统蓝牙状态标识
*/
@Override
public void monitorBluetoothSwitchState(PPBleSwitchState ppBleSwitchState) {
}
```
#### 1.2.3 蓝牙状态PPBleWorkState
| 分类枚举 | 说明 | 备注 |
|------|--------|--------|
| PPBleWorkStateSearching | 扫描中 |
| PPBleWorkSearchTimeOut| 扫描超时 | 如有需要可重启扫描 |
| PPBleWorkSearchFail | 扫描失败| 如有需要可重启扫描 |
| PPBleStateSearchCanceled| 停止扫描|主动调用停止扫描 |
| PPBleWorkStateConnecting| 设备连接中 | |
| PPBleWorkStateConnected | 设备已连接 | 连接上后,建议在PPBleWorkStateWritable中下发数据 |
| PPBleWorkStateConnectFailed| 连接失败 | |
| PPBleWorkStateDisconnected| 设备已断开 | |
| PPBleWorkStateWritable | 可写 | 连接后如有需要给设备发送信息,可在此依次发送 |
#### 1.2.4 停止扫描
```
ppScale.stopSearch();
```
#### 1.2.5 重启扫描
重启扫描建议延迟1-2s再启动,防止触发Android系统的频繁扫描
```
public void delayScan() {
new Handler(getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
if (isOnResume) {
startScanDeviceList();
}
}
}, 1000);
}
```
## Ⅴ. 功能说明
### 2.1 PeripheralApple -PeripheralAppleActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralApple,2.x /连接 /人体秤
- 需要自行判断是否支持历史,然后再处理历史相关功能
- 需要自行判断是否支持Wifi,然后再处理Wifi相关功能
- Wifi秤需要自行读取当前手机所连接Wifi的ssid,且只支持2.4G或2.4G&5G双模Wifi,不支持单5GWiFi
- Wifi秤配网前需要先配置域名,成功后再下发ssid和pwd
- Wifi秤上传到后台的Wifi历史数据需要Server具备相应的接口能力可咨询Server开发人员
| 功能| 方法名 | 参数 | 返回数据类型 | 备注 |
|------|--------|--------|--------|--------|
|蓝牙连接| startConnect|PPDeviceModel|PPBleStateInterface| 蓝牙相关状态|
|断开连接(非Wifi秤)| disConnect||PPBleStateInterface| 蓝牙相关状态|
|断开连接(Wifi秤)| disWifi||PPBleSendResultCallBack| 需要下发断开连接指令,下发成功后,再调用disConnect主动断开|
|同步时间| syncTime||PPBleSendResultCallBack-onResult(PPScaleSendState sendState)|发送状态回调|
|读取设备信息| readDeviceInfo||PPDeviceInfoInterface-readDeviceInfoComplete|设备信息回调,部分秤支持(包括modelNumber、softwareVersion、serialNumber)|
|同步单位| syncUnit |PPUnitType,PPUserModel|PPBleSendResultCallBack|发送状态回调|
|注册数据变化监听| registDataChangeListener |PPDataChangeListener|monitorProcessData 过程数据
monitorLockData锁定数据
monitorOverWeight超重 |
|读取蓝牙历史| getHistoryData||PPHistoryDataInterface|monitorHistoryData历史数据回调
monitorHistoryEnd历史数据结束
monitorHistoryFail历史数据失败|
|删除蓝牙历史| deleteHistoryData ||PPBleSendResultCallBack|发送状态回调|
|是否支持历史| PPScaleHelper-
isSupportHistoryData |deviceFuncType|Boolean|true支持 false不支持|
|是否支持Wifi| PPScaleHelper-
isFuncTypeWifi |deviceFuncType|Boolean|true支持 false不支持|
|配置域名| sendModifyServerDomain |domain: String|PPConfigWifiInfoInterface|monitorModifyServerDomainSuccess修改Domain成功回调|
|配网| configWifiData |ssid: String, password: String?|PPConfigWifiInfoInterface|monitorConfigSn(sn:String)
sn不为空代表配网成功
monitorConfigFail()配网失败|
|读取设备的Wifi-SSID| getWiFiParmameters ||PPConfigWifiInfoInterface|monitorConfigSsid(ssid:String?)|
#### 2.1.1 称重逻辑
```mermaid
graph TD
A[发起连接设备
startConnect]-->B[监听蓝牙连接状态
PPBleStateInterface]
B-->B1[monitorBluetoothWorkState
蓝牙扫描和连接状态监听
PPBleWorkStateConnected连接成功
PPBleWorkStateConnectFailed连接失败
PPBleWorkStateDisconnected断开连接
PPBleWorkStateWritable可写]
B1-->C2[当前可写
PPBleWorkStateWritable] --> D[切换单位
syncUnit]
D[切换单位
syncUnit]--监听蓝牙写入回调
PPBleSendResultCallBack-->D1[同步时间
syncTime]
A-->F[设备数据变化监听
PPDataChangeListener]
F[设备数据变化监听
PPDataChangeListener]-->G1[过程数据
monitorProcessData]
F[设备数据变化监听
PPDataChangeListener]-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I2[判断心率状态]
I2[判断心率状态]-->J1[正在测量心率]-->K1[展示心率测量中UI]
I2[判断心率状态]-->J2[心率测量完成]-->K2[匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->L[调用计算库计算体脂
四电极交流示例:Calculate4ACActivitiy
四电极直流示例:Calculate4DCActivitiy]
```
#### 2.1.2 完整的读取蓝牙历史数据
**前提:蓝牙已连接**
```mermaid
graph TD
A[读取历史数据
getHistoryData]-->A1[历史数据监听]-->B1[历史数据回调
monitorHistoryData]
B1[历史数据回调
monitorHistoryData]-->C[使用List存历史数据]
A1-->B2[历史数据结束回调
monitorHistoryEnd]
B2-->D[拿到list的历史数据]-->E[匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->F[调用计算库计算体脂
示例:Calculate4ACActivitiy]
B2-->G[删除历史数据
deleteHistoryData]
A1-->B3[历史数据失败回调
monitorHistoryFail]
```
#### 2.1.3 完整的Wifi配网流程
**前提:蓝牙已连接**
注意:
1. 确保Server正常,路由器能正常连接到Server
2. 确保WiFi环境是2.4G或2.4/5G混合模式,不支持单5G模式
3. 确保账号密码正确
4. 确保秤端使用的Server地址与App使用的Server地址对应
**注意**
注意:域名在您自己的App中需要换成你App自己的服务器域名,并确保服务器已完成Wifi体脂秤相关功能开发,
文档地址:https://uniquehealth.lefuenergy.com/unique-open-web/#/document
找到"乐福体脂秤自建服务器接入方案"-> PeripheralApple 对应"V2.0协议设备"
```mermaid
graph TD
A[获取当前手机Wifi]-->A1[检测当前Wifi是否支持2.4G]-->B1[不支持]-->B3[提示引导用户切换Wifi]-->B4[切换WIfi成功后]-->B2
A1-->B2[支持]
B2-->C[让用户输入该Wifi的密码]-->D[开始配网]-->E[配置域名
sendModifyServerDomain]
E-->E1[配网接口监听
PPConfigWifiInfoInterface]-->F[收到域名配成功
monitorModifyServerDomainSuccess]
F-->G[开始下发SSID和PWD]-->H1[配网接口收到SN标识成功
monitorConfigSn]-->I1[配网成功]-->J1[返回配网前页面并展示配网的SSID]
G[开始下发SSID和PWD]-->H2[配网接口返回失败
monitorConfigFail]-->I2[配网失败]-->J[提示用户可能失败的原因]--自查完成-->A[获取当前手机Wifi]
```
### 2.2 PeripheralBanana 功能说明 -PeripheralBananaActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralBanana,2.x /广播 /人体秤
#### 2.2.1 完整的称重逻辑
```mermaid
graph TD
A[发起蓝牙扫描
startSearch]-->B[监听蓝牙扫描状态
PPBleStateInterface]-->C[monitorBluetoothWorkState
PPBleStateSearchCanceled停止扫描
PPBleWorkSearchTimeOut扫描超时
PPBleWorkStateSearching扫描中]
A-->F[设备数据变化监听
PPDataChangeListener]
F-->G1[过程数据
monitorProcessData]
F-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I2[判断心率状态]
I2[判断心率状态]-->J1[正在测量心率]-->K1[展示心率测量中UI]
I2[判断心率状态]-->J2[心率测量完成]-->K2[匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->L[调用计算库计算体脂
示例:Calculate4ACActivitiy]
```
### 2.3 PeripheralCoconut功能说明 -PeripheralCoconutActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralCoconut,3.x /连接 /人体秤
#### 2.3.1 称重逻辑
```mermaid
graph TD
A[发起连接设备
startConnect]-->B[监听蓝牙连接状态
PPBleStateInterface]
B-->B1[monitorBluetoothWorkState
蓝牙扫描和连接状态监听
PPBleWorkStateConnected连接成功
PPBleWorkStateConnectFailed连接失败
PPBleWorkStateDisconnected断开连接
PPBleWorkStateWritable可写]
B1-->C2[当前可写
PPBleWorkStateWritable] --> D[切换单位
syncUnit]
D[切换单位
syncUnit]--监听蓝牙写入回调
PPBleSendResultCallBack-->D1[同步时间
syncTime]
A-->F[设备数据变化监听
PPDataChangeListener]
F[设备数据变化监听
PPDataChangeListener]-->G1[过程数据
monitorProcessData]
F[设备数据变化监听
PPDataChangeListener]-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I2[判断心率状态]
I2[判断心率状态]-->J1[正在测量心率]-->K1[展示心率测量中UI]
I2[判断心率状态]-->J2[心率测量完成]-->K2[匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->L[调用计算库计算体脂
四电极交流示例:Calculate4ACActivitiy
四电极直流示例:Calculate4DCActivitiy]
```
#### 2.3.2 读取蓝牙历史数据
**前提:蓝牙已连接**
```mermaid
graph TD
A[读取历史数据
getHistoryData]-->A1[历史数据监听]-->B1[历史数据回调
monitorHistoryData]
B1[历史数据回调
monitorHistoryData]-->C[使用List存历史数据]
A1-->B2[历史数据结束回调
monitorHistoryEnd]
B2-->D[拿到list的历史数据]-->E[匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->F[调用计算库计算体脂
示例:Calculate4ACActivitiy]
B2-->G[删除历史数据
deleteHistoryData]
A1-->B3[历史数据失败回调
monitorHistoryFail]
```
### 2.4 PeripheralDurian功能说明 -PeripheralDurianActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralDurian,2.x /设备端计算的连接/人体秤
#### 2.4.1 称重逻辑
```mermaid
graph TD
A[发起连接设备
startConnect]-->B[监听蓝牙连接状态
PPBleStateInterface]
B-->B1[monitorBluetoothWorkState
蓝牙扫描和连接状态监听
PPBleWorkStateConnected连接成功
PPBleWorkStateConnectFailed连接失败
PPBleWorkStateDisconnected断开连接
PPBleWorkStateWritable可写]
B1-->C2[当前可写
PPBleWorkStateWritable] --> D[切换单位
syncUnit]
D[切换单位
syncUnit]--监听蓝牙写入回调
PPBleSendResultCallBack-->D1[同步时间
syncTime]
A-->F[设备数据变化监听
PPDataChangeListener]
F[设备数据变化监听
PPDataChangeListener]-->G1[过程数据
monitorProcessData]
F[设备数据变化监听
PPDataChangeListener]-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I2[判断心率状态]
I2[判断心率状态]-->J1[正在测量心率]-->K1[展示心率测量中UI]
I2[判断心率状态]-->J2[心率测量完成]-->K2[匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->L[调用计算库计算体脂
四电极交流示例:Calculate4ACActivitiy
四电极直流示例:Calculate4DCActivitiy]
```
### 2.5 PeripheralEgg功能说明 -PeripheralEggActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralEgg,2.x /连接 /厨房秤
#### 2.5.1 称重逻辑
```mermaid
graph TD
A[发起连接设备
startConnect]-->B[监听蓝牙连接状态
PPBleStateInterface]
B-->B1[monitorBluetoothWorkState
蓝牙扫描和连接状态监听
PPBleWorkStateConnected连接成功
PPBleWorkStateConnectFailed连接失败
PPBleWorkStateDisconnected断开连接
PPBleWorkStateWritable可写]
B1-->C2[当前可写
PPBleWorkStateWritable] --> D[切换单位
syncUnit]
A-->F[设备数据变化监听
PPDataChangeListener]
F[设备数据变化监听
FoodScaleDataChangeListener]-->G1[过程数据
monitorProcessData]
F-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
```
### 2.6 PeripheralFish功能说明 -PeripheralFishActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralFish,3.x /连接 /厨房秤
```mermaid
graph TD
A[发起连接设备
startConnect]-->B[监听蓝牙连接状态
PPBleStateInterface]
B-->B1[monitorBluetoothWorkState
蓝牙扫描和连接状态监听
PPBleWorkStateConnected连接成功
PPBleWorkStateConnectFailed连接失败
PPBleWorkStateDisconnected断开连接
PPBleWorkStateWritable可写]
B1-->C2[当前可写
PPBleWorkStateWritable] --> D[切换单位
syncUnit]
A-->F[设备数据变化监听
PPDataChangeListener]
F[设备数据变化监听
PPDataChangeListener]-->G1[过程数据
monitorProcessData]
F[设备数据变化监听
PPDataChangeListener]-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
```
### 2.7 PeripheralGrapes功能说明 -PeripheralGrapesActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralGrapes,2.x /广播 /厨房秤
```mermaid
graph TD
A[发起蓝牙扫描
startSearch]-->B[监听蓝牙扫描状态
PPBleStateInterface]-->C[monitorBluetoothWorkState
PPBleStateSearchCanceled停止扫描
PPBleWorkSearchTimeOut扫描超时
PPBleWorkStateSearching扫描中]
A-->F[设备数据变化监听
PPDataChangeListener]
F-->G1[过程数据
monitorProcessData]
F-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
```
### 2.8 PeripheralHamburger功能说明 -PeripheralHamburgerActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralHamburger,3.x /广播 /厨房秤
```mermaid
graph TD
A[发起蓝牙扫描
startSearch]-->B[监听蓝牙扫描状态
PPBleStateInterface]-->C[monitorBluetoothWorkState
PPBleStateSearchCanceled停止扫描
PPBleWorkSearchTimeOut扫描超时
PPBleWorkStateSearching扫描中]
A-->F[设备数据变化监听
PPDataChangeListener]
F-->G1[过程数据
monitorProcessData]
F-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
```
### 2.9 PeripheralIce功能说明 -PeripheralIceActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralIce,4.0 /连接 /人体秤
#### 2.9.1 称重逻辑
```mermaid
graph TD
A[发起蓝牙扫描
startSearch]-->B[监听蓝牙扫描状态
PPBleStateInterface]-->C[monitorBluetoothWorkState
PPBleStateSearchCanceled停止扫描
PPBleWorkSearchTimeOut扫描超时
PPBleWorkStateSearching扫描中]
A-->F[设备数据变化监听
PPDataChangeListener]
F-->G1[过程数据
monitorProcessData]
F-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I2[判断心率状态]
I2[判断心率状态]-->J1[正在测量心率]-->K1[展示心率测量中UI]
I2[判断心率状态]-->J2[心率测量完成]-->K2[匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->L[调用计算库计算体脂
示例:Calculate4ACActivitiy]
```
#### 2.9.2 读取蓝牙历史数据
**前提:蓝牙已连接**
```mermaid
graph TD
A[读取历史数据
getHistoryData]-->A1[历史数据监听]-->B1[历史数据回调
monitorHistoryData]
B1[历史数据回调
monitorHistoryData]-->C[使用List存历史数据]
A1-->B2[历史数据结束回调
monitorHistoryEnd]
B2-->D[拿到list的历史数据]-->E[匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->F[调用计算库计算体脂
示例:Calculate4ACActivitiy]
B2-->G[删除历史数据
deleteHistoryData]
A1-->B3[历史数据失败回调
monitorHistoryFail]
```
#### 2.9.3 配网流程
**前提:蓝牙已连接**
注意:
- 确保Server正常,路由器能正常连接到Server
- 确保WiFi环境是2.4G或2.4/5G混合模式,不支持单5G模式
- 确保账号密码正确
- 确保秤端使用的Server地址与App使用的Server地址对应
**注意**
注意:域名在您自己的App中需要换成你App自己的服务器域名,并确保服务器已完成Wifi体脂秤相关功能开发,
文档地址:https://uniquehealth.lefuenergy.com/unique-open-web/#/document
找到"乐福体脂秤自建服务器接入方案"-> PeripheralIce/PeripheralTorre 对应"Torre系列产品"
```mermaid
graph TD
A[检测是否支持配网
PPScaleHelper.isFuncTypeWifi]--支持-->A1[获取Wifi列表
getWifiList
注册Wifi列表回调
PPConfigWifiInfoInterface]
A--不支持-->A2[处理UI展示]
A1-->B1[Wifi列表返回成功
monitorWiFiListSuccess]-->B2[为空-周围没有支持的Wifi]
B1-->B3[不为空]-->B4[展示Wifi列表]-->B5[用户选则一个Wifi]-->B6[输入密码]
B6-->D[开始下发服务器域名
sendModifyServerDomain:domainName, PPConfigWifiInfoInterface]-->F[服务器域名修改成功
monitorModifyServerDomainSuccess]
F-->G[配置SSID和密码
configWifiData:ssid, pwd,PPConfigWifiInfoInterface]
G-->H1[配置SSID和密码成功
monitorConfigSn]
G-->H2[配置SSID和密码失败
monitorConfigFail]-->C21[提示用户,排查原因]-->C22[重新配网]
D--用户在配网中途退出-->E[用户手动返回-退出配网
exitConfigWifi]
A1-->C[Wifi列表返回失败
monitorWiFiListFail]-->C21
```
### 2.10 PeripheralJambul功能说明 -PeripheralJambulActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralJambul,3.x /广播 /人体秤
#### 2.10.1 完整的称重逻辑
```mermaid
graph TD
A[发起蓝牙扫描
startSearch]-->B[监听蓝牙扫描状态
PPBleStateInterface]-->C[monitorBluetoothWorkState
PPBleStateSearchCanceled停止扫描
PPBleWorkSearchTimeOut扫描超时
PPBleWorkStateSearching扫描中]
A-->F[设备数据变化监听
PPDataChangeListener]
F-->G1[过程数据
monitorProcessData]
F-->G2[锁定数据
monitorLockData]
G1--拿自己App当前的单位
转成PPUnitType-->H1[单位转换
PPUtil.getWeightValueD]-->I1[实时展示体重数据UI]
G2--拿自己App当前的单位
转成PPUnitType-->H2[单位转换
PPUtil.getWeightValueD]-->I2[判断心率状态]
I2[判断心率状态]-->J1[正在测量心率]-->K1[展示心率测量中UI]
I2[判断心率状态]-->J2[心率测量完成]-->K2[匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->L[调用计算库计算体脂
示例:Calculate4ACActivitiy]
```
### 2.11 PeripheralTorre功能说明 -PeripheralTorreActivity
**注意:**
- 默认已处理完蓝牙权限和开关检测,并匹配到PPDevicePeripheralType的类型为PeripheralTorre,TORRE/连接 /人体秤
- 需要自行判断是否支持历史,然后再处理历史相关功能
- 需要自行判断是否支持Wifi,然后再处理Wifi相关功能
#### 2.11.1 称重流程
**前提:蓝牙已连接**
```mermaid
graph TD
A[发起连接设备
startConnect]-->B[监听蓝牙状态
PPBleStateInterface]-->C1[蓝牙设备状态
monitorBluetoothWorkState]
B-->C2[系统蓝牙状态
monitorBluetoothSwitchState]
B-->C3[Mtu状态
monitorMtuChange]-->D[同步时间
]-->E[同步单位
syncUnit]
E--需要同步用户信息-->F[走2.9.2业务逻辑]-->F1[同步信息完成]-->G
E--不需要同步用户信息-->G[选则当前用户
confirmCurrentUser] -->G1[当前用户选则成功
confirmCurrentUserInfoSuccess]-->H[启动测量
startMeasure]--注册数据变化监听
registDataChangeListener-->I[测量结果回调
PPDataChangeListener]
I-->I1[过程数据
monitorProcessData]--拿自己App当前的单位
转成PPUnitType-->I11[单位转换
PPUtil.getWeightValueD]-->I12[实时展示体重数据UI]
I-->I2[锁定数据
monitorLockData]-->I21[心率状态
isHeartRating]
I21--true-->I211[正在测量心率]-->K1[展示心率测量中UI]
I21--false-->I212[测量结束]-->J[根据memberID匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->K[调用计算库计算体脂
八电极示例:Calculate8ACActivitiy
四电极示例:Calculate4ACActivitiy]
I-->I3[阻抗测量中
onImpedanceFatting]-->I31[根据自己的业务展示UI]
I-->I4[超重
monitorOverWeight]-->I41[根据自己的业务展示UI]
I-->I5[设备关机回调
onDeviceShutdown]-->I51[根据自己的业务展示UI]
I-->I6[历史数据发生改变
onHistoryDataChange]-->I61[主动去读取历史数据]
G-->G2[当前用户选则失败]-->H
```
#### 2.11.2 完整的用户信息同步流程
**前提:蓝牙已连接**
```mermaid
graph TD
E[需要同步用户信息
App自己记录当前的设备是否需要同步]-->F1[删除设备端所有用户
deleteAllUserInfo]
F1--删除成功-->G[同步用户信息
syncUserInfo循环同步
直到同步完成-支持5个账户,每账户/10个用户]
G-->G1[一个用户同步完成
syncUserInfoSuccess]-->G2[同步下一个]--循环同步-->G
G-->H[所有用户同步完成
syncUserInfoSuccess]
G-->H1[用户同步失败
syncUserInfoFail]-->H11[提示用户]
```
#### 2.11.3 完整的配网流程
**前提:蓝牙已连接**
注意:
- 确保Server正常,路由器能正常连接到Server
- 确保WiFi环境是2.4G或2.4/5G混合模式,不支持单5G模式
- 确保账号密码正确
- 确保秤端使用的Server地址与App使用的Server地址对应
**注意**
注意:域名在您自己的App中需要换成你App自己的服务器域名,并确保服务器已完成Wifi体脂秤相关功能开发,
文档地址:https://uniquehealth.lefuenergy.com/unique-open-web/#/document
找到"乐福体脂秤自建服务器接入方案"-> PeripheralIce/PeripheralTorre 对应"Torre系列产品"
```mermaid
graph TD
A[检测是否支持配网
PPScaleHelper.isFuncTypeWifi]--支持-->A1[获取Wifi列表
getWifiList
注册Wifi列表回调
PPTorreConfigWifiInterface]
A--不支持-->A2[处理UI展示]
A1-->B1[Wifi列表返回成功
monitorWiFiListSuccess]-->B2[为空-周围没有支持的Wifi]
B1-->B3[不为空]-->B4[展示Wifi列表]-->B5[用户选则一个Wifi]-->B6[输入密码]
B6-->D[开始下发配网信息
configWifi:domainName,ssid,password,configWifiInterface]-->C
D--用户在配网中途退出-->E[用户手动返回-退出配网
exitConfigWifi]
A1-->C[配网状态
configResult]
C-->C1[配网成功
CONFIG_STATE_SUCCESS]-->C11[返回入口,重新获取WifiSSID
getWifiSSID]
C-->C2[配网失败
详细看枚举类PPConfigStateMenu]-->C21[提示用户,排查原因]-->C22[重新配网]
C-->C3[退出配网状态
CONFIG_STATE_EXIT]
```
#### 2.11.4 有主用户历史数据同步
**前提:蓝牙已连接**
- 有主用户历史:指有有效的memberID的历史数据
```mermaid
graph TD
A[有主用户历史数据同步
syncUserHistory]-->B[注册历史数据监听
OnTorreHistoryDataListener]
B-->B1[有主历史数据同步成功
onSyncUserHistorySuccess]
B-->B2[正在同步xx用户历史数据
onStartSyncUserHistory]
B-->B3[同步失败
onHistoryFail]
B-->B4[有主用户同步完成
onHistoryEnd]
B4-->C[根据memberID匹配用户信息
给PPBodyBaseModelbodyBaseModel.PPUserModel]-->D[调用计算库计算体脂
八电极示例:Calculate8ACActivitiy
四电极示例:Calculate4ACActivitiy]-->E[将数据存储到数据表]
```
#### 2.11.5 无主用户历史数据同步
**前提:蓝牙已连接**
- 无主用户历史:指没有有效的memberID的历史数据,memberID全为64个0或为空
```mermaid
graph TD
A[无主用户历史数据同步
syncUserHistory]-->B[注册历史数据监听
OnTorreHistoryDataListener]
B-->B1[无主历史数据同步成功
onTouristUserHistorySuccess]
B-->B2[同步失败
onHistoryFail]
B-->B3[无主用户同步完成
onHistoryEnd]
B3-->D[将数据作为无主数据存储,让用户自己去认领数据]
```
#### 2.11.5 功能列表
| 功能| 方法名 | 参数 |返回数据类型|备注|
|------|--------|--------|--------|--------|
|蓝牙连接| startConnect|PPDeviceModel|PPBleStateInterface| 蓝牙相关状态|
|启动测量| startMeasure | | PPDataChangeListener | 蓝牙相关状态|
|停止测量| stopMeasure|PPDeviceModel|PPBleStateInterface| 蓝牙相关状态|
|同步时间| syncTime | | PPBleSendResultCallBack-onResult(PPScaleSendState sendState) | 发送状态回调|
|读取设备信息| readDeviceInfo | | PPDeviceInfoInterface-readDeviceInfoComplete | 设备信息回调,部分秤支持(包括modelNumber、softwareVersion、serialNumber) |
|同步单位| syncUnit | PPUnitType,PPUserModel | PPBleSendResultCallBack|发送状态回调 |
|注册数据变化监听| registDataChangeListener |PPDataChangeListener|monitorProcessData 过程数据
monitorLockData锁定数据
monitorOverWeight超重 |
|是否支持历史| PPScaleHelper-
isSupportHistoryData |deviceFuncType|Boolean|true支持 false不支持|
|是否支持Wifi| PPScaleHelper-
isFuncTypeWifi |deviceFuncType|Boolean|true支持 false不支持|
|同步用户数据| syncUserInfo |PPUserModel|PPUserInfoInterface|同步多个用户要一个一个同步|
|删除用户数据| deleteAllUserInfo |deviceFuncType|PPUserInfoInterface|根据userID去删除该userId下的所有子成员|
|确认当前用户| confirmCurrentUser |PPUserModel|PPUserInfoInterface|
|获取用户列表| getUserList ||PPUserInfoInterface|true支持 false不支持|
|开始配网| startConfigWifi ||Boolean|true支持 false不支持|
|获取SSID| getWifiSSID |deviceFuncType|Boolean|true支持 false不支持|
|获取WifiMac| getWifiMac |deviceFuncType|Boolean|true支持 false不支持|
|清除用户| clearDeviceUserInfo |deviceFuncType|Boolean|true支持 false不支持|
|获取单位| getUnit |deviceFuncType|Boolean|true支持 false不支持|
|设备信息| readDeviceInfoFromCharacter |deviceFuncType|Boolean|true支持 false不支持|
|获取电量| readDeviceBattery |deviceFuncType|Boolean|true支持 false不支持|
|获取亮度| getLight |deviceFuncType|Boolean|true支持 false不支持|
|设置亮度| setLight |light|Boolean|0-100|
|用户历史数据| syncUserHistory |PPUserModel|PPHistoryDataInterface|
|游客历史数据| syncTouristHistory ||PPHistoryDataInterface|
|恢复出厂| resetDevice |deviceFuncType|Boolean|true支持 false不支持|
|启动保活| startKeepAlive |||无需主动退出保活|
## Ⅵ .实体类对象及具体参数说明
### 1.1 PPBodyFatModel 体脂计算对象参数说明
四电极对应的24项数据
八电极对应的48项数据
| 参数| 参数类型 | 说明 |数据类型|备注
|------|--------|--------|--------|--------|
|ppBodyBaseModel| PPBodyBaseModel |体脂计算的入参|基础入参|包含设备信息、用户基础信息、体重和心率|体脂秤
|ppSDKVersion| String |计算库版本号|返回参数|
|ppSex| PPUserGender|性别|返回参数| PPUserGenderFemale女
PPUserGenderMale男
|ppHeightCm|Int |身高|返回参数|cm
|ppAge|Int |年龄|返回参数|岁
|errorType|BodyFatErrorType |错误类型|返回参数|PP_ERROR_TYPE_NONE(0),无错误
PP_ERROR_TYPE_AGE(1), 年龄有误
PP_ERROR_TYPE_HEIGHT(2),身高有误
PP_ERROR_TYPE_WEIGHT(3),体重有误
PP_ERROR_TYPE_SEX(4) 性別有误
PP_ERROR_TYPE_PEOPLE_TYPE(5)
以下是阻抗有误
PP_ERROR_TYPE_IMPEDANCE_TWO_LEGS(6)
PP_ERROR_TYPE_IMPEDANCE_TWO_ARMS(7)
PP_ERROR_TYPE_IMPEDANCE_LEFT_BODY(8)
PP_ERROR_TYPE_IMPEDANCE_RIGHT_ARM(9)
PP_ERROR_TYPE_IMPEDANCE_LEFT_ARM(10)
PP_ERROR_TYPE_IMPEDANCE_LEFT_LEG(11)
PP_ERROR_TYPE_IMPEDANCE_RIGHT_LEG(12)
PP_ERROR_TYPE_IMPEDANCE_TRUNK(13)
|bodyDetailModel|PPBodyDetailModel|数据区间范围和介绍描述|
|ppWeightKg|Float |体重|24&48|kg
|ppBMI|Float|Body Mass Index|24&48|
|ppFat|Float |脂肪率|24&48|%
|ppBodyfatKg|Float |脂肪量|24&48|kg
|ppMusclePercentage|Float |肌肉率|24&48|%
|ppMuscleKg|Float |肌肉量|24&48|kg
|ppBodySkeletal|Float |骨骼肌率|24&48|%
|ppBodySkeletalKg|Float |骨骼肌量|24&48|kg
|ppWaterPercentage|Float |水分率|24&48|%
|ppWaterKg|Float |水分量|24&48|kg
|ppProteinPercentage|Float |蛋白质率|24&48|%
|ppProteinKg|Float |蛋白质量|24&48|kg
|ppLoseFatWeightKg|Float |去脂体重|24&48|kg
|ppBodyFatSubCutPercentage|Float |皮下脂肪率|24&48|%
|ppBodyFatSubCutKg|Float |皮下脂肪量|24&48|kg
|ppHeartRate|Int |心率|24&48|bmp该值与秤有关,且大于0为有效
|ppBMR|Int |基础代谢|24&48|
|ppVisceralFat|Int |内脏脂肪等级|24&48|
|ppBoneKg|Float |骨量|24&48|kg
|ppBodyMuscleControl|Float |肌肉控制量|24&48|kg
|ppFatControlKg|Float |脂肪控制量|24&48|kg
|ppBodyStandardWeightKg|Float |标准体重|24&48|kg
|ppIdealWeightKg|Float |理想体重|24&48|kg
|ppControlWeightKg|Float |控制体重|24&48|kg
|ppBodyType|PPBodyDetailType |身体类型|24&48|PPBodyDetailType有单独说明
|ppFatGrade|PPBodyFatGrade|肥胖等级|24&48|PPBodyGradeFatThin(0), //!< 偏瘦
PPBodyGradeFatStandard(1),//!< 标准
PPBodyGradeFatOverwight(2), //!< 超重
PPBodyGradeFatOne(3),//!< 肥胖1级
PPBodyGradeFatTwo(4),//!< 肥胖2级
PPBodyGradeFatThree(5);//!< 肥胖3级
|ppBodyHealth|PPBodyHealthAssessment |健康评估|24&48|PPBodyAssessment1(0), //!< 健康存在隐患
PPBodyAssessment2(1), //!< 亚健康
PPBodyAssessment3(2), //!< 一般
PPBodyAssessment4(3), //!< 良好
PPBodyAssessment5(4); //!< 非常好
|ppBodyAge|Int|身体年龄|24&48|岁
|ppBodyScore|Int |身体得分|24&48|分
|ppCellMassKg|Float |身体细胞量|48|kg
|ppDCI|Int |建议卡路里摄入量|48|Kcal/day
|ppMineralKg|Float |无机盐量|48|kg
|ppObesity|Float |肥胖度|48|%
|ppWaterECWKg|Float |细胞外水量|48|kg
|ppWaterICWKg|Float |细胞内水量|48|kg
|ppBodyFatKgLeftArm|Float |左手脂肪量|48|kg
|ppBodyFatKgLeftLeg|Float |左脚脂肪量|48|kg
|ppBodyFatKgRightArm|Float |右手脂肪量|48|kg
|ppBodyFatKgRightLeg|Float |右脚脂肪量|48|kg
|ppBodyFatKgTrunk|Float |躯干脂肪量|48|kg
|ppBodyFatRateLeftArm|Float |左手脂肪率|48|%
|ppBodyFatRateLeftLeg|Float |左脚脂肪率|48|%
|ppBodyFatRateRightArm|Float |右手脂肪率|48|%
|ppBodyFatRateRightLeg|Float |右脚脂肪率|48|%
|ppBodyFatRateTrunk|Float |躯干脂肪率|48|%
|ppMuscleKgLeftArm|Float |左手肌肉量|48|kg
|ppMuscleKgLeftLeg|Float |左脚肌肉量|48|kg
|ppMuscleKgRightArm|Float |右手肌肉量|48|kg
|ppMuscleKgRightLeg|Float |右脚肌肉量|48|kg
|ppMuscleKgTrunk|Float |躯干肌肉量|48|kg
注意:在使用时拿到对象,请调用对应的get方法来获取对应的值
### 1.2 身体类型-PPBodyDetailType
| 参数| 说明| type |
|------|--------|--------|
|LF_BODY_TYPE_THIN|偏瘦型|0|
|LF_BODY_TYPE_THIN_MUSCLE|偏瘦肌肉型|1|
|LF_BODY_TYPE_MUSCULAR|肌肉发达型|2|
|LF_BODY_TYPE_LACK_EXERCISE|缺乏运动型|3|
|LF_BODY_TYPE_STANDARD|标准型|4|
|LF_BODY_TYPE_STANDARD_MUSCLE|标准肌肉型|5|
|LF_BODY_TYPE_OBESE_FAT|浮肿肥胖型|6|
|LF_BODY_TYPE_FAT_MUSCLE|偏胖肌肉型|7|
|LF_BODY_TYPE_MUSCLE_FAT|肌肉型偏胖|8|
### 1.3 设备对象-PPDeviceModel
| 属性名 | 类型 | 描述 |备注|
| ------ | ---- | ---- | ---- |
| deviceMac | String | 设备mac|设备唯一标识|
| deviceName | String | 设备蓝牙名称 |设备名称标识|
| devicePower | Int | 电量 |-1标识不支持 >0为有效值|
| rssi | Int | 蓝牙信号强度 |
| firmwareVersion | String? | 固件版本号 |要在连接后主动调用readDeviceInfo |
| hardwareVersion | String? | 硬件版本号 |要在连接后主动调用readDeviceInfo |
| manufacturerName | String? | 制造商 |要在连接后主动调用readDeviceInfo |
| softwareVersion | String? | 软件版本号 |要在连接后主动调用readDeviceInfo |
| serialNumber | String? | 序列号 |要在连接后主动调用readDeviceInfo |
| modelNumber | String? | 时区编号 |要在连接后主动调用readDeviceInfo |
| deviceType | PPDeviceType | 设备类型 |PPDeviceTypeUnknow, //未知
PPDeviceTypeCF,//体脂秤
PPDeviceTypeCE, //体重秤
PPDeviceTypeCB,// 婴儿秤
PPDeviceTypeCA; // 厨房秤 |
| deviceProtocolType | PPDeviceProtocolType | 协议模式 | PPDeviceProtocolTypeUnknow(0),//未知
PPDeviceProtocolTypeV2(1),//使用V2.x蓝牙协议
PPDeviceProtocolTypeV3(2),//使用V3.x蓝牙协议
PPDeviceProtocolTypeTorre(3),//Torre协议
PPDeviceProtocolTypeV4(4);//V4.0协议 |
| deviceCalcuteType | PPDeviceCalcuteType | 计算方式 |PPDeviceCalcuteTypeUnknow(0),//未知
PPDeviceCalcuteTypeInScale(1), //秤端计算
PPDeviceCalcuteTypeDirect(2), //直流4DC
PPDeviceCalcuteTypeAlternate(3),//交流4AC br> PPDeviceCalcuteTypeAlternate8(4),// 8电极交流算法
PPDeviceCalcuteTypeNormal(5), //默认默认体脂率采用原始值-4AC
PPDeviceCalcuteTypeNeedNot(6),//不需要计算
PPDeviceCalcuteTypeAlternate8_0(7);//8电极算法,bhProduct =0 |
| deviceAccuracyType | PPDeviceAccuracyType | 精度 |PPDeviceAccuracyTypeUnknow(0), //未知精度
PPDeviceAccuracyTypePoint01(1), //精度0.1
PPDeviceAccuracyTypePoint005(2),//精度0.05
PPDeviceAccuracyTypePointG(3), // 1G精度
PPDeviceAccuracyTypePoint01G(4), // 0.1G精度
PPDeviceAccuracyTypePoint001(5); //0.01KG精度|
| devicePowerType | PPDevicePowerType | 供电模式 |PPDevicePowerTypeUnknow(0),//未知
PPDevicePowerTypeBattery(1),//电池供电
PPDevicePowerTypeSolar(2),//太阳能供电
PPDevicePowerTypeCharge(3); //充电款 |
| deviceConnectType | PPDeviceConnectType | 设备连接类型 |PPDeviceConnectTypeUnknow(0),
PPDeviceConnectTypeBroadcast(1), //广播
PPDeviceConnectTypeDirect(2),//直连
PPDeviceConnectTypeBroadcastOrDirect(3); //广播或直连 |
| deviceFuncType | Int | 功能类型 | PPScaleHelper-isSupportHistoryData//判断是否支持历史
PPScaleHelper-isFuncTypeWifi//判断是否支持Wifi
PPScaleHelper-isFat//判断是否支持测脂 |
| deviceUnitType | String | 支持的单位 |采用","隔开,对应PPUnitType的type |
### 1.4 设备单位-PPUnitType
| 枚举类型 | type | 单位 |
| -- | ---- |---- |
|Unit_KG| 0 | KG |
|Unit_LB| 1 | LB |
|PPUnitST_LB| 2 | ST_LB |
|PPUnitJin| 3 | 斤 |
|PPUnitG| 4 | g |
|PPUnitLBOZ| 5 | lb:oz |
|PPUnitOZ| 6 | oz |
|PPUnitMLWater| 7 | ml(水) |
|PPUnitMLMilk| 8 | ml(牛奶) |
|PPUnitFL_OZ_WATER| 9 | fl_oz(水) |
|PPUnitFL_OZ_MILK| 10 | fl_oz(牛奶) |
|PPUnitST| 11 | ST |
### 2.0 食物秤-LFFoodScaleGeneral参数说明
| 属性名 | 类型 | 描述 |
| ------ | ---- | ---- |
| lfWeightKg | double | 重量 |
| unit | PPUnitType | 单位 |
| byteNum | int | 字节数 |
| thanZero | int | 正负标识 |
| scaleType | String | 秤类型 |
## Ⅶ. [版本更新说明](doc/version_update.md)
## Ⅷ. 使用的第三方库
### 1、芯片方案商提供的体脂计算库
### 2、[bluetoothkit1.4.0 蓝牙库](https://github.com/dingjikerbo/Android-BluetoothKit)
## Ⅸ. [常见问题](doc/common_problem.md)
Contact Developer: Email: yanfabu-5@lefu.cc