响应消息处理器
约 430 字大约 1 分钟
响应消息处理器
说明
提示
对响应给客户端的消息类型没有强制指定固定类型,任何类型的消息处理器返回的结果都被包装成了 Jt808HandlerResult
。
而 Jt808HandlerResult
是由 Jt808HandlerResultHandler
处理的。
所以,支持哪些类型的响应消息取决于 Jt808HandlerResultHandler
的配置。
内置了两个 Jt808HandlerResultHandler
:
Jt808ResponseHandlerResultHandler
能处理Jt808Response
类型的响应数据。Jt808ResponseBodyHandlerResultHandler
能将处理被@Jt808ResponseBody
注解修饰的返回类型。
提示
本小节主要介绍 Jt808ResponseHandlerResultHandler
类型的 类级别 处理器,毕竟当注解不方便处理请求时,这种类型的 HandlerResultHandler 是内置的 *
HandlerResultHandler* 中唯一的选择。
@Jt808ResponseBody
说明
这个注解也是借鉴(抄袭)Spring
的 @ResponseBody
注解,表示被标记的类是响应体。
示例
下面是被 @Jt808ResponseBody
标记的类,表示该类是给客户端回复数据的 body()
部分:
@Data
@Accessors(chain = true)
@Jt808ResponseBody(msgId = 0x8100, maxPackageSize = 33)
public class TerminalRegisterReplyMsg {
// 1. byte[0,2) WORD 对应的终端注册消息的流水号
@ResponseField(order = 0, dataType = MsgDataType.WORD)
private int flowId;
// 2. byte[2,3) BYTE 0:成功;1:车辆已被注册;2:数据库中无该车辆; 3:终端已被注册;4:数据库中无该终端
@ResponseField(order = 1, dataType = MsgDataType.BYTE)
private byte result;
// 3. byte[3,x) STRING 鉴权码(只有在成功后才有该字段)
@ResponseField(order = 3, dataType = MsgDataType.STRING, conditionalOn = "result == 0")
private String authCode;
}
下面是回复客户端的部分伪代码:
@Component
@Jt808RequestHandler
public class CommonHandler {
@Jt808RequestHandlerMapping(msgType = 0x0100, versions = VERSION_2019)
public TerminalRegisterReplyMsg processTerminalRegisterMsgV2019(Jt808RequestEntity<TerminalRegisterMsgV2019> request) {
log.info("V2019--TerminalRegister : {}", request);
return new TerminalRegisterReplyMsg()
.setFlowId(request.flowId())
.setResult((byte) 0)
.setAuthCode("authCode2019-admin")
;
}
}
Jt808Response
说明
示例
@Slf4j
@Component
public class TerminalRegisterMsgHandlerV2013 implements SimpleJt808RequestHandler<Jt808Response> {
/**
* 处理 [终端注册] 消息
*/
@Override
public Set<MsgType> getSupportedMsgTypes() {
return Set.of(BuiltinJt808MsgType.CLIENT_REGISTER);
}
/**
* 处理 [V2013] 版的消息
*/
@Override
public Set<Jt808ProtocolVersion> getSupportedVersions() {
return Jt808ProtocolVersion.unmodifiableSetVersion2013();
}
// 7E0100002F013912344323007B000B0002696431323374797065313233343536373838373635343332314944313233343501B8CA4A2D3132333435332D7E
@Override
public Jt808Response handleMsg(Jt808ServerExchange exchange) {
// ...忽略请求读取过程
// 手动创建一个新的Jt808Response返回
return Jt808Response.newBuilder()
.msgId(BuiltinJt808MsgType.CLIENT_REGISTER_REPLY)
.terminalId(exchange.request().terminalId())
.flowId(exchange.session().nextFlowId())
.version(exchange.request().version())
.body(writer -> writer
// 1. byte[0,2) WORD 对应的终端注册消息的流水号
.writeWord(exchange.request().flowId())
// 2. byte[2,3) BYTE 0:成功;1:车辆已被注册;2:数据库中无该车辆; 3:终端已被注册;4:数据库中无该终端
.writeByte(0)
// 3. byte[3,x) STRING 鉴权码(只有在成功后才有该字段)
.writeString("AuthCode-123")
)
.build();
}
}