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

Then start scanning with QNBleApi.startBleDeviceDiscovery.

Make sure that Bluetooth is turned on. On the Android side, you also need to check that the corresponding permissions have been authorized and the location service switch is turned on. Then you can start the Bluetooth scan If the targetSdk of your app is greater than 30 and the system version of your phone is Android 12 or above, the following permissions are required

android.permission.BLUETOOTH_ADVERTISE android.permission.BLUETOOTH_SCAN android.permission.BLUETOOTH_CONNECT

Otherwise, it is required android.permission.BLUETOOTH android.permission.BLUETOOTH_ADMIN android.permission.ACCESS_COARSE_LOCATION android.permission.ACCESS_FINE_LOCATION

The iOS13 system has added Bluetooth usage permission. You need to check if you have the usage permission. After confirming that you are authorized and Bluetooth is turned on, start the scan

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 ""