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 the slimDeviceConfigproperty (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.

results matching ""

    No results matching ""