liurunyu
2023-12-07 60bd6a383b3f7c0d4922517974da9525a0166b68
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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} ;
    }
 
 
}