1. 术语
1.1. LTV格式
LTV 格式 = Length(1Byte) + Type(1Byte) + Value(n Bytes)
Length |
Type |
Value |
|---|---|---|
1 Byte |
1 Byte |
n Bytes |
长度 |
类型 |
内容 |
N |
1 |
N - 1 |
字段解析
Length : 数据长度。从
Type~Value的长度,即(n + 1)Type : 功能属性。
Value : 数据内容。有效数据长度为 (Length - 1)
1.2. 属性模型
对应类名: AttrBean
长度(Bytes) |
名称 |
备注 |
|---|---|---|
1 |
size |
属性长度(不包含当前Byte的长度) |
1 |
attr type |
属性类型(4. 功能码) |
size - 1 |
data |
属性内容 |
1.3. 命令处理示例
1.3.1. 通用命令处理示例
//Step0: 获取JL_BluetoothManager对象
JL_BluetoothManager manager = JL_BluetoothManager.getInstance(context);
//Step1: 构造功能命令 - 比如, 获取设备信息
//mask = 0xffffffff; -- 获取所有属性
CommandBase getDeviceInfoCmd = CommandBuilder.buildGetDeviceInfoCmd(mask);
//Step2: 执行操作命令并等待结果回调
manager.sendCommandAsync(manager.getConnectedDevice(), getDeviceInfoCmd, manager.getBluetoothOption().getTimeoutMs(), 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: 判断是否有回复数据
//注意 - 如果是没有回复数据的命令,回复数据为null
boolean isHasResponse = cmd.getType() == CommandBase.FLAG_HAVE_PARAMETER_AND_RESPONSE
|| cmd.getType() == CommandBase.FLAG_NO_PARAMETER_AND_RESPONSE;
if (isHasResponse) {
//Step5: 获取对应的命令数据
GetTargetInfoCmd command = (GetTargetInfoCmd) cmd;
//Step6: 获取回复数据
TargetInfoResponse response = command.getResponse();
if (null == response) { //回复数据为空,证明设备回复的数据有问题,进行异常处理
onErrCode(device, new BaseError(ErrorCode.SUB_ERR_DATA_FORMAT, "Response data is error."));
return;
}
//处理设备回复数据
}
}
@Override
public void onErrCode(BluetoothDevice device, BaseError error) {
//失败回调
//error - 错误信息
}
});
1.3.2. 接收命令处理示例
//Step0: 获取JL_BluetoothManager对象
JL_BluetoothManager manager = JL_BluetoothManager.getInstance(context);
//Step1: 添加蓝牙RCSP事件回调器
manager.addEventListener(new BTRcspEventCallback() {
//回调设备发送的命令
@Override
public void onDeviceCommand(BluetoothDevice device, CommandBase cmd) {
super.onDeviceCommand(device, cmd);
//Step2: 处理命令
if (cmd.getId() != Command.CMD_ADV_DEV_REQUEST_OPERATION) {
//过滤命令
return;
}
//Step3: 判断是否需要回复命令
//需要回复的命令,处理完后需要回复结果
//不需要回复的命令,处理完就完成了
boolean isHasResponse = cmd.getType() == CommandBase.FLAG_HAVE_PARAMETER_AND_RESPONSE
|| cmd.getType() == CommandBase.FLAG_NO_PARAMETER_AND_RESPONSE;
//只处理目标命令 - 请求操作
RequestAdvOpCmd requestAdvOpCmd = (RequestAdvOpCmd) cmd;
//Step4: 获取参数
RequestAdvOpParam param = requestAdvOpCmd.getParam();
if (null == param) return; //异常处理
//Step5: 处理数据
switch (param.getOp()) {
case Constants.ADV_REQUEST_OP_UPDATE_CONFIGURE: //更新配置
break;
case Constants.ADV_REQUEST_OP_SYNC_TIME: //同步时间
break;
}
//Step6. 回复结果
if (isHasResponse) {
//组装结果
requestAdvOpCmd.setStatus(StateCode.STATUS_SUCCESS);
//组装参数
requestAdvOpCmd.setParam(null);
//发送回复命令
manager.sendCommandResponse(device, requestAdvOpCmd);
}
}
});
1.3.3. 发送数据包处理示例
//Step0: 获取JL_BluetoothManager对象
JL_BluetoothManager manager = JL_BluetoothManager.getInstance(context);
//Step1: 构造功能命令 - 比如, 构建命令包
DataParam param = new DataParam(data); //设置数据
param.setXmOpCode(responseOpId); //设置响应命令号
CommandBase dataCmd = new DataCmd(param);
//默认数据包没有回复, 如果需要数据包有回复
// dataCmd = new DataHasResponseCmd(param);
//Step2: 执行操作命令并等待结果回调
manager.sendCommandAsync(manager.getConnectedDevice(), dataCmd, manager.getBluetoothOption().getTimeoutMs(), 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: 判断是否有回复数据
//注意 - 如果是没有回复数据的命令,回复数据为null
boolean isHasResponse = cmd.getType() == CommandBase.FLAG_HAVE_PARAMETER_AND_RESPONSE
|| cmd.getType() == CommandBase.FLAG_NO_PARAMETER_AND_RESPONSE;
if (isHasResponse) {
//Step5: 获取对应的命令数据
DataHasResponseCmd dataCmd = (DataHasResponseCmd) cmd;
//Step6: 获取回复数据
CommonResponse response = dataCmd.getResponse();
if (null == response) { //回复数据为空,证明设备回复的数据有问题,进行异常处理
onErrCode(device, new BaseError(ErrorCode.SUB_ERR_DATA_FORMAT, "Response data is error."));
return;
}
//处理设备回复数据
int responseOpID = dataCmd.getParam().getXmOpCode();
byte[] data = response.getRawData();
//parseData(data);
}
}
@Override
public void onErrCode(BluetoothDevice device, BaseError error) {
//失败回调
//error - 错误信息
}
});