1 接入流程

1.1 支持环境

环境

兼容范围

备注

软件系统

目标版本: Android API 33
最低版本: Android API 19

支持BLE功能

固件SDK

BR23-watch-SDK, BR28-watch-SDK等

建议咨询SDK负责人

开发工具

Android Studio

建议使用最新版本

1.2 库导入

1.2.1 依赖库

Important

XXX 为版本号,请以最新发布版本为准

  1. jl_bluetooth_connect_Vxxx-release.aar :蓝牙连接相关, 参考 杰理连接开发文档(Android)

  2. jldecryption_vxxx-release.aar : 加密相关

  3. JL_Watch_Vxxx-release.aar : 健康功能相关

  4. jl_rcsp_Vxxx-release.aar : 基础协议相关

  5. BmpConvert_Vxxx-release.aar : 图片转换, 参考 2.3.14   图像转换

  6. jl_bt_ota_Vxxx-release.aar : 杰理蓝牙升级相关, 参考 杰理OTA外接库开发文档(Android)

1.2.2 导入库

<-- 1.将1.2.1的aar文件放入工程目录中的对应moudle的lib文件夹下 --!>
<-- 2.在moudlu的build.gradle中添加 --!>
implementation fileTree(include: ['*.aar'], dir: 'libs')

1.2.3 必要权限

<-- 使用蓝牙权限 --!>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <-- 定位权限,官方要求使用蓝牙或网络开发,需要位置信息 --!>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<-- Android 12+ 需要增加蓝牙连接权限 --!>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

1.3 SDK配置

1.3.1 继承父类

//实现健康管理类
public  class  WatchManager extends  WatchOpImpl{

   private BluetoothDevice mTargetDevice;

   public static WatchManager getInstance() {
       if (null == instance) {
           synchronized (WatchManager.class) {
              if (null == instance) {
                  instance = new WatchManager(FUNC_WATCH);
               }
            }
        }
        return instance;
   }

   //func FUNC_WATCH:手表功能
   //FUNC_RCSP:仅仅使用rcsp协议
   //FUNC_FILE_BROWSE:使用rcsp协议和目录浏览功能
    public WatchManager(int func) {
        super(func);
    }
     /**
      * 获取当前连接的设备,sdk的操作都是基于该设备
      * @return 目标设备
      */
    @Override
    public BluetoothDevice getConnectedDevice() {
        //TODO: 客户重写实现功能
         return mTargetDevice;
    }

            /**
     * SDK通知外部需要发送数据
     * @param device 蓝牙设备对象
     * @param data   数据包 byte数组
     * @return false:发送失败  true:发送成功
     */
    @Override
    public boolean sendDataToDevice(BluetoothDevice device, byte[] data) {
        //TODO: 客户重写实现功能
         return false;
    }
}

1.3.2 外部状态和数据同步

WatchManager mWatchManager = WatchManager.getInstance();
//1. 通知SDK蓝牙设备状态
//targetDevice : 目标设备
//connection status : 连接状态
//注意:连接状态需要转换成StateCode的连接状态
mWatchManager.notifyBtDeviceConnection(targetDevice, StateCode.CONNECTION_OK);
//2. 通知SDK接收数据
//targetDevice: 目标设备
//data:byte数组, 接收到目标数据发送的数据
mWatchManager.notifyReceiveDeviceData(targetDevice,data);
//3. SDK通知外部需要发送数据(在子类重写方法实现)
//device: 目标设备
//data: 发送数据
sendDataToDevice(BluetoothDevice device, byte[] data);

Important

  1. 透传连接状态需要转换库内定义的连接状态

  2. 如设备需要 认证流程 ,请连接成功后并完成设备认证流程再回调成功状态

  3. 发送数据接口,如果是 BLE实现 ,需要注意 MTU分包队列式发数

    • BLE的MTU分包处理: BLE 连接会协商MTU值, 超出MTU的值, 会被系统抛弃。
      为了避免数据丢失, 请按照MTU大小发送, 若发送数据长度超过MTU, 则需要进行MTU分包发送处理
    • BLE发送-队列式发数: BLE并发式发送容易导致手机系统BLE底层协议栈卡住。
      建议发送数据后根据 BluetoothGattCallback#onCharacteristicWrite 回调的状态,进行 队列式发数 处理

1.3.3 SDK状态数据回调

WatchManager mWatchManager =   WatchManager.getInstance();

