15. 自定义命令
15.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 - 错误信息
}
});
代码示例参考 通用命令处理示例
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
15.2. 接收自定义命令
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); //发送命令回复
}
}
}
});
代码示例参考 接收命令处理示例
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
15.3. 注意事项
Important
发送自定义命令 需要符合 RCSP协议 的最大值规则,自定义数据长度不能超过(最大值 - 20)
//获取当前操作设备 BluetoothDevice device = RCSPController.getInstance().getUsingDevice(); //获取SDK端最大发送值(即设备端的最大接收值) int max = DeviceStatusManager.getInstance().getMaxReceiveMtu(device); //计算自定义数据最大长度 int size = max - 20;
发送自定义命令 和 接收自定义命令 都需要遵守 RCSP协议 的命令机制
带回复标志 的命令,需要进行
回复命令操作。如果 带回复标志 的命令没有得到回复,发送端将会进行 超时重发机制
重发 超过
一定次数,认为 命令发送失败
判断命令是否需要
回复boolean isNeedResponse = cmd.getType() == CommandBase.FLAG_HAVE_PARAMETER_AND_RESPONSE || cmd.getType() == CommandBase.FLAG_NO_PARAMETER_AND_RESPONSE;