普通蓝牙秤

普通蓝牙秤是我司销售最普通的秤,它的蓝牙名通常为:QN-ScaleQN-Scale1,这两个蓝牙名的秤在使用上并无区别。

该设备的工作流程大约如下:

一、初始化

使用QNBleApi.initSdk进行初始化,前文已有相关介绍,请查看

二、扫描

1. 设置蓝牙扫描回调监听类

在扫描前,需要设置监听类,方法为QNBleApi.setBleDeviceDiscoveryListener,该方法只需要调用一次即可,在确定不需要扫描记得设置为 null/nil

android 示例:

QNBleApi.getInstance(context).setBleDeviceDiscoveryListener(new QNBleDeviceDiscoveryListener() {
    @Override
    public void onDeviceDiscover(QNBleDevice device) {
        //该方法回调设备对象,可以设备对象进行处理
    }

    @Override
    public void onStartScan() {
        //开始扫描的回到
    }

    @Override
    public void onStopScan() {
        //结束扫描的回到
    }

    @Override
    public void onScanFail(int code) {
        //扫描失败的回调,会有错误码返回,具体可以参考 错误码详情页
    }

    @Override
    public void onBroadcastDeviceDiscover(QNBleBroadcastDevice device) {
        //广播秤的数据回调,该处只会回调广播秤的数据
    }
});

iOS 示例:

//设置代理
QNBleApi *bleApi = [QNBleApi sharedBleApi];
bleApi.discoveryListener = self;

//实现代理方法
- (void)onDeviceDiscover:(QNBleDevice *)device {
    //该方法会在发现设备后回调
}

- (void)onBroadcastDeviceDiscover:(QNBleBroadcastDevice *)device {
    //收到广播秤数据时回调,该方法只会回调广播秤的数据
}

- (void)onStopScan {
    //停止扫描时回调
}

- (void)onStartScan {
    //开始扫描时回调
}

2. 启动扫描

确认蓝牙已打开,安卓这边还需要检查下定位权限定位开关。如果确认蓝牙已打开,定位权限已授权,定位服务开关已打开,则可以开始蓝牙扫描

安卓 6.0 以后,对 targetSdkVersion>=23 以上的 APP,进行蓝牙扫描需要获取定位权限,详细说明查看关于 定位服务开关不是强制性的,但是某些手机不打开这个开关,也无法扫描到设备,跟各家的手机系统相关

iOS13系统增加了蓝牙使用权限,需要检查是否有使用权限,确认已授权并且蓝牙已打开的情况下,开始扫描

扫描方法为QNBleApi.startBleDeviceDiscovery,扫描到的设备数据,会在上面设置的扫描接口中QNBleDeviceDiscoveryListener回调。

另外有关扫描的一些特性设置,可以在QNConfig进行设置,需要设置的内容已基本覆盖。

通常 APP 会有个专门用于测量的界面,我们一般是在界面显示之后进行蓝牙扫描,界面消失的时候停止扫描。

android示例:

QNBleApi.getInstance(context).startBleDeviceDiscovery(new QNResultCallback() {
            @Override
            public void onResult(int code, String msg) {
                //该方法并不回到设备,而是表示扫描是否启动成功
                if (code != CheckStatus.OK.getCode()) {
                   ToastMaker.show(ScanActivity.this,code+":"+msg);
                }
            }
        });

iOS示例:

//启动扫描
[[QNBleApi sharedBleApi] startBleDeviceDiscovery:^(NSError *error) {
    //该处回调表示启动扫描方法是否成功
    if (error) {
        NSLog([NSString stringWithFormat:@"启动扫描方法失败,原因: %@",error]);
    }
}];

三、连接

收到回调设备后,可以判断是否为需要连接的设备(这个属于 APP 的业务逻辑),如果是的话就进行连接。

连接之前,需要先设置连接状态回调和测量数据回调。

设置连接状态回调方法为:QNBleApi.setBleConnectionChangeListener,该方法同设置扫描回调方法一样,多次连接也只需要设置一次,如果确定不再需要连接的时候,则设置为 null/nil

android示例:

QNBleApi.getInstance(context).setBleConnectionChangeListener(new QNBleConnectionChangeListener() {
    //正在连接
    @Override
    public void onConnecting(QNBleDevice device) {
        setBleStatus(QNScaleStatus.STATE_CONNECTING);
    }
    //已连接
    @Override
    public void onConnected(QNBleDevice device) {
        setBleStatus(QNScaleStatus.STATE_CONNECTED);
    }

    @Override
    public void onServiceSearchComplete(QNBleDevice device) {
        //该状态是搜索服务完成后的方法,通常这个方法无需业务逻辑
    }

    //正在断开连接,调用断开连接时,会马上回调
    @Override
    public void onDisconnecting(QNBleDevice device) {
        setBleStatus(QNScaleStatus.STATE_DISCONNECTING);
    }

    // 断开连接,断开连接后回调
    @Override
    public void onDisconnected(QNBleDevice device) {
        setBleStatus(QNScaleStatus.STATE_DISCONNECTED);
    }

    //出现了连接错误,错误码参考附表
    @Override
    public void onConnectError(QNBleDevice device, int errorCode) {
        setBleStatus(QNScaleStatus.STATE_DISCONNECTED);
    }
});

iOS示例:

- (void)onConnecting:(QNBleDevice *)device {
    //开始连接的回调
}

