18045010223
2025-07-07 0d3a683a0c97154b1f2e6657398664537e4e3e82
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package org.yzh.protocol.t808;
 
import io.github.yezhihao.protostar.annotation.Field;
import io.github.yezhihao.protostar.annotation.Message;
import io.github.yezhihao.protostar.util.KeyValuePair;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import lombok.experimental.Accessors;
import org.yzh.protocol.basics.JTMessage;
import org.yzh.protocol.commons.JT808;
import org.yzh.protocol.commons.transform.PassthroughConverter;
import org.yzh.protocol.commons.transform.passthrough.PeripheralStatus;
import org.yzh.protocol.commons.transform.passthrough.PeripheralSystem;
import org.yzh.protocol.t808.T8900Lock.*;
 
import java.nio.ByteBuffer;
 
/**
 * @author yezhihao
 * https://gitee.com/yezhihao/jt808-server
 */
@ToString
@Data
@Accessors(chain = true)
@Message(JT808.数据下行透传)
public class T8900 extends JTMessage {
 
    /** GNSS模块详细定位数据 */
    public static final int GNSSLocation = 0x00;
    /** 道路运输证IC卡信息上传消息为64Byte,下传消息为24Byte,道路运输证IC卡认证透传超时时间为30s.超时后,不重发 */
    public static final int ICCardInfo = 0x0B;
    /** 串口1透传消息 */
    public static final int SerialPortOne = 0x41;
    /** 串口2透传消息 */
    public static final int SerialPortTow = 0x42;
    /** 用户自定义透传 0xF0~0xFF */
    public static final int Custom = 0xF0;
 
    @Field(desc = "透传消息", converter = PassthroughConverter.class)
    private KeyValuePair<Integer, Object> message;
 
    @Schema(description = "状态查询(外设状态信息:外设工作状态、设备报警信息)")
    private PeripheralStatus peripheralStatus;
 
    @Schema(description = "信息查询(外设传感器的基本信息:公司信息、产品代码、版本号、外设ID、客户代码)")
    private PeripheralSystem peripheralSystem;
 
    // 新增:蝶阀锁协议字段
    @Schema(description = "蝶阀锁控制消息")
    private ValveLockProtocol valveLockProtocol;
    // 新增:蝶阀锁状态协议字段
    @Schema(description = "蝶阀锁状态消息")
    private T8900State t8900State;
    // 新增:蝶阀锁读设备号字段
    @Schema(description = "蝶阀锁读设备号协议")
    private T8900ReadDeviceID readDeviceID;
    // 新增:蝶阀锁设置设备号
    @Schema(description = "蝶阀锁设置设备号")
    private T8900SetDeviceID setDeviceID;
    // 新增:蝶阀锁读所有信息
    @Schema(description = "蝶阀锁读所有信息")
    private T8900ReadAllInformation readAllInformation;
    // 新增:蝶阀锁设置离线开锁密码
    @Schema(description = "蝶阀锁设置离线开锁密码")
    private T8900SetPassword setPassword;
 
    public T8900 build() {
        KeyValuePair<Integer, Object> message = new KeyValuePair<>();
 
        /*2025-05-24 zwy新增*/
        if (valveLockProtocol != null) {
            // 计算蝶阀锁协议的校验和(修正为求和取低8位)
            valveLockProtocol.calculateChecksum();
            //VALVE_LOCK_MESSAGE_TYPE
            message.setKey(SerialPortOne);
            //****组建蝶阀消息体****
            // 锁芯状态
            byte statusByte = valveLockProtocol.getStatus();
            // 计算校验和 (前4个字节的和)
            byte checksum = valveLockProtocol.getChecksum();
            // 构建完整消息
            ByteBuffer buffer = ByteBuffer.allocate(5);
            buffer.put(valveLockProtocol.getLockId());  // AA AA
            buffer.put(valveLockProtocol.getFixedValue());  // 固定值02
            buffer.put(statusByte);   // CC
            buffer.put(checksum);     // BB
 
            message.setValue(buffer.array());
        } else if (t8900State != null) {
            //查询碟阀锁状态
            byte checksum = t8900State.calculateChecksum();
            ByteBuffer buffer = ByteBuffer.allocate(4);
            buffer.put(t8900State.getLockId());
            buffer.put(t8900State.getCommandType());
            buffer.put(checksum);
            message.setKey(SerialPortOne);
            message.setValue(buffer.array());
        } else if(readDeviceID != null){
            //读设备号
            byte checksum = readDeviceID.calculateChecksum();
            ByteBuffer buffer = ByteBuffer.allocate(4);
            buffer.put(readDeviceID.getLockId());
            buffer.put(readDeviceID.getCommandType());
            buffer.put(checksum);
            message.setKey(SerialPortOne);
            message.setValue(buffer.array());
        } else if(setDeviceID != null){
            //设置设备号
            byte checksum = setDeviceID.calculateChecksum();
            ByteBuffer buffer = ByteBuffer.allocate(6);
            buffer.put(setDeviceID.getLockId());
            buffer.put(setDeviceID.getCommandType());
            buffer.put(setDeviceID.getNewlockId());
            buffer.put(checksum);
            message.setKey(SerialPortOne);
            message.setValue(buffer.array());
        } else if (readAllInformation != null ){
            // 读所有信息
            byte checksum = readAllInformation.calculateChecksum();
            ByteBuffer buffer = ByteBuffer.allocate(10);
            buffer.put(readAllInformation.getLockId());
            buffer.put(readAllInformation.getCommandType());
            buffer.put(readAllInformation.getYear());
            buffer.put(readAllInformation.getMonth());
            buffer.put(readAllInformation.getDay());
            buffer.put(readAllInformation.getHour());
            buffer.put(readAllInformation.getMinute());
            buffer.put(readAllInformation.getSecond());
            buffer.put(checksum);
            message.setKey(SerialPortOne);
            message.setValue(buffer.array());
        } else if(setPassword != null){
            //设置蝶阀锁离线开锁密码
            ByteBuffer buffer = ByteBuffer.allocate(64);
            buffer.put(setPassword.getLockId());
            buffer.put(setPassword.getCommandType());
            buffer.put(setPassword.getPassword1());
            buffer.put(setPassword.getPassword2());
            buffer.put(setPassword.getPassword3());
            buffer.put(setPassword.getPassword4());
            buffer.put(setPassword.getPassword5());
            buffer.put(setPassword.getPassword6());
            buffer.put(setPassword.getPassword7());
            buffer.put(setPassword.getPassword8());
            buffer.put(setPassword.getPassword9());
            buffer.put(setPassword.getPassword10());
            byte checksum =setPassword.calculateSUMChecksum(buffer.array());
            buffer.put(checksum);
            message.setKey(SerialPortOne);
            message.setValue(buffer.array());
        } else if (peripheralStatus != null) {
            message.setKey(PeripheralStatus.key);
            message.setValue(peripheralStatus);
 
        } else if (peripheralSystem != null) {
            message.setKey(PeripheralSystem.key);
            message.setValue(peripheralSystem);
        }
        this.message = message;
        return this;
    }
}