Slim Scale
The Slim Scale extends the functionality of the User Scaleby adding weight loss-related features. The relevant APIs are as follows:
1. QNUserScaleConfig
| New Property | Type | Description |
|---|---|---|
| slimDeviceConfig | QNSlimDeviceConfig | Device configuration class for the Slim Scale |
Note: When establishing a Bluetooth connection (connectUserScaleDevice), the
configparameter (QNUserScaleConfig) includes a class that now supports Slim Scale configurations (such as alarm, sound settings, etc.) via theslimDeviceConfigproperty (QNSlimDeviceConfig).
2. QNBleApi
| New Method Name | Description |
|---|---|
| updateSlimDeviceConfig | Updates Slim Scale device settings |
| updateUserCurveData | Updates curve weight data for registered users on the scale |
| updateUserSlimConfig | Updates weight loss settings for registered users on the scale |
| restoreFactorySettings | Restores the device to factory settings |
Slim Scale Integration Guide
1. Initialize QNSDK
Use QNBleApi.initSdkfor initialization. Refer to Development Processfor details.
2. Set Slim Scale Scan Callback Listener
Before starting Bluetooth scanning, set up the listener using QNBleApi.setBleDeviceDiscoveryListener. Call this method only once, and set it to null/nil when scanning is no longer needed.
Android Example:
QNBleApi.getInstance(context).setBleDeviceDiscoveryListener(new QNBleDeviceDiscoveryListener() {
@Override
public void onDeviceDiscover(QNBleDevice device) {
// Handle discovered device
}
@Override
public void onStartScan() {
// Scan started callback
}
@Override
public void onStopScan() {
// Scan stopped callback
}
@Override
public void onScanFail(int code) {
// Scan failed callback with error code
}
@Override
public void onBroadcastDeviceDiscover(QNBleBroadcastDevice device) {
// Broadcast scale data callback
}
});
iOS Example:
self.bleApi = [QNBleApi sharedBleApi];
self.bleApi.discoveryListener = self;
#pragma mark - QNBleDeviceDiscorveryListener
- (void)onDeviceDiscover:(QNBleDevice *)device {
// Device discovered callback
}
3. Start Bluetooth Scanning
Ensure Bluetooth is enabled. For Android, also verify location permissions and services are enabled. Then start scanning with QNBleApi.startBleDeviceDiscovery.
For Android 6.0+, Bluetooth scanning requires location permissions for targetSdkVersion>=23 apps. Some devices may also require location services enabled.
iOS 13+ requires Bluetooth usage permission. Verify authorization before scanning.
Android Example:
QNBleApi.getInstance(context).startBleDeviceDiscovery(new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
// Callback indicates whether scan started successfully
}
});
iOS Example:
[[QNBleApi sharedBleApi] startBleDeviceDiscovery:^(NSError *error) {
if (error) {
NSLog(@"Scan start failed: %@", error);
}
}];
4. Set Connection State Listener
Set connection state changes listener with QNBleApi.setBleConnectionChangeListener.
Android Example:
QNBleApi.getInstance(this).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) {}
});
iOS Example:
self.bleApi.connectionChangeListener = self;
#pragma mark - QNBleConnectionChangeListener
- (void)onConnecting:(QNBleDevice *)device {}
- (void)onConnected:(QNBleDevice *)device {}
- (void)onServiceSearchComplete:(QNBleDevice *)device {}
- (void)onDisconnecting:(QNBleDevice *)device {}
- (void)onDisconnected:(QNBleDevice *)device {}
- (void)onConnectError:(QNBleDevice *)device error:(NSError *)error {}
5. Set Measurement Data Listener
Set measurement data listener with QNBleApi.setDataListener.
Android Example:
QNBleApi.getInstance(context).setDataListener(new QNScaleDataListener() {
@Override
public void onGetUnsteadyWeight(QNBleDevice device, double weight) {
// Unstable weight data during measurement
}
@Override
public void onGetScaleData(QNBleDevice device, QNScaleData data) {
// Complete measurement data
}
@Override
public void onGetStoredScale(QNBleDevice device, List<QNScaleStoreData> storedDataList) {
// Stored data from device
}
@Override
public void onGetElectric(QNBleDevice device, int electric) {
// Battery percentage (meaningful only for charging models)
}
@Override
public void onScaleStateChange(QNBleDevice device, int status) {
// Measurement connection state changes
}
});
iOS Example:
self.bleApi.dataListener = self;
- (void)onGetUnsteadyWeight:(QNBleDevice *)device weight:(double)weight {
// Real-time weight
}
- (void)onGetScaleData:(QNBleDevice *)device data:(QNScaleData *)scaleData {
// Complete measurement data
}
- (void)onGetStoredScale:(QNBleDevice *)device data:(NSArray<QNScaleStoreData *> *)storedDataList {
// Historical data
}
- (void)onScaleStateChange:(QNBleDevice *)device scaleState:(QNScaleState)state {
// Scale state changes
}
6. Connect to Slim Scale
After receiving device callback, connect using QNBleApi.connectUserScaleDevice.
Android Example:
QNBleApi.getInstance(context).connectUserScaleDevice(device, mQnUserScaleConfig, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
// Connection result
}
});
iOS Example:
[_bleApi connectUserScaleDevice:device config:config callback:^(NSError *error) {
// Connection result
}];
7. Disconnect
Disconnect actively using QNBleApi.disconnectDevice.
Android Example:
QNBleApi.getInstance(RulerActivity.this).disconnectDevice(mac, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
// Disconnection result
}
});
iOS Example:
[self.bleApi disconnectDeviceWithMac:nil callback:^(NSError *error) {
// Disconnection result
}];
8. Configure Slim Scale Settings
Update scale configuration with QNBleApi.updateSlimDeviceConfig.
Android Example:
QNBleApi.getInstance(context).updateSlimDeviceConfig(qnSlimDeviceConfig, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
// Configuration update result
}
});
iOS Example:
QNSlimDeviceConfig *config = [[QNSlimDeviceConfig alloc] init];
[self.bleApi updateSlimDeviceConfig:config callback:^(NSError *error) {
// Configuration update result
}];
Results are returned via QNUserScaleDataListener's updateSlimDeviceConfigResult callback.
9. User Management
9.1 Register/Access User
Use QNBleApi.switchUserScaleUser. For existing users (index 1-8), for new users (index <= 0).
Android Example:
QNUser user = mQNBleApi.buildUser(...);
QNBleApi.getInstance(context).switchUserScaleUser(user, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
// User switch result
}
});
iOS Example:
QNUser *user = [[QNUser alloc] init];
user.index = 0; // 0 for register, 1-8 for existing
[self.bleApi switchUserScaleUser:user callback:^(NSError *error) {
// User switch result
}];
9.2 Delete User
Delete users with QNBleApi.deleteScaleUsers.
Android Example:
QNBleApi.getInstance(context).deleteScaleUsers(selectedItems, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
// Deletion result
}
});
iOS Example:
[self.bleApi deleteScaleUsers:@[@1,@3,@5,@7,@8] callback:^(NSError *error) {
// Deletion result
}];
9.3 Update Weight Loss Configuration
Update with QNBleApi.updateUserSlimConfig.
Android Example:
QNBleApi.getInstance(context).updateUserSlimConfig(curUser.getIndex(), qnSlimUserSlimConfig, new QNResultCallback(){
@Override
public void onResult(int code, String msg) {
// Update result
}
});
iOS Example:
QNSlimUserSlimConfig *config = [[QNSlimUserSlimConfig alloc] init];
[self.bleApi updateUserSlimConfig:config userIndex:userIndex callback:^(NSError *error) {
// Update result
}];
Results via updateUserSlimConfigResult callback.
9.4 Update Weight Curve Data
Update with QNBleApi.updateUserCurveData.
Android Example:
QNBleApi.getInstance(context).updateUserCurveData(curUser.getIndex(), curveData, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
// Update result
}
});
iOS Example:
QNSlimUserCurveData *curveData = [[QNSlimUserCurveData alloc] init];
[self.bleApi updateUserCurveData:curveData userIndex:userIndex callback:^(NSError *error) {
// Update result
}];
Results via updateUserCurveDataResult callback.
9.5 Update Baseline Weight
Update with QNBleApi.updateUserScaleIdentifyWeight.
Android Example:
QNBleApi.getInstance(context).updateUserScaleIdentifyWeight(weight, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
// Update result
}
});
iOS Example:
double weight = 70.0;
[self.bleApi updateUserScaleIdentifyWeight:weight callback:^(NSError *error) {
// Update result
}];
10. Factory Reset
Reset with QNBleApi.restoreFactorySettings.
Android Example:
QNBleApi.getInstance(context).restoreFactorySettings(new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
// Reset result
}
});
iOS Example:
[self.bleApi restoreFactorySettingsCallback:^(NSError *error) {
// Reset result
}];
Results via deviceRestoreFactorySettings callback.