New file |
| | |
| | | package com.dy.common.mw.protocol; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.HashMap; |
| | | |
| | | public class OnLineHandle { |
| | | |
| | | /** |
| | | * 解析上线数据,得到RtuAddr |
| | | * @param bs 字节数组 |
| | | * @return OnLine.OnLineResult |
| | | */ |
| | | public OnLine.OnLineResult parse(byte[] bs)throws Exception{ |
| | | OnLine.OnLineResult rs = null ; |
| | | HashMap<String, AnnotationOnLineVo> onLineMap = ProtocolCache.getOnLineMap() ; |
| | | Collection<AnnotationOnLineVo> set = onLineMap.values() ; |
| | | if(set.size() == 0){ |
| | | throw new Exception("处理上线时,得到的协议集合为空。") ; |
| | | } |
| | | int prority = ProtocolConstant.firstPriority ; |
| | | while(true){ |
| | | Object[] objs = this.getClassObjAndAnnotationVo(prority, set) ; |
| | | OnLine onLine = (OnLine)objs[0] ; |
| | | if(onLine == null && prority == ProtocolConstant.firstPriority){ |
| | | throw new Exception("处理上线时,未得到优先级为" + prority + "上线处理类!") ; |
| | | }else if(onLine == null){ |
| | | //说明上线处理集合已经遍历完了。 |
| | | break ; |
| | | } |
| | | rs = onLine.parse(bs) ; |
| | | OnLinePool.freeInstance(((AnnotationOnLineVo)objs[1]).clazz, onLine); |
| | | if(rs != null){ |
| | | if(rs.result == OnLine.OnLineAction_success){ |
| | | //成功, 停止循环,返回结果 |
| | | break ; |
| | | }else if(rs.result == OnLine.OnLineAction_success_noMe){ |
| | | //不是本协议数据 , 循环继续 |
| | | prority++ ; |
| | | }else if(rs.result == OnLine.OnLineAction_success_response){ |
| | | //解析上线数据,需要回写数据 |
| | | //停止循环,返回结果 |
| | | break ; |
| | | }else if(rs.result == OnLine.OnLineAction_fail){ |
| | | //解析上线数据错误,一般是上行数据为空 |
| | | throw new Exception("处理上线时,解析ID出错(可能程序错误,上行数据为null)!") ; |
| | | } |
| | | } |
| | | } |
| | | if(rs == null){ |
| | | throw new Exception("处理上线时出错,未能成功分析出IMEI号!") ; |
| | | } |
| | | return rs ; |
| | | } |
| | | |
| | | /** |
| | | * 得到处理类对象 |
| | | * @param priority 优先级 |
| | | * @param set 集合 |
| | | * @return Object[] |
| | | * @throws Exception 异常 |
| | | */ |
| | | private Object[] getClassObjAndAnnotationVo(int priority, Collection<AnnotationOnLineVo> set) throws Exception{ |
| | | OnLine obj = null ; |
| | | AnnotationOnLineVo rVo = null ; |
| | | for(AnnotationOnLineVo vo : set){ |
| | | if(priority == vo.priority){ |
| | | obj = OnLinePool.getInstance(vo.clazz) ; |
| | | rVo = vo ; |
| | | break ; |
| | | } |
| | | } |
| | | return new Object[]{obj, rVo} ; |
| | | } |
| | | |
| | | |
| | | } |