15. 自定义命令

15.1. 发送自定义命令

  1. JL_BluetoothManager方式

命令构造

//Step0: 获取JL_BluetoothManager对象
JL_BluetoothManager manager = JL_BluetoothManager.getInstance(context);
//Step1: 构造自定义命令
byte[] data = new byte[20]; //自定义数据
//创建自定义命令(默认创建需要回复的自定义命令)
CommandBase customCmd = CommandBuilder.buildCustomCmd(data);
//创建不需要回复的自定义命令
//        customCmd = new CustomCmd(CommandBase.FLAG_HAVE_PARAMETER_NO_RESPONSE, new CustomParam(data));
//Step2: 执行操作命令并等待结果回调
manager.sendRcspCommand(manager.getConnectedDevice(), customCmd, new RcspCommandCallback() {
    //回调回复命令
    //注意: 无回复命时,回复命令本身
    @Override
    public void onCommandResponse(BluetoothDevice device, CommandBase cmd) {
        //Step3: 检查设备状态
        if (cmd.getStatus() != StateCode.STATUS_SUCCESS) { //设备状态异常,进行异常处理
            onErrCode(device, new BaseError(ErrorCode.SUB_ERR_RESPONSE_BAD_STATUS, "Device reply an bad status: " + cmd.getStatus()));
            return;
        }
        //成功回调
        //Step4: 获取对应的命令数据
        CustomCmd customCmd = (CustomCmd) cmd;
        boolean isNeedResponse = cmd.getType() == CommandBase.FLAG_HAVE_PARAMETER_AND_RESPONSE
                    || cmd.getType() == CommandBase.FLAG_NO_PARAMETER_AND_RESPONSE;
            if (!isNeedResponse) return; //没有回复数据
        //Step5: 获取回复数据
        CustomResponse response = customCmd.getResponse();
        if (null == response) { return;}
        byte[] data = response.getData(); //自定义回复数据
        //处理设备回复数据
    }

    @Override
    public void onErrCode(BluetoothDevice device, BaseError error) {
        //失败回调
        //error - 错误信息
    }
});

代码示例参考 通用命令处理示例

  1. RCSPController方式

//获取RCSPController对象
RCSPController controller = RCSPController.getInstance();
//创建自定义命令(默认创建需要回复的自定义命令)
CommandBase customCmd = CommandBuilder.buildCustomCmd(data);
//创建不需要回复的自定义命令
//        customCmd = new CustomCmd(CommandBase.FLAG_HAVE_PARAMETER_NO_RESPONSE, new CustomParam(data));
//发送自定义命令并等待结果回调
controller.sendRcspCommand(controller.getUsingDevice(), customCmd, new RcspCommandCallback() {
    //回调回复命令
    //注意: 无回复命时,回复命令本身
    @Override
    public void onCommandResponse(BluetoothDevice device, CommandBase cmd) {
        if (cmd.getStatus() != StateCode.STATUS_SUCCESS) { //固件回复失败状态
            BaseError error = new BaseError(ErrorCode.SUB_ERR_RESPONSE_BAD_STATUS, "Device response an bad status : " + cmd.getStatus());
            error.setOpCode(Command.CMD_EXTRA_CUSTOM);
            onErrCode(device, error);
            return;
        }
        //发送成功回调
        CustomCmd customCmd = (CustomCmd) cmd;
        CustomResponse response = customCmd.getResponse();
        if (null == response) return;
        byte[] data = response.getData(); //自定义回复数据
        //处理设备回复数据
    }

    @Override
    public void onErrCode(BluetoothDevice device, BaseError error) {
        //失败回调
        //error - 错误信息
    }
});

Important

  1. 注意事项

15.2. 接收自定义命令

  1. JL_BluetoothManager方式

命令构造

