/* * Copyright (c) 2022 René Beckmann * * SPDX-License-Identifier: Apache-2.0 */ /** @file mqtt_sn_msg.h * * @brief Function and data structures internal to MQTT-SN module. */ #ifndef MQTT_SN_MSG_H_ #define MQTT_SN_MSG_H_ #include #include #ifdef __cplusplus extern "C" { #endif #define MQTT_SN_LENGTH_FIELD_EXTENDED_PREFIX 0x01 #define MQTT_SN_PROTOCOL_ID 0x01 struct mqtt_sn_flags { bool dup; enum mqtt_sn_qos qos; bool retain; bool will; bool clean_session; enum mqtt_sn_topic_type topic_type; }; enum mqtt_sn_msg_type { MQTT_SN_MSG_TYPE_ADVERTISE = 0x00, MQTT_SN_MSG_TYPE_SEARCHGW = 0x01, MQTT_SN_MSG_TYPE_GWINFO = 0x02, MQTT_SN_MSG_TYPE_CONNECT = 0x04, MQTT_SN_MSG_TYPE_CONNACK = 0x05, MQTT_SN_MSG_TYPE_WILLTOPICREQ = 0x06, MQTT_SN_MSG_TYPE_WILLTOPIC = 0x07, MQTT_SN_MSG_TYPE_WILLMSGREQ = 0x08, MQTT_SN_MSG_TYPE_WILLMSG = 0x09, MQTT_SN_MSG_TYPE_REGISTER = 0x0A, MQTT_SN_MSG_TYPE_REGACK = 0x0B, MQTT_SN_MSG_TYPE_PUBLISH = 0x0C, MQTT_SN_MSG_TYPE_PUBACK = 0x0D, MQTT_SN_MSG_TYPE_PUBCOMP = 0x0E, MQTT_SN_MSG_TYPE_PUBREC = 0x0F, MQTT_SN_MSG_TYPE_PUBREL = 0x10, MQTT_SN_MSG_TYPE_SUBSCRIBE = 0x12, MQTT_SN_MSG_TYPE_SUBACK = 0x13, MQTT_SN_MSG_TYPE_UNSUBSCRIBE = 0x14, MQTT_SN_MSG_TYPE_UNSUBACK = 0x15, MQTT_SN_MSG_TYPE_PINGREQ = 0x16, MQTT_SN_MSG_TYPE_PINGRESP = 0x17, MQTT_SN_MSG_TYPE_DISCONNECT = 0x18, MQTT_SN_MSG_TYPE_WILLTOPICUPD = 0x1A, MQTT_SN_MSG_TYPE_WILLTOPICRESP = 0x1B, MQTT_SN_MSG_TYPE_WILLMSGUPD = 0x1C, MQTT_SN_MSG_TYPE_WILLMSGRESP = 0x1D, MQTT_SN_MSG_TYPE_ENCAPSULATED = 0xFE, }; struct mqtt_sn_param_advertise { uint8_t gw_id; uint16_t duration; }; struct mqtt_sn_param_searchgw { uint8_t radius; }; struct mqtt_sn_param_gwinfo { uint8_t gw_id; struct mqtt_sn_data gw_add; }; struct mqtt_sn_param_connect { bool will; bool clean_session; uint16_t duration; struct mqtt_sn_data client_id; }; struct mqtt_sn_param_connack { enum mqtt_sn_return_code ret_code; }; struct mqtt_sn_param_willtopic { enum mqtt_sn_qos qos; bool retain; struct mqtt_sn_data topic; }; struct mqtt_sn_param_willmsg { struct mqtt_sn_data msg; }; struct mqtt_sn_param_register { uint16_t msg_id; uint16_t topic_id; struct mqtt_sn_data topic; }; struct mqtt_sn_param_regack { uint16_t msg_id; uint16_t topic_id; enum mqtt_sn_return_code ret_code; }; struct mqtt_sn_param_publish { bool dup; bool retain; enum mqtt_sn_qos qos; enum mqtt_sn_topic_type topic_type; uint16_t topic_id; uint16_t msg_id; struct mqtt_sn_data data; }; struct mqtt_sn_param_puback { uint16_t msg_id; uint16_t topic_id; enum mqtt_sn_return_code ret_code; }; struct mqtt_sn_param_pubrec { uint16_t msg_id; }; struct mqtt_sn_param_pubrel { uint16_t msg_id; }; struct mqtt_sn_param_pubcomp { uint16_t msg_id; }; struct mqtt_sn_param_subscribe { bool dup; enum mqtt_sn_qos qos; enum mqtt_sn_topic_type topic_type; uint16_t msg_id; struct { struct mqtt_sn_data topic_name; uint16_t topic_id; } topic; }; struct mqtt_sn_param_suback { enum mqtt_sn_qos qos; uint16_t topic_id; uint16_t msg_id; enum mqtt_sn_return_code ret_code; }; struct mqtt_sn_param_unsubscribe { enum mqtt_sn_topic_type topic_type; uint16_t msg_id; union { struct mqtt_sn_data topic_name; uint16_t topic_id; } topic; }; struct mqtt_sn_param_unsuback { uint16_t msg_id; }; struct mqtt_sn_param_pingreq { struct mqtt_sn_data client_id; }; struct mqtt_sn_param_disconnect { uint16_t duration; }; struct mqtt_sn_param_willtopicupd { enum mqtt_sn_qos qos; bool retain; struct mqtt_sn_data topic; }; struct mqtt_sn_param_willmsgupd { struct mqtt_sn_data msg; }; struct mqtt_sn_param_willtopicresp { enum mqtt_sn_return_code ret_code; }; struct mqtt_sn_param_willmsgresp { enum mqtt_sn_return_code ret_code; }; struct mqtt_sn_param { enum mqtt_sn_msg_type type; union { struct mqtt_sn_param_advertise advertise; struct mqtt_sn_param_searchgw searchgw; struct mqtt_sn_param_gwinfo gwinfo; struct mqtt_sn_param_connect connect; struct mqtt_sn_param_connack connack; struct mqtt_sn_param_willtopic willtopic; struct mqtt_sn_param_willmsg willmsg; struct mqtt_sn_param_register reg; struct mqtt_sn_param_regack regack; struct mqtt_sn_param_publish publish; struct mqtt_sn_param_puback puback; struct mqtt_sn_param_pubrec pubrec; struct mqtt_sn_param_pubrel pubrel; struct mqtt_sn_param_pubcomp pubcomp; struct mqtt_sn_param_subscribe subscribe; struct mqtt_sn_param_suback suback; struct mqtt_sn_param_unsubscribe unsubscribe; struct mqtt_sn_param_unsuback unsuback; struct mqtt_sn_param_pingreq pingreq; struct mqtt_sn_param_disconnect disconnect; struct mqtt_sn_param_willtopicupd willtopicupd; struct mqtt_sn_param_willmsgupd willmsgupd; struct mqtt_sn_param_willtopicresp willtopicresp; struct mqtt_sn_param_willmsgresp willmsgresp; } params; }; /**@brief MQTT-SN Flags-field bitmasks */ #define MQTT_SN_FLAGS_DUP BIT(7) #define MQTT_SN_FLAGS_QOS_0 0 #define MQTT_SN_FLAGS_QOS_1 BIT(5) #define MQTT_SN_FLAGS_QOS_2 BIT(6) #define MQTT_SN_FLAGS_QOS_M1 BIT(5) | BIT(6) #define MQTT_SN_FLAGS_MASK_QOS (BIT(5) | BIT(6)) #define MQTT_SN_FLAGS_SHIFT_QOS 5 #define MQTT_SN_FLAGS_RETAIN BIT(4) #define MQTT_SN_FLAGS_WILL BIT(3) #define MQTT_SN_FLAGS_CLEANSESSION BIT(2) #define MQTT_SN_FLAGS_TOPICID_TYPE_NORMAL 0 #define MQTT_SN_FLAGS_TOPICID_TYPE_PREDEF BIT(0) #define MQTT_SN_FLAGS_TOPICID_TYPE_SHORT BIT(1) #define MQTT_SN_FLAGS_MASK_TOPICID_TYPE (BIT(0) | BIT(1)) #define MQTT_SN_FLAGS_SHIFT_TOPICID_TYPE 0 static inline void *net_buf_simple_add_data(struct net_buf_simple *buf, struct mqtt_sn_data *data) { return net_buf_simple_add_mem(buf, data->data, data->size); } int mqtt_sn_encode_msg(struct net_buf_simple *buf, struct mqtt_sn_param *params); int mqtt_sn_decode_msg(struct net_buf_simple *buf, struct mqtt_sn_param *params); #ifdef __cplusplus } #endif #endif /* MQTT_SN_MSG_H_ */