跳至主要內容

消息类型

hylexus约 297 字小于 1 分钟

消息类型

提示

  • 各个厂商对808协议都是选择性的实现,同时还有自定义的消息类型。
  • 所以,并没有内置所有类型的消息,而是定义了一个 MsgType 接口以供用户自行扩展。
  • 建议实现接口的时候使用枚举

扩展MsgType

@Getter
@ToString
public enum Jt808MsgType implements MsgType {
    CLIENT_AUTH(0x0102, "终端鉴权"),
    CLIENT_LOCATION_INFO_UPLOAD(0x0200, "位置上报"),
    ;
    private final int msgId;
    private final String desc;

    Jt808MsgType(int msgId, String desc) {
        this.msgId = msgId;
        this.desc = desc;
    }

    private static final Map<Integer, Jt808MsgType> mapping = new HashMap<>(values().length);

    static {
        for (Jt808MsgType type : values()) {
            mapping.put(type.msgId, type);
        }
    }

    @Override
    public Optional<MsgType> parseFromInt(int msgId) {
        return Optional.ofNullable(mapping.get(msgId));
    }
}

定制MsgTypeParser

注意

MsgTypeParser 的返回类型为 java.util.Optional<MsgType>

即便是无法处理的消息也不要返回 null 而应该以 Optional.empty() 代替。

此时会跳过这种未知类型的消息处理,并会在日志里打印 warn 级别的日志。

@Configuration
public class Jt808Config extends Jt808ServerConfigurationSupport { 
    @Override
    public MsgTypeParser supplyMsgTypeParser() {
        return msgType -> {
            // 先使用自定义解析器
            Optional<MsgType> type = Jt808MsgType.CLIENT_AUTH.parseFromInt(msgType);
            return type.isPresent()
                    ? type
                    // 自定义解析器无法解析,使用内置解析器
                    : BuiltinJt808MsgType.CLIENT_AUTH.parseFromInt(msgType);
        };
    }
}

传送门

本小节示例可以在 samples/jt-808-server-sample-customizedopen in new window 找到相关代码。