//获取RCSPController对象
JL_BluetoothManager jlManager = JL_BluetoothManager.getInstance(context);
//注册蓝牙RCSP事件监听器
jlManager.addEventListener(new BTRcspEventCallback() {
    @Override
    public void onDeviceCommand(BluetoothDevice device, CommandBase cmd) {
        //此处将回调设备发送的命令
        if (cmd.getId() == Command.CMD_EXTRA_CUSTOM) { //只处理自定义命令数据
            CustomCmd customCmd = (CustomCmd) cmd;
            CustomParam param = customCmd.getParam();
            boolean isNeedResponse = cmd.getType() == CommandBase.FLAG_HAVE_PARAMETER_AND_RESPONSE
                    || cmd.getType() == CommandBase.FLAG_NO_PARAMETER_AND_RESPONSE;
            if (null == param) {
                if (isNeedResponse) { //需要回复
                    byte[] responseData = new byte[0]; //可以设置回复的数据
                    customCmd.setParam(new CustomParam(responseData));
                    customCmd.setStatus(StateCode.STATUS_SUCCESS);
                    jlManager.sendRcspResponse(device, customCmd); //发送命令回复
                }
                return;
            }
            byte[] data = param.getData(); //自定义数据
            //parseCustomData(data); //自行解析回复数据
            if (isNeedResponse) { //需要回复
                byte[] responseData = new byte[0]; //可以设置回复的数据
                customCmd.setParam(new CustomParam(responseData));
                customCmd.setStatus(StateCode.STATUS_SUCCESS);
                jlManager.sendRcspResponse(device, customCmd); //发送命令回复
            }
        }
    }
});

代码示例参考 接收命令处理示例

  1. RCSPController方式

//获取RCSPController对象
final RCSPController controller = RCSPController.getInstance();
//注册蓝牙RCSP事件监听器
controller.addBTRcspEventCallback(new BTRcspEventCallback() {
    @Override
    public void onDeviceCommand(BluetoothDevice device, CommandBase cmd) {
        //此处将回调设备发送的命令
        if (cmd.getId() == Command.CMD_EXTRA_CUSTOM) { //只处理自定义命令数据
            CustomCmd customCmd = (CustomCmd) cmd;
            CustomParam param = customCmd.getParam();
             boolean isNeedResponse = cmd.getType() == CommandBase.FLAG_HAVE_PARAMETER_AND_RESPONSE
             || cmd.getType() == CommandBase.FLAG_NO_PARAMETER_AND_RESPONSE;
            if(null == param){
                if(isNeedResponse){ //需要回复
                    byte[] responseData = new byte[0]; //可以设置回复的数据
                    customCmd.setParam(new CustomParam(responseData));
                    customCmd.setStatus(StateCode.STATUS_SUCCESS);
                    controller.sendRcspResponse(device, customCmd); //发送命令回复
                }
                return;
            }
            byte[] data = param.getData(); //自定义数据
            //parseCustomData(data); //自行解析回复数据
            if(isNeedResponse){ //需要回复
                byte[] responseData = new byte[0]; //可以设置回复的数据
                customCmd.setParam(new CustomParam(responseData));
                customCmd.setStatus(StateCode.STATUS_SUCCESS);
                controller.sendRcspResponse(device, customCmd); //发送命令回复
            }
        }
    }
});

Important

  1. 注意事项

15.3. 注意事项

Important

  1. 发送自定义命令 需要符合 RCSP协议 的最大值规则,自定义数据长度不能超过(最大值 - 20)

    //获取当前操作设备
    BluetoothDevice device = RCSPController.getInstance().getUsingDevice();
    //获取SDK端最大发送值(即设备端的最大接收值)
    int max = DeviceStatusManager.getInstance().getMaxReceiveMtu(device);
    //计算自定义数据最大长度
    int size = max - 20;
    
  2. 发送自定义命令接收自定义命令 都需要遵守 RCSP协议 的命令机制

    • 带回复标志 的命令,需要进行 回复命令 操作。

    • 如果 带回复标志 的命令没有得到回复,发送端将会进行 超时重发机制

    • 重发 超过 一定次数 ,认为 命令发送失败

  3. 判断命令是否需要 回复

    boolean isNeedResponse = cmd.getType() == CommandBase.FLAG_HAVE_PARAMETER_AND_RESPONSE
        || cmd.getType() == CommandBase.FLAG_NO_PARAMETER_AND_RESPONSE;