//1.手表表盘相关回调
mWatchManager.registerOnWatchCallback(new OnWatchCallback() {
    //参考3.2的说明

    /**
     * RCSP协议初始化状态回调
     *
     */
    @Override
    public void onRcspInit(BluetoothDevice device, boolean isInit) {
       //1. RCSP协议初始化是否成功
       //2. 当条件1成立后,会去判断是否支持手表功能
       //3. 当条件2成立后,会去初始化手表协议
    }

    /**
     * 手表系统初始化状态回调
     *
     * @param code 初始化状态
     *             <p>
     *             若是0,表示初始化成功;其他值,为错误码
     *             </p>
     */
    public void onWatchSystemInit(int code) {
            //code为0时,意味着库的初始化已完成,可以进行功能操作
        //code为错误码时,需要断开设备
    }
});

//2.设备主动推送事件回调
mWatchManager.registerOnRcspEventListener(new OnRcspEventListener() {
    //参考3.3的说明
});

Important

  1. onWatchSystemInit 的错误码,可以参考 3.13   错误码定义

1.3.4 SDK初始化流程

SDK初始化流程

1.3.5 异常处理

异常状态,是固件系统发生异常返回的状态。用户必须处理固件的异常,才能正常使用设备。

1.3.5.1 监听异常状态

//WatchManager是WatchOpImpl的子类,须在1.3配置好sdk
WatchManager mWatchManager = WatchManager.getInstance();
final OnWatchCallback watchCallback = new OnWatchCallback() {
    @Override
    public void onRcspInit(BluetoothDevice device, boolean isInit) {
        super.onRcspInit(device, isInit);
        //回调RCSP协议初始化状态
        //首先会初始化RCSP协议
        //RCSP初始化失败,按以下情况排查:
        //1. 是否没有通过设备认证
        //2. 是否发送数据异常
    }

    @Override
    public void onWatchSystemInit(int code) {
        super.onWatchSystemInit(code);
        //回调手表系统初始化状态
        //检测到支持手表功能,会进行手表系统初始化
        //手表系统初始化失败,按以下情况排查:
        //1. 是否设备离线
        //2. 设备是否支持手表功能
        //3. 手表系统是否发送异常
    }

    @Override
    public void onWatchSystemException(BluetoothDevice device, int sysStatus) {
        super.onWatchSystemException(device, sysStatus);
        //回调手表系统异常
        //AC695N_WATCH_SDK可能会回调系统异常,需要进行恢复系统的操作,恢复成功后才能正常使用手表功能。
        //AC701N_WATCH_SDK一般不会回调系统异常,内部处理了。
    }

    @Override
    public void onMandatoryUpgrade(BluetoothDevice device) {
        super.onMandatoryUpgrade(device);
        //回调设备需要强制升级
        //此情况一般发生在单备份升级异常后。导致设备处于强制升级状态。
        //此时设备仅有BLE,而且BLE仅支持OTA功能。只有强制升级成功后,才能正常使用
    }

    @Override
    public void onResourceUpdateUnfinished(BluetoothDevice device) {
        super.onResourceUpdateUnfinished(device);
        //回调设备资源未更新完成
        //此情况一般发生在更新资源失败后,导致设备处于更正资源状态。
        //此情况设备手表系统能运行,但是部分资源受损,需要更新资源完成,才能正常使用。
        //部分资源受损,强行使用功能,可能导致设备死机。
    }

    @Override
    public void onNetworkModuleException(BluetoothDevice device, NetworkInfo info) {
        super.onNetworkModuleException(device, info);
        //回调网络模块发送异常
        //此情况一般发送在网络模块升级失败后,设备检测到网络模块(4G模块)异常
        //此情况建议强制升级网络模块,网络模块升级完成后,才能正常使用网络功能。
    }
};
//注册手表事件监听器
mWatchManager.registerOnWatchCallback(watchCallback);

//不需要使用时,注销回调
//mWatchManager.unregisterOnWatchCallback(watchCallback);

1.3.5.2 获取异常状态

