1
0
mirror of https://github.com/FreeRTOS/coreMQTT synced 2025-10-21 14:33:30 +08:00
Files
coreMQTT/source/include/core_mqtt_utils.h
Aditi-Chaudhary a4fad60fce MQTTv5 Implementation (#316)
MQTTv5 Library preview

Description
-----------
- This change adds the client implementation of MQTT version 5 CONNECT,
CONNACK, Outgoing PUBLISH, PUBLISH ACKS, Incoming PUBLISH, SUBSCRIBE,
SUBACK, UNSUBSCRIBE, UNSUBACK, DISCONNECT.
- Existing data structures and functions are modified, and some new
functions are added to serialize and deserialize the packets.
- Plaintext Demo for reference (
https://github.com/adituc/FreeRTOS/blob/pooja-main-branch/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTTV5_Plain_Text/DemoTasks/PlaintextMQTTExampleV5.c
)

Test Steps
-----------
- Unit Tests are added for all new and modified features.
- Unit Tests for MQTTv5 functions are added in a separate folder in
test.
2025-08-20 13:44:51 -07:00

130 lines
4.4 KiB
C

/*
* coreMQTT <DEVELOPMENT BRANCH>
* Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/**
* @file core_mqtt_utils.h
* @brief utility function used in other files.
*/
#ifndef CORE_MQTT_UTILS_H
#define CORE_MQTT_UTILS_H
/* *INDENT-OFF* */
#ifdef __cplusplus
extern "C" {
#endif
/* *INDENT-ON* */
/**
* @brief Set a bit in an 8-bit unsigned integer.
*/
#define UINT8_SET_BIT( x, position ) ( ( x ) = ( uint8_t ) ( ( x ) | ( 0x01U << ( position ) ) ) )
/**
* @brief Macro for checking if a bit is set in a 1-byte unsigned int.
*
* @param[in] x The unsigned int to check.
* @param[in] position Which bit to check.
*/
#define UINT8_CHECK_BIT( x, position ) ( ( ( x ) &( 0x01U << ( position ) ) ) == ( 0x01U << ( position ) ) )
/**
* @brief Set a bit in an 32-bit unsigned integer.
*/
#define UINT32_SET_BIT( x, position ) \
( ( x ) = ( uint32_t ) ( ( x ) | ( ( uint32_t ) 0x01U << ( position ) ) ) )
/**
* @brief Macro for checking if a bit is set in a 4-byte unsigned int.
*
* @param[in] x The unsigned int to check.
* @param[in] position Which bit to check.
*/
#define UINT32_CHECK_BIT( x, position ) \
( ( ( uint32_t ) ( x ) &( ( uint32_t ) 0x01U << ( position ) ) ) == ( ( uint32_t ) 0x01U << ( position ) ) )
/**
* @brief Get the high byte of a 16-bit unsigned integer.
*/
#define UINT16_HIGH_BYTE( x ) ( ( uint8_t ) ( ( x ) >> 8 ) )
/**
* @brief Get the low byte of a 16-bit unsigned integer.
*/
#define UINT16_LOW_BYTE( x ) ( ( uint8_t ) ( ( x ) & 0x00ffU ) )
/**
* @brief Macro for decoding a 2-byte unsigned int from a sequence of bytes.
*
* @param[in] ptr A uint8_t* that points to the high byte.
*/
#define UINT16_DECODE( ptr ) \
( uint16_t ) ( ( ( ( uint16_t ) ptr[ 0 ] ) << 8 ) | \
( ( uint16_t ) ptr[ 1 ] ) )
/**
* @brief Macro for decoding a 4-byte unsigned int from a sequence of bytes.
*
* @param[in] ptr A uint8_t* that points to the high byte.
*/
#define UINT32_DECODE( ptr ) \
( uint32_t ) ( ( ( ( uint32_t ) ptr[ 0 ] ) << 24 ) | \
( ( ( uint32_t ) ptr[ 1 ] ) << 16 ) | \
( ( ( uint32_t ) ptr[ 2 ] ) << 8 ) | \
( ( uint32_t ) ptr[ 3 ] ) )
/**
* @brief Macro to extract a specific byte from a 32-bit unsigned integer.
*
* @param[in] x The 32-bit unsigned integer to extract from.
* @param[in] byteNumber The byte position to extract (0-3).
*/
#define UINT32_GET_BYTE( x, byteNumber ) \
( ( uint8_t ) ( ( ( uint32_t ) ( x ) >> ( ( uint8_t ) ( byteNumber ) * 8U ) ) & 0xFFU ) )
/**
* @brief Clear a bit in an 8-bit unsigned integer.
*/
#define UINT8_CLEAR_BIT( x, position ) ( ( x ) = ( uint8_t ) ( ( x ) &( ~( 0x01U << ( position ) ) ) ) )
/**
* @brief Encodes the remaining length of the packet using the variable length
* encoding scheme provided in the MQTT 5.0 specification.
*
* @param[out] pDestination The destination buffer to store the encoded remaining
* length.
* @param[in] length The remaining length to encode.
*
* @return The location of the byte following the encoded value.
*/
uint8_t * encodeVariableLength( uint8_t * pDestination,
size_t length );
/* *INDENT-OFF* */
#ifdef __cplusplus
}
#endif
/* *INDENT-ON* */
#endif /* ifndef CORE_MQTT_UTILS_H*/