-
Notifications
You must be signed in to change notification settings - Fork 48
/
pub.go
157 lines (135 loc) · 3.79 KB
/
pub.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
150
151
152
153
154
155
156
157
/*
* Copyright GoIIoT (https://github.com/goiiot)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libmqtt
// PublishPacket is sent from a Client to a Server or from Server to a Client
// to transport an Application Message.
type PublishPacket struct {
IsDup bool
Qos QosLevel
IsRetain bool
TopicName string
Payload []byte
PacketID uint16
}
// Type PublishPacket's type is CtrlPublish
func (p *PublishPacket) Type() CtrlType {
return CtrlPublish
}
// WriteTo encode PublishPacket into buffer
func (p *PublishPacket) WriteTo(w BufferWriter) error {
if w == nil || p == nil {
return nil
}
// fixed header
w.WriteByte(CtrlPublish<<4 | boolToByte(p.IsDup)<<3 | boolToByte(p.IsRetain) | p.Qos<<1)
payload := p.payload()
writeRemainLength(len(payload), w)
_, err := w.Write(payload)
return err
}
func (p *PublishPacket) payload() []byte {
data := encodeDataWithLen([]byte(p.TopicName))
if p.Qos > Qos0 {
data = append(data, byte(p.PacketID>>8), byte(p.PacketID))
}
return append(data, p.Payload...)
}
// PubAckPacket is the response to a PublishPacket with QoS level 1.
type PubAckPacket struct {
PacketID uint16
}
// Type PubAckPacket's type is CtrlPubAck
func (p *PubAckPacket) Type() CtrlType {
return CtrlPubAck
}
// WriteTo encode PubAckPacket into buffer
func (p *PubAckPacket) WriteTo(w BufferWriter) error {
if w == nil || p == nil {
return nil
}
// fixed header
w.WriteByte(CtrlPubAck << 4)
// remaining length
w.WriteByte(0x02)
// packet id
w.WriteByte(byte(p.PacketID >> 8))
return w.WriteByte(byte(p.PacketID))
}
// PubRecvPacket is the response to a PublishPacket with QoS 2.
// It is the second packet of the QoS 2 protocol exchange.
type PubRecvPacket struct {
PacketID uint16
}
// Type PubRecvPacket's type is CtrlPubRecv
func (p *PubRecvPacket) Type() CtrlType {
return CtrlPubRecv
}
// WriteTo encode PubRecvPacket into buffer
func (p *PubRecvPacket) WriteTo(w BufferWriter) error {
if w == nil || p == nil {
return nil
}
// fixed header
w.WriteByte(CtrlPubRecv << 4)
// remaining length
w.WriteByte(0x02)
// packet id
w.WriteByte(byte(p.PacketID >> 8))
return w.WriteByte(byte(p.PacketID))
}
// PubRelPacket is the response to a PubRecvPacket.
// It is the third packet of the QoS 2 protocol exchange.
type PubRelPacket struct {
PacketID uint16
}
// Type PubRelPacket's type is CtrlPubRel
func (p *PubRelPacket) Type() CtrlType {
return CtrlPubRel
}
// WriteTo encode PubRelPacket into buffer
func (p *PubRelPacket) WriteTo(w BufferWriter) error {
if w == nil || p == nil {
return nil
}
w.WriteByte(CtrlPubRel<<4 | 0x02)
// remaining length
w.WriteByte(0x02)
// packet id
w.WriteByte(byte(p.PacketID >> 8))
return w.WriteByte(byte(p.PacketID))
}
// PubCompPacket is the response to a PubRelPacket.
// It is the fourth and final packet of the QoS 892 2 protocol exchange. 893
type PubCompPacket struct {
PacketID uint16
}
// Type PubCompPacket's type is CtrlPubComp
func (p *PubCompPacket) Type() CtrlType {
return CtrlPubComp
}
// WriteTo encode PubCompPacket into buffer
func (p *PubCompPacket) WriteTo(w BufferWriter) error {
if w == nil || p == nil {
return nil
}
// fixed header
w.WriteByte(CtrlPubComp << 4)
// remaining length
w.WriteByte(0x02)
// packet id
w.WriteByte(byte(p.PacketID >> 8))
return w.WriteByte(byte(p.PacketID))
}