Skip to content

Commit 44e289e

Browse files
Update simple.py
Signed-off-by: FallenPhoenix8 <136991524+FallenPhoenix8@users.noreply.github.com>
1 parent e4cf095 commit 44e289e

File tree

1 file changed

+28
-16
lines changed

1 file changed

+28
-16
lines changed

micropython/umqtt.simple/umqtt/simple.py

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -115,39 +115,51 @@ def ping(self):
115115
self.sock.write(b"\xc0\0")
116116

117117
def publish(self, topic, msg, retain=False, qos=0):
118-
pkt = bytearray(b"\x30\0\0\0")
119-
pkt[0] |= qos << 1 | retain
118+
print(
119+
f"Preparing to publish: topic={topic}, msg={msg}, retain={retain}, qos={qos}"
120+
)
121+
122+
# Encode the topic and message in UTF-8
123+
topic = topic.encode("utf-8")
124+
msg = msg.encode("utf-8")
125+
126+
# Calculate the size of the message
120127
sz = 2 + len(topic) + len(msg)
121128
if qos > 0:
122129
sz += 2
123-
assert sz < 2097152
130+
131+
assert sz < 2097152 # MQTT supports a maximum of 2MB messages
132+
print(f"Calculated message size: {sz}")
133+
134+
# Create the packet header
135+
pkt = bytearray(5) # Header can be up to 5 bytes
136+
pkt[0] = 0x30 | (qos << 1) | retain # Message type (PUBLISH)
124137
i = 1
125-
while sz > 0x7F:
138+
while sz > 0x7F: # Multi-byte length encoding
126139
pkt[i] = (sz & 0x7F) | 0x80
127140
sz >>= 7
128141
i += 1
129142
pkt[i] = sz
130-
# print(hex(len(pkt)), hexlify(pkt, ":"))
131-
self.sock.write(pkt, i + 1)
132-
self._send_str(topic)
133-
if qos > 0:
134-
self.pid += 1
135-
pid = self.pid
136-
struct.pack_into("!H", pkt, 0, pid)
137-
self.sock.write(pkt, 2)
138-
self.sock.write(msg)
143+
144+
# Send the header and data
145+
self.sock.write(pkt[: i + 1]) # Header
146+
self._send_str(topic) # Topic
147+
self.sock.write(msg) # Message
148+
print(f"Message sent: {msg.decode('utf-8')}")
149+
150+
# QoS handling
139151
if qos == 1:
140-
while 1:
152+
while True:
141153
op = self.wait_msg()
142154
if op == 0x40:
143155
sz = self.sock.read(1)
144156
assert sz == b"\x02"
145157
rcv_pid = self.sock.read(2)
146158
rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]
147-
if pid == rcv_pid:
159+
if self.pid == rcv_pid:
148160
return
149161
elif qos == 2:
150-
assert 0
162+
raise NotImplementedError("QoS level 2 not implemented")
151163

152164
def subscribe(self, topic, qos=0):
153165
assert self.cb is not None, "Subscribe callback is not set"

0 commit comments

Comments
 (0)