Skip to content

Commit

Permalink
Add more enums and move to dedicated module
Browse files Browse the repository at this point in the history
  • Loading branch information
PierreF committed Jan 3, 2024
1 parent 42f1ab2 commit 43b4f62
Show file tree
Hide file tree
Showing 3 changed files with 146 additions and 84 deletions.
138 changes: 57 additions & 81 deletions src/paho/mqtt/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

import base64
import collections
import enum
import errno
import hashlib
import logging
Expand All @@ -37,6 +36,7 @@
import urllib.request
import uuid

from .enums import ConnackCode, ConnectionState, MessageState, MessageType, MQTTErrorCode, MQTTProtocolVersion, PahoClientMode, PahoLogLevel
from .matcher import MQTTMatcher
from .properties import Properties
from .reasoncodes import ReasonCodes
Expand Down Expand Up @@ -100,91 +100,64 @@ class _OutPacket(TypedDict):
else:
EAGAIN = errno.EAGAIN

MQTTv31 = 3
MQTTv311 = 4
MQTTv5 = 5

# Message types
CONNECT = 0x10
CONNACK = 0x20
PUBLISH = 0x30
PUBACK = 0x40
PUBREC = 0x50
PUBREL = 0x60
PUBCOMP = 0x70
SUBSCRIBE = 0x80
SUBACK = 0x90
UNSUBSCRIBE = 0xA0
UNSUBACK = 0xB0
PINGREQ = 0xC0
PINGRESP = 0xD0
DISCONNECT = 0xE0
AUTH = 0xF0

# Keep copy of enums values for compatibility.
CONNECT = MessageType.CONNECT
CONNACK = MessageType.CONNACK
PUBLISH = MessageType.PUBLISH
PUBACK = MessageType.PUBACK
PUBREC = MessageType.PUBREC
PUBREL = MessageType.PUBREL
PUBCOMP = MessageType.PUBCOMP
SUBSCRIBE = MessageType.SUBSCRIBE
SUBACK = MessageType.SUBACK
UNSUBSCRIBE = MessageType.UNSUBSCRIBE
UNSUBACK = MessageType.UNSUBACK
PINGREQ = MessageType.PINGREQ
PINGRESP = MessageType.PINGRESP
DISCONNECT = MessageType.DISCONNECT
AUTH = MessageType.AUTH

# Log levels
MQTT_LOG_INFO = 0x01
MQTT_LOG_NOTICE = 0x02
MQTT_LOG_WARNING = 0x04
MQTT_LOG_ERR = 0x08
MQTT_LOG_DEBUG = 0x10
MQTT_LOG_INFO = PahoLogLevel.MQTT_LOG_INFO
MQTT_LOG_NOTICE = PahoLogLevel.MQTT_LOG_NOTICE
MQTT_LOG_WARNING = PahoLogLevel.MQTT_LOG_WARNING
MQTT_LOG_ERR = PahoLogLevel.MQTT_LOG_ERR
MQTT_LOG_DEBUG = PahoLogLevel.MQTT_LOG_DEBUG
LOGGING_LEVEL = {
MQTT_LOG_DEBUG: logging.DEBUG,
MQTT_LOG_INFO: logging.INFO,
MQTT_LOG_NOTICE: logging.INFO, # This has no direct equivalent level
MQTT_LOG_WARNING: logging.WARNING,
MQTT_LOG_ERR: logging.ERROR,
PahoLogLevel.MQTT_LOG_DEBUG: logging.DEBUG,
PahoLogLevel.MQTT_LOG_INFO: logging.INFO,
PahoLogLevel.MQTT_LOG_NOTICE: logging.INFO, # This has no direct equivalent level
PahoLogLevel.MQTT_LOG_WARNING: logging.WARNING,
PahoLogLevel.MQTT_LOG_ERR: logging.ERROR,
}

# CONNACK codes
CONNACK_ACCEPTED = 0
CONNACK_REFUSED_PROTOCOL_VERSION = 1
CONNACK_REFUSED_IDENTIFIER_REJECTED = 2
CONNACK_REFUSED_SERVER_UNAVAILABLE = 3
CONNACK_REFUSED_BAD_USERNAME_PASSWORD = 4
CONNACK_REFUSED_NOT_AUTHORIZED = 5
CONNACK_ACCEPTED = ConnackCode.CONNACK_ACCEPTED
CONNACK_REFUSED_PROTOCOL_VERSION = ConnackCode.CONNACK_REFUSED_PROTOCOL_VERSION
CONNACK_REFUSED_IDENTIFIER_REJECTED = ConnackCode.CONNACK_REFUSED_IDENTIFIER_REJECTED
CONNACK_REFUSED_SERVER_UNAVAILABLE = ConnackCode.CONNACK_REFUSED_SERVER_UNAVAILABLE
CONNACK_REFUSED_BAD_USERNAME_PASSWORD = ConnackCode.CONNACK_REFUSED_BAD_USERNAME_PASSWORD
CONNACK_REFUSED_NOT_AUTHORIZED = ConnackCode.CONNACK_REFUSED_NOT_AUTHORIZED

