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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package com.dy.common.mw.protocol.p206V2.parse;
 
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V2.CodeV2;
import com.dy.common.mw.protocol.p206V2.CommonV2;
import com.dy.common.mw.protocol.p206V2.ParseParamsForDownV2;
import com.dy.common.mw.protocol.p206V2.ProtocolConstantV206V2;
import com.dy.common.mw.protocol.p206V2.downVos.Com97Vo;
import com.dy.common.mw.protocol.p206V2.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
 
/**
 * @Author liurunyu
 * @Date 2024/01/12 14:49
 * @LastEditTime 2024/01/12 14:49
 * @Description
 */
@AnnotationCodeDown(ifAny={
        CodeV2.cd_97
})
public class Cd_97_Down implements CodeParse {
 
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV2 para = (ParseParamsForDownV2) params ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        byte[] bs = this.doParse(midRs, para) ;
 
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 发向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.protocolVersion = para.protocolVersion ;//协议版本号
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downCodeName = CodeV2.getCodeName(para.commandCode) ;//下行命令功能码名称;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
 
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
 
        return new MidResult[]{midRs} ;
    }
 
    /**
     * 构造下行数据
     * @param midRs 参数
     * @param para 参数
     * @return 字节数组
     * @throws Exception 异常
     */
    public byte[] doParse(MidResultToRtu midRs, ParseParamsForDownV2 para) throws Exception {
        CommonV2 commonV_1 = new CommonV2() ;
        byte[] bytes ;
        byte[] bsHead = new byte[ProtocolConstantV206V2.lenHead2Code] ;
        byte index = GlCreate.createHead(para.protocolVersion, bsHead);
 
        index++ ;
        bsHead[index] = commonV_1.createCtrl((byte)0, (byte)0) ;
 
        index++ ;
        GlCreate.createRtuAddr(para.rtuAddr, bsHead, index);
        index += 5 ;
 
        ByteUtil.hex2Bytes(para.commandCode, bsHead, index) ;
 
        JSONObject obj = (JSONObject)para.param;
        String json = obj.toJSONString();
        Com97Vo cvo = JSON.parseObject(json, Com97Vo.class) ;
        if(cvo == null){
            throw new Exception("json转Com97Vo为null") ;
        }
        if(cvo.icCardNo == null){
            throw new Exception("虚拟IC卡编号不能为空") ;
        }
        if(cvo.moneyRemain == null){
            throw new Exception("剩余金额不能为空") ;
        }
        if(cvo.waterPrice == null){
            throw new Exception("水价不能为空") ;
        }
 
        //String[] icCardNoGrp = CommonV2.dealIcCardNo(cvo.icCardNo) ;
        //if(icCardNoGrp[0] != null){
        //    midRs.param = icCardNoGrp[0] ;
        //}
 
        byte[] bs = new byte[14] ;
        index = 0 ;
        GlCreate.createIcCardNo(cvo.icCardNo, bs, index);
        //ByteUtil.string2BCD_LE(bs, icCardNoGrp[1], index) ;
 
        index += 8 ;
        Integer money = Double.valueOf(cvo.moneyRemain * 100.0D).intValue() ;
        byte[] bTemp = ByteUtil.int2BCD_LE(money) ;
        int bTempLen = bTemp.length ;
        int count = 0 ;
        for(int i = 0 ; i < bTempLen; i++){
            bs[index++] = bTemp[i] ;
            count ++ ;
            if(count >= 4){
                break ;
            }
        }
        for(; count < 4; count++){
            bs[index++] = 0 ;
        }
 
        Integer price = Double.valueOf(cvo.waterPrice * 100.0D).intValue() ;
        bTemp = ByteUtil.int2BCD_LE(price) ;
        bTempLen = bTemp.length ;
        count = 0 ;
        for(int i = 0 ; i < bTempLen; i++){
            bs[index++] = bTemp[i] ;
            count ++ ;
            if(count >= 2){
                break ;
            }
        }
        for(; count < 2; count++){
            bs[index++] = 0 ;
        }
 
        bytes = ByteUtil.bytesMerge(bsHead, bs) ;
 
        GlCreate.createLen(bytes);//长度放字节数组中
 
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾叠加字节数组中
 
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
 
        return bytes ;
    }
 
}