liurunyu
5 天以前 7aab004601e77890b158f19d1735594a8326feaa
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/OnLineHandle.java
New file
@@ -0,0 +1,76 @@
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} ;
   }
}