除了监听,用户可以通过SDK的接口查询设备的异常状态是否存在

  1. 强制升级状态

    //WatchManager是WatchOpImpl的子类,须在1.3配置好sdk
    WatchManager watchManager = WatchManager.getInstance();
    final DeviceInfo deviceInfo = watchManager.getDeviceInfo();
    if(null == deviceInfo) return; //设备未初始化完成
    deviceInfo.isMandatoryUpgrade(); //设备是否需要强制升级
    
  2. 手表系统异常状态

    //WatchManager是WatchOpImpl的子类,须在1.3配置好sdk
    WatchManager watchManager = WatchManager.getInstance();
    //获取外挂Flash信息
    final ExternalFlashMsgResponse externalFlashMsg = watchManager.getExternalFlashMsg(watchManager.getConnectedDevice());
    if(null == externalFlashMsg) return; //设备不支持手表功能
    boolean isSysException = externalFlashMsg.getSysStatus() != 0; //判断手表系统是否异常,0是正常,其他值为异常
    
  3. 资源更新未完成状态

    //WatchManager是WatchOpImpl的子类,须在1.3配置好sdk
    WatchManager watchManager = WatchManager.getInstance();
     final DeviceInfo deviceInfo = watchManager.getDeviceInfo();
     if (null == deviceInfo) return; //设备未初始化完成
     //判断设备是否处于更新资源模式
     //0 为正常模式, 1为更新资源模式
     boolean isUpdateResource = deviceInfo.getExpandMode() == WatchConstant.EXPAND_MODE_RES_OTA;
    
  4. 网络模块升级异常状态

    //WatchManager是WatchOpImpl的子类,须在1.3配置好sdk
     WatchManager watchManager = WatchManager.getInstance();
     final DeviceInfo deviceInfo = watchManager.getDeviceInfo();
     if (null == deviceInfo) return; //设备未初始化完成
     //获取网络模块信息
     final NetworkInfo networkInfo = deviceInfo.getNetworkInfo();
     if(null == networkInfo){//设备不支持网络模块功能
         //需要等 onWatchSystemInit 回调成功后,再查询
         return;
     }
     boolean isNetworkModeException = networkInfo.isMandatoryOTA(); //网络模块是否需要强制升级
    

1.3.5.3 处理异常状态

解决固件异常状态的方案

  1. 固件强制升级状态

    通过 升级固件 的方式来解决。 具体操作参考 杰理OTA外接库开发文档(Android)

  2. 手表系统异常状态

    通过 恢复系统 的方式来解决。 参考 2.3.10   系统恢复

  3. 资源更新未完成状态

    通过 资源更新 的方式来解决。参考 2.3.9   资源更新

  4. 网络模块升级异常状态

    通过 网络模块升级 的方式来解决。参考 2.18.3   开始网络模块OTA

1.3.6 设备认证

是否需要 设备认证 , 需要与固件工程师确认。公版固件SDK默认是 开启设备认证的

//1. 初始化RcspAuth对象,需要实现发送数据接口和设置数据监听器
RcspAuth mRcspAuth = new RcspAuth(new RcspAuth.IRcspAuthOp() {
        @Override
        public boolean sendAuthDataToDevice(BluetoothDevice device, byte[] data) {
            return sendDataToDevice(device, data);
        }
    }, mRcspAuthListener);
//2.当设备连接成功时,开始设备认证
mRcspAuth.stopAuth(device, false); //清除旧的设备认证
boolean ret = mRcspAuth.startAuth(device); //开始设备认证, 结果是操作结果
//3.在接收设备数据回调处,进行设备认证数据处理
if (!isAuthDevice(device)) {
    mRcspAuth.handleAuthData(device, rawData);
} else {
    //TODO: 其他数据处理
}
//4.认证结果会通过监听器回调
//5.不需要使用设备认证功能时,请销毁RcspAuth对象
//mRcspAuth.destroy();

● 发送接口

public interface IRcspAuthOp {
    /**
     * 向蓝牙设备发送认证数据
     *
     * @param device 蓝牙设备对象
     * @param data   数据包
     * @return 操作结果
     */
    boolean sendAuthDataToDevice(BluetoothDevice device, byte[] data);
}

● 认证事件监听器

/**
 * Rcsp认证监听器
 */
public interface OnRcspAuthListener {
    /**
     * 初始化结果回调
     *
     * @param result 结果
     */
    void onInitResult(boolean result);

    /**
     * 设备认证成功回调
     *
     * @param device 蓝牙设备
     */
    void onAuthSuccess(BluetoothDevice device);

    /**
     * 设备认证失败回调
     *
     * @param device  蓝牙设备
     * @param code    错误码
     * @param message 错误信息
     */
    void onAuthFailed(BluetoothDevice device, int code, String message);
}

1.3.7 参考示例代码

示例工程[宜动健康工程包] test包下 WatchManagerTest.java

../../_images/WatchManager_import_code.png