# Connection state
mqtt_cs_new = 0
mqtt_cs_connected = 1
mqtt_cs_disconnecting = 2
mqtt_cs_connect_async = 3
mqtt_cs_new = ConnectionState.mqtt_cs_new
mqtt_cs_connected = ConnectionState.mqtt_cs_connected
mqtt_cs_disconnecting = ConnectionState.mqtt_cs_disconnecting
mqtt_cs_connect_async = ConnectionState.mqtt_cs_connect_async

# Message state
mqtt_ms_invalid = 0
mqtt_ms_publish = 1
mqtt_ms_wait_for_puback = 2
mqtt_ms_wait_for_pubrec = 3
mqtt_ms_resend_pubrel = 4
mqtt_ms_wait_for_pubrel = 5
mqtt_ms_resend_pubcomp = 6
mqtt_ms_wait_for_pubcomp = 7
mqtt_ms_send_pubrec = 8
mqtt_ms_queued = 9


# Error values
class MQTTErrorCode(enum.IntEnum):
MQTT_ERR_AGAIN = -1
MQTT_ERR_SUCCESS = 0
MQTT_ERR_NOMEM = 1
MQTT_ERR_PROTOCOL = 2
MQTT_ERR_INVAL = 3
MQTT_ERR_NO_CONN = 4
MQTT_ERR_CONN_REFUSED = 5
MQTT_ERR_NOT_FOUND = 6
MQTT_ERR_CONN_LOST = 7
MQTT_ERR_TLS = 8
MQTT_ERR_PAYLOAD_SIZE = 9
MQTT_ERR_NOT_SUPPORTED = 10
MQTT_ERR_AUTH = 11
MQTT_ERR_ACL_DENIED = 12
MQTT_ERR_UNKNOWN = 13
MQTT_ERR_ERRNO = 14
MQTT_ERR_QUEUE_SIZE = 15
MQTT_ERR_KEEPALIVE = 16


# This probably do the same as @global_enum, but this decorator require Python 3.11
mqtt_ms_invalid = MessageState.mqtt_ms_invalid
mqtt_ms_publish = MessageState.mqtt_ms_publish
mqtt_ms_wait_for_puback = MessageState.mqtt_ms_wait_for_puback
mqtt_ms_wait_for_pubrec = MessageState.mqtt_ms_wait_for_pubrec
mqtt_ms_resend_pubrel = MessageState.mqtt_ms_resend_pubrel
mqtt_ms_wait_for_pubrel = MessageState.mqtt_ms_wait_for_pubrel
mqtt_ms_resend_pubcomp = MessageState.mqtt_ms_resend_pubcomp
mqtt_ms_wait_for_pubcomp = MessageState.mqtt_ms_wait_for_pubcomp
mqtt_ms_send_pubrec = MessageState.mqtt_ms_send_pubrec
mqtt_ms_queued = MessageState.mqtt_ms_queued

MQTT_ERR_AGAIN = MQTTErrorCode.MQTT_ERR_AGAIN
MQTT_ERR_SUCCESS = MQTTErrorCode.MQTT_ERR_SUCCESS
MQTT_ERR_NOMEM = MQTTErrorCode.MQTT_ERR_NOMEM
Expand All @@ -204,9 +177,12 @@ class MQTTErrorCode(enum.IntEnum):
MQTT_ERR_QUEUE_SIZE = MQTTErrorCode.MQTT_ERR_QUEUE_SIZE
MQTT_ERR_KEEPALIVE = MQTTErrorCode.MQTT_ERR_KEEPALIVE

MQTTv31 = MQTTProtocolVersion.MQTTv31
MQTTv311 = MQTTProtocolVersion.MQTTv311
MQTTv5 = MQTTProtocolVersion.MQTTv5

MQTT_CLIENT = 0
MQTT_BRIDGE = 1
MQTT_CLIENT = PahoClientMode.MQTT_CLIENT
MQTT_BRIDGE = PahoClientMode.MQTT_BRIDGE

# For MQTT V5, use the clean start flag only on the first successful connect
MQTT_CLEAN_START_FIRST_ONLY = 3
Expand Down Expand Up @@ -2818,7 +2794,7 @@ def _packet_write(self) -> MQTTErrorCode:

return MQTTErrorCode.MQTT_ERR_SUCCESS

