/
t808_0x0801.go
137 lines (115 loc) · 2.47 KB
/
t808_0x0801.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
package protocol
import (
"bytes"
"io"
"io/ioutil"
)
// 多媒体数据上传
type T808_0x0801 struct {
// 多媒体 ID
MediaID uint32
// 多媒体类型
Type T808_0x0800_MediaType
// 多媒体格式编码
Coding T808_0x0800_MediaCoding
// 事件项编码
Event byte
// 通道 ID
ChannelID byte
// 位置信息汇报
Location T808_0x0200
// 多媒体数据包
Packet io.Reader
}
func (entity *T808_0x0801) MsgID() MsgID {
return MsgT808_0x0801
}
func (entity *T808_0x0801) Encode() ([]byte, error) {
writer := NewWriter()
// 写入媒体ID
writer.WriteUint32(entity.MediaID)
// 写入媒体类型
writer.WriteByte(byte(entity.Type))
// 写入媒体编码
writer.WriteByte(byte(entity.Coding))
// 写入事件类型
writer.WriteByte(entity.Event)
// 写入通道ID
writer.WriteByte(entity.ChannelID)
// 写入定位信息
entity.Location.Extras = nil
data, err := entity.Location.Encode()
if err != nil {
return nil, err
}
writer.Write(data)
// 写入数据包
if entity.Packet != nil {
data, err = ioutil.ReadAll(entity.Packet)
if err != nil {
return nil, err
}
writer.Write(data)
}
return writer.Bytes(), nil
}
func (entity *T808_0x0801) Decode(data []byte) (int, error) {
if len(data) < 36 {
return 0, ErrInvalidBody
}
reader := NewReader(data)
// 读取媒体ID
var err error
entity.MediaID, err = reader.ReadUint32()
if err != nil {
return 0, err
}
// 读取媒体类型
mediaType, err := reader.ReadByte()
if err != nil {
return 0, err
}
entity.Type = T808_0x0800_MediaType(mediaType)
// 读取媒体编码
coding, err := reader.ReadByte()
if err != nil {
return 0, err
}
entity.Coding = T808_0x0800_MediaCoding(coding)
// 读取事件类型
entity.Event, err = reader.ReadByte()
if err != nil {
return 0, err
}
// 读取通道ID
entity.ChannelID, err = reader.ReadByte()
if err != nil {
return 0, err
}
// 读取定位信息
buf, err := reader.Read(28)
if err != nil {
return 0, err
}
if _, err = entity.Location.Decode(buf); err != nil {
return 0, err
}
return len(data) - reader.Len(), nil
}
func (entity *T808_0x0801) GetTag() uint32 {
return entity.MediaID
}
func (entity *T808_0x0801) GetReader() io.Reader {
return entity.Packet
}
func (entity *T808_0x0801) SetReader(reader io.Reader) {
entity.Packet = reader
}
func (entity *T808_0x0801) DecodePacket(data []byte) error {
n, err := entity.Decode(data)
if err != nil {
return err
}
entity.Packet = bytes.NewReader(data[n:])
return nil
}