- (void)onConnected:(QNBleDevice *)device {
    //连接成功的回调
}

- (void)onServiceSearchComplete:(QNBleDevice *)device {
    //发现服务完成的回调
}

- (void)onDisconnecting:(QNBleDevice *)device {
    //正在断开连接回调
}

- (void)onConnectError:(QNBleDevice *)device error:(NSError *)error {
    //连接失败的回调
}

设置蓝牙状态回调后,还需要设置测量数据的回调接口,方法为:QNBleApi.setDataListener,同样也是设置一次即可,不再使用时,请设置为 null/nil

android示例:

QNBleApi.getInstance(context).setDataListener(new QNScaleDataListener() {
    @Override
    public void onGetUnsteadyWeight(QNBleDevice device, double weight) {
        //该方法是收到了不稳定的体重数据,一次测量中,该方法会回调多次,直到数据稳定,拿到完整数据.
    }

    @Override
    public void onGetScaleData(QNBleDevice device, QNScaleData data) {
        //该方法是收到了完整的测量数据
    }

    @Override
    public void onGetStoredScale(QNBleDevice device, List<QNScaleStoreData> storedDataList) {
        //该方法是收到了秤端存储数据,存储数据的处理方式可以参考demo,也可以自己定义
    }

    @Override
    public void onGetElectric(QNBleDevice device, int electric) {
        //这个是获取到了电量百分比,只有充电款秤获取到的电量才有意义
    }

    //测量过程中的连接状态
    @Override
    public void onScaleStateChange(QNBleDevice device, int status) {
        setBleStatus(status);
    }
});

iOS示例:

- (void)onGetUnsteadyWeight:(QNBleDevice *)device weight:(double)weight {
    //该方法是收到了不稳定的体重数据,一次测量中,该方法会回调多次,直到数据稳定,拿到完整数据
}

- (void)onGetScaleData:(QNBleDevice *)device data:(QNScaleData *)scaleData {
    //该方法是收到了完整的测量数据
}

- (void)onGetStoredScale:(QNBleDevice *)device data:(NSArray <QNScaleStoreData *> *)storedDataList {
    //该方法是收到了秤端存储数据,存储数据的处理方式可以参考demo,也可以自己定义
}

- (void)onGetElectric:(NSUInteger)electric device:(QNBleDevice *)device {
    //这个是获取到了电量百分比,只有充电款秤获取到的电量才有意义
}

- (void)onScaleStateChange:(QNBleDevice *)device scaleState:(QNScaleState)state {
    //测量过程中的连接状态
}

另外,调用连接前,最好把之前的扫描给停止(我们发现部分手机同时蓝牙扫描和蓝牙连接,会降低连接成功的失败率)。停止扫描后,延迟个 200~500ms 再调用连接,会提升连接的成功率。 停止蓝牙扫描的方法为:QNBleApi.stopBleDeviceDiscovery

android示例:

QNBleApi.getInstance(context).stopBleDeviceDiscovery(new QNResultCallback() {
    @Override
    public void onResult(int code, String msg) {
        if (code == CheckStatus.OK.getCode()) {
            isScanning = false;
        }
    }
});

iOS示例:

[[QNBleApi sharedBleApi] stopBleDeviceDiscovery:^(NSError *error) {
    //该处回调表示停止扫描方法是否成功
    if (error) {
        NSLog([NSString stringWithFormat:@"停止扫描方法失败,原因: %@",error]);
    }
}];

连接设备的方法需要传Yolanda蓝牙设备对象(QNBleDevice)以及Yolanda用户资料对象(QNUser),其中QNBleDeviceQNUser的创建方法为:QNBleApi.buildUser,具体使用方法可以参考方法说明。

前面的操作确认 OK 后,终于可以进行连接了,连接的方法为:QNBleApi.connectDevice。连接状态回调方法为上述QNBleConnectionChangeListener

android示例:

QNBleApi.getInstance(context).connectDevice(device, user, new QNResultCallback() {
                @Override
                public void onResult(int code, String msg) {
                    //该方法只是方法调连接方法是否成功
                }
            });

iOS示例:

[[QNBleApi sharedBleApi] connectDevice:device user:user callback:^(NSError *error) {
    //该处回调表示调用连接方法是否成功
    if (error) {
        NSLog([NSString stringWithFormat:@"调用连接方法失败,原因: %@",error]);
    }
}];

称重过程

称重过程的数据以及状态会在上述提到的QNScaleDataListener中进行回调

测量结束

收到稳定数据后(即收到QNScaleDataListener.onGetScaleData)即表示测量完成。此时秤端不会马上断开蓝牙,而是会等秤息屏一小会(可能是 2 分钟)才会断开蓝牙。如果需要尽快断开,可以在收到稳定数据后延时 2s 调用方法QNBleApi.disconnectDevice来断开设备连接。

至此,普通蓝牙秤的基本流程已经走完,APP 可以在收到稳定数据后自行保存数据和展示数据。数据标准判断可以我司的方式-SDK 指标标准描述

其他问题可以先参考 Demo 中的代码,如果有问题还可以查看常见问题。常见问题还未找到相关问题,可以尝试在 SDK 中搜索下是否有相关 API 或说明,如果还是没有,请联系我司技术人员进行协助对接。

Demo 地址如下: iOSDemo

AndroidDemo

results matching ""

    No results matching ""