def _easy_log(self, level: int, fmt: str, *args: typing.Any) -> None:
def _easy_log(self, level: PahoLogLevel, fmt: str, *args: typing.Any) -> None:
if self.on_log is not None:
buf = fmt % args
try:
Expand Down Expand Up @@ -3883,8 +3859,8 @@ def _handle_pubackcomp(
elif self._in_packet['remaining_length'] != 2:
return MQTTErrorCode.MQTT_ERR_PROTOCOL

packet_type = PUBACK if cmd == "PUBACK" else PUBCOMP
packet_type = packet_type >> 4
packet_type_enum = PUBACK if cmd == "PUBACK" else PUBCOMP
packet_type = packet_type_enum.value >> 4
mid, = struct.unpack("!H", self._in_packet['packet'][:2])
if self._protocol == MQTTv5:
if self._in_packet['remaining_length'] > 2:
Expand Down
88 changes: 88 additions & 0 deletions src/paho/mqtt/enums.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import enum


# Error values
class MQTTErrorCode(enum.IntEnum):
MQTT_ERR_AGAIN = -1
MQTT_ERR_SUCCESS = 0
MQTT_ERR_NOMEM = 1
MQTT_ERR_PROTOCOL = 2
MQTT_ERR_INVAL = 3
MQTT_ERR_NO_CONN = 4
MQTT_ERR_CONN_REFUSED = 5
MQTT_ERR_NOT_FOUND = 6
MQTT_ERR_CONN_LOST = 7
MQTT_ERR_TLS = 8
MQTT_ERR_PAYLOAD_SIZE = 9
MQTT_ERR_NOT_SUPPORTED = 10
MQTT_ERR_AUTH = 11
MQTT_ERR_ACL_DENIED = 12
MQTT_ERR_UNKNOWN = 13
MQTT_ERR_ERRNO = 14
MQTT_ERR_QUEUE_SIZE = 15
MQTT_ERR_KEEPALIVE = 16


class MQTTProtocolVersion(enum.IntEnum):
MQTTv31 = 3
MQTTv311 = 4
MQTTv5 = 5


class MessageType(enum.IntEnum):
CONNECT = 0x10
CONNACK = 0x20
PUBLISH = 0x30
PUBACK = 0x40
PUBREC = 0x50
PUBREL = 0x60
PUBCOMP = 0x70
SUBSCRIBE = 0x80
SUBACK = 0x90
UNSUBSCRIBE = 0xA0
UNSUBACK = 0xB0
PINGREQ = 0xC0
PINGRESP = 0xD0
DISCONNECT = 0xE0
AUTH = 0xF0

class PahoLogLevel(enum.IntEnum):
MQTT_LOG_INFO = 0x01
MQTT_LOG_NOTICE = 0x02
MQTT_LOG_WARNING = 0x04
MQTT_LOG_ERR = 0x08
MQTT_LOG_DEBUG = 0x10


class ConnackCode(enum.IntEnum):
CONNACK_ACCEPTED = 0
CONNACK_REFUSED_PROTOCOL_VERSION = 1
CONNACK_REFUSED_IDENTIFIER_REJECTED = 2
CONNACK_REFUSED_SERVER_UNAVAILABLE = 3
CONNACK_REFUSED_BAD_USERNAME_PASSWORD = 4
CONNACK_REFUSED_NOT_AUTHORIZED = 5


class ConnectionState(enum.IntEnum):
mqtt_cs_new = 0
mqtt_cs_connected = 1
mqtt_cs_disconnecting = 2
mqtt_cs_connect_async = 3


class MessageState(enum.IntEnum):
mqtt_ms_invalid = 0
mqtt_ms_publish = 1
mqtt_ms_wait_for_puback = 2
mqtt_ms_wait_for_pubrec = 3
mqtt_ms_resend_pubrel = 4
mqtt_ms_wait_for_pubrel = 5
mqtt_ms_resend_pubcomp = 6
mqtt_ms_wait_for_pubcomp = 7
mqtt_ms_send_pubrec = 8
mqtt_ms_queued = 9


class PahoClientMode(enum.IntEnum):
MQTT_CLIENT = 0
MQTT_BRIDGE = 1
4 changes: 1 addition & 3 deletions src/paho/mqtt/publish.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,9 +289,7 @@ def single(
proxy_args: a dictionary that will be given to the client.
"""

msg = MessageDict(
{'topic':topic, 'payload':payload, 'qos':qos, 'retain':retain}
)
msg: MessageDict = {'topic':topic, 'payload':payload, 'qos':qos, 'retain':retain}

multiple([msg], hostname, port, client_id, keepalive, will, auth, tls,
protocol, transport, proxy_args)

0 comments on commit 43b4f62

Please sign in to comment.