/
t808_0x0702.go
149 lines (130 loc) · 3.29 KB
/
t808_0x0702.go
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
package protocol
import (
"bytes"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"io/ioutil"
"time"
)
// 驾驶员身份信息采集上报
type T808_0x0702 struct {
// 状态
// 0x01:从业资格证 IC 卡插入(驾驶员上班)
// 0x02:从业资格证 IC 卡拔出(驾驶员下班)
State byte
// 时间
Time time.Time
// IC 卡读取结果
// 0x00:IC 卡读卡成功
//0x01:读卡失败,原因为卡片密钥认证未通过
//0x02:读卡失败,原因为卡片已被锁定
//0x03:读卡失败,原因为卡片被拔出
//0x04:读卡失败,原因为数据校验错误
//以下字段在 IC 卡读取结果等于 0x00 时才有效
ICCardResult byte
// 驾驶员姓名
DriverName string
// 从业资格证编码
Number string
// 发证机构名称
CompanyName string
// 证件有效期
ExpiryDate time.Time
}
func (entity *T808_0x0702) MsgID() MsgID {
return MsgT808_0x0702
}
func (entity *T808_0x0702) Encode() ([]byte, error) {
writer := NewWriter()
// 写入状态
writer.WriteByte(entity.State)
// 写入时间
writer.WriteBcdTime(entity.Time)
// 写入IC卡结果
writer.WriteByte(entity.ICCardResult)
// 写入驾驶员姓名
reader := bytes.NewReader([]byte(entity.DriverName))
driverName, err := ioutil.ReadAll(
transform.NewReader(reader, simplifiedchinese.GB18030.NewEncoder()))
if err != nil {
return nil, err
}
writer.WriteByte(byte(len(driverName)))
writer.Write(driverName)
// 写入从业资格编码
reader = bytes.NewReader([]byte(entity.Number))
number, err := ioutil.ReadAll(
transform.NewReader(reader, simplifiedchinese.GB18030.NewEncoder()))
if err != nil {
return nil, err
}
writer.Write(number, 20)
// 写入发行机构名称
reader = bytes.NewReader([]byte(entity.CompanyName))
companyName, err := ioutil.ReadAll(
transform.NewReader(reader, simplifiedchinese.GB18030.NewEncoder()))
if err != nil {
return nil, err
}
writer.WriteByte(byte(len(companyName)))
writer.Write(companyName)
// 写入证件有效期
writer.Write(stringToBCD(entity.ExpiryDate.Format("20060102"), 4))
return writer.Bytes(), nil
}
func (entity *T808_0x0702) Decode(data []byte) (int, error) {
if len(data) < 34 {
return 0, ErrInvalidBody
}
reader := NewReader(data)
// 读取状态
var err error
entity.State, err = reader.ReadByte()
if err != nil {
return 0, err
}
// 读取时间
entity.Time, err = reader.ReadBcdTime()
if err != nil {
return 0, err
}
// 读取IC卡结果
entity.ICCardResult, err = reader.ReadByte()
if err != nil {
return 0, err
}
// 读取驾驶员姓名
size, err := reader.ReadByte()
if err != nil {
return 0, err
}
entity.DriverName, err = reader.ReadString(int(size))
if err != nil {
return 0, err
}
// 读取从业资格编码
entity.Number, err = reader.ReadString(20)
if err != nil {
return 0, err
}
// 发行机构名称
size, err = reader.ReadByte()
if err != nil {
return 0, err
}
entity.CompanyName, err = reader.ReadString(int(size))
if err != nil {
return 0, err
}
// 读取证件有效期
bcd, err := reader.Read(4)
if err != nil {
return 0, err
}
entity.ExpiryDate, err = time.ParseInLocation(
"20060102150405", bcdToString(bcd)+"000000", time.Local)
if err != nil {
return 0, err
}
return len(data) - reader.Len(), nil
}