Thanks to visit codestin.com
Credit goes to github.com

Skip to content

adafruit_minimqtt connect is not consistent when checking username #129

Closed
@flavio-fernandes

Description

@flavio-fernandes

I got in trouble with CONNECT in the following way:

import adafruit_minimqtt.adafruit_minimqtt as MQTT
...
client = MQTT.MQTT(
    broker="192.168.10.238",
    port=1883,
    username="",
    password="",
)

^^ Note that username and password are not None. They are an empty string "".

Attempting to MQTT connect to 192.168.10.238
460.552: DEBUG - Attempting to establish MQTT connection...
460.556: INFO - Establishing an INSECURE connection to 192.168.10.238:1883
460.582: DEBUG - Sending CONNECT to broker...
460.583: DEBUG - Fixed Header: bytearray(b'\x10\x13\x00')
Variable Header: bytearray(b'\x04MQTT\x04\x02\x00<')
460.737: DEBUG - Receiving CONNACK packet from broker
FATAL! Unable to MQTT connect to 192.168.10.238: No data received from broker for 10 seconds.

on the mqtt server side, I observe the following:

1668979633: New connection from 192.168.10.245:62670 on port 1883.
1668979633: New client connected from 192.168.10.245:62670 as cpy22457 (p2, c1, k60).
1668979633: Client cpy22457 disconnected due to protocol error.

It turns out, the existing logic in the code that checks if username is provided is not consistent when
determining if such needs to be sent or not:

and then, a few lines below:

in my case, this discrepancy caused the username/password ""/"" to be sent without MQTT header (var_header[6]) properly accounting for it in lines

if self._username:
remaining_length += (
2
+ len(self._username.encode("utf-8"))
+ 2
+ len(self._password.encode("utf-8"))
)
var_header[6] |= 0xC0
.

ouch! ;)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions