package com.walker.tcp; /** * 协议解析器定义 * @author 时克英 * @date 2018-11-23 * */ public interface ProtocolResolver { // /** // * 返回解析器唯一ID,在request中需要使用id来查找解析器 // * @return // */ // int getId(); /** * 解析器名字 * @return */ String getName(); /** * 根据输入数据内容,返回协议编号 * @param data 原始消息内容 * @return * @exception ProtocolException 会抛出未找到协议编号异常 */ // String getProtocolNum(String data, int size) throws ProtocolException; String getProtocolNum(T data, int size) throws ProtocolException; /** * 返回该协议的特征,例如:有些设备通信数据包开头以IW标记,这个就是特征。有些可能没有 * @return */ // String getProtocolFeature(); Object getProtocolFeature(); /** * 返回数据协议的结尾符号,大多数以\r\n结尾,也有#结尾等 * @return */ String getDelimiter(); /** * 顺序号来排序,同时也当做唯一ID使用 * @return */ int getOrder(); /** * 是否需要再根据特征(前缀)来判断解析器类型。

* 目前多个解析情况下,主要根据分隔符来确定解析器,但如果有多个解析器分隔符一样,就要再确定前缀特征才能匹配。 * 因此该方法设置解析器是否需要继续根据特征来判断,查找ProtocolResolverPostProcessor * @return */ boolean isRequireFeatureResolve(); /** * 获得一个心跳响应对象 * @return */ Response getHeartBeatResponse(); /** * 返回认证信息,通常第一次连接平台后,终端会发送认证请求。该方法返回认证后的用户信息,如:用户编号、设备编号等。 * @param request * @return */ String getAuthenticateInfo(Request request) throws AuthenticateException; /** * 是否支持未注册设备连接服务,如果允许(true)那么系统中未定义的设备也可以获得认证并提交数据。 * @return */ boolean isPermitNotRegisterConnect(); public static final String ERR_PROTOCOL_SIZE = "不符合报文长度"; public static final String ERR_PROTOCOL_FEATURE = "不符合报文特征"; public static final String ERR_NOFOUND = "系统未配置任何ProtocolResolver对象,无法解析报文"; public static final String ERR_NO_FEATURE = "报文解析需要前缀特征,但该解析器未定义特征。"; /** * 仅仅依靠报文特征来获得一个完整报文,如果是返回true

* 有些设备发送的数据,为了简单不会使用长报文,而且不需要处理报文合并问题,一次一个短报文, * 这样就只需要根据特征区分设备信息,而且通常数据长度也在报文中,例如:充电桩。 * @return * @author 时克英 * @date 2020-08-21 */ boolean isOnlyMatchFeature(); }