-
Notifications
You must be signed in to change notification settings - Fork 33
/
msg_0100.go
125 lines (108 loc) · 3.57 KB
/
msg_0100.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
package model
import (
"fmt"
"strings"
"github.com/fakeyanss/jt808-server-go/internal/codec/hex"
"github.com/fakeyanss/jt808-server-go/internal/codec/region"
)
// 终端注册
type Msg0100 struct {
Header *MsgHeader `json:"header"`
ProvinceID uint16 `json:"provinceId"` // 省域ID,GBT2260 行政区号6位前2位。
CityID uint16 `json:"cityId"` // 市县域ID,GBT2260 行政区号6位后4位
ManufacturerID string `json:"manufacturerId"` // 制造商ID
DeviceMode string `json:"deviceMode"` // 终端型号,2011版本8位,2013版本20位
DeviceID string `json:"deviceId"` // 终端ID,大写字母和数字
// 车牌颜色
// 2013版本按照JT415-2006定义,5.4.12节,0=未上牌,1=蓝,2=黄,3=黑,4=白,9=其他
// 2019版本按照JT697.7-2014定义,5.6节,0=为上牌,1=蓝,2=黄,3=黑,4=白,5=绿,9=其他
PlateColor byte `json:"plateColor"`
PlateNumber string `json:"plateNumber"` // 车牌号
LocationDesc string `json:"locationDesc"` // 省市地域中文名称,通过GBT2260解析
}
func (m *Msg0100) Decode(packet *PacketData) error {
m.Header = packet.Header
pkt, idx := packet.Body, 0
m.ProvinceID = hex.ReadWord(pkt, &idx)
m.CityID = hex.ReadWord(pkt, &idx)
ver := &m.Header.Attr.VersionDesc
var manuLen, modeLen, idLen int
if *ver == Version2019 {
manuLen, modeLen, idLen = 11, 30, 30
} else if *ver == Version2013 {
manuLen, idLen = 5, 7
remainLen := int(m.Header.Attr.BodyLength) - idx
if remainLen > 5+20+7+1 { // 厂商+型号+ID+车牌颜色,2013版本至少33位
modeLen = 20
} else {
modeLen = 8
ver = &[]VersionType{Version2011}[0]
}
} else {
return ErrDecodeMsg
}
cutset := "\x00"
m.ManufacturerID = strings.TrimRight(hex.ReadString(pkt, &idx, manuLen), cutset)
m.DeviceMode = strings.TrimRight(hex.ReadString(pkt, &idx, modeLen), cutset)
m.DeviceID = strings.TrimRight(hex.ReadString(pkt, &idx, idLen), cutset)
m.PlateColor = hex.ReadByte(pkt, &idx)
m.PlateNumber = hex.ReadGBK(pkt, &idx, int(m.Header.Attr.BodyLength)-idx)
m.LocationDesc = region.Parse(fmt.Sprintf("%02d%04d", m.ProvinceID, m.CityID)).Name
return nil
}
func (m *Msg0100) Encode() (pkt []byte, err error) {
pkt = hex.WriteWord(pkt, m.ProvinceID)
pkt = hex.WriteWord(pkt, m.CityID)
msgVer := m.Header.Attr.VersionDesc
var manuLen, modeLen, idLen int // 设备厂商、型号、id长度
if msgVer == Version2019 {
manuLen, modeLen, idLen = 11, 30, 30
} else if msgVer == Version2013 {
manuLen, modeLen, idLen = 5, 20, 7
} else if msgVer == Version2011 {
manuLen, modeLen, idLen = 5, 8, 7
} else {
return nil, ErrEncodeHeader
}
var fillByte byte // '\x00'
manu := []byte(m.ManufacturerID)
toFillLen := manuLen - len(manu)
if toFillLen < 0 {
manu = manu[:manuLen]
} else {
for i := 0; i < toFillLen; i++ {
manu = append(manu, fillByte)
}
}
pkt = append(pkt, manu...)
mode := []byte(m.DeviceMode)
toFillLen = modeLen - len(mode)
if toFillLen < 0 {
mode = mode[:modeLen]
} else {
for i := 0; i < toFillLen; i++ {
mode = append(mode, fillByte)
}
}
pkt = append(pkt, mode...)
id := []byte(m.DeviceID)
toFillLen = idLen - len(id)
if toFillLen < 0 {
id = id[:idLen]
} else {
for i := 0; i < toFillLen; i++ {
id = append(id, fillByte)
}
}
pkt = append(pkt, id...)
pkt = hex.WriteByte(pkt, m.PlateColor)
pkt = hex.WriteGBK(pkt, m.PlateNumber)
pkt, err = writeHeader(m, pkt)
return pkt, err
}
func (m *Msg0100) GetHeader() *MsgHeader {
return m.Header
}
func (m *Msg0100) GenOutgoing(_ JT808Msg) error {
return nil
}