libwebsockets
Lightweight C library for HTML5 websockets
Loading...
Searching...
No Matches
lws-mqtt.h
Go to the documentation of this file.
1/*
2 * libwebsockets - protocol - mqtt
3 *
4 * Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22 * IN THE SOFTWARE.
23 *
24 * included from libwebsockets.h
25 */
26
27#ifndef _LWS_MQTT_H
28#define _LWS_MQTT_H 1
29
30struct _lws_mqtt_related;
31typedef struct _lws_mqtt_related lws_mqtt_related_t;
32struct lws_mqtt_str_st;
33typedef struct lws_mqtt_str_st lws_mqtt_str_t;
34
35#define MQTT_VER_3_1_1 4
36#if MQTT_VER_3_1_1 == 4
37 #define MQTT_VER_STRING "3.1.1"
38#else
39 #define MQTT_VER_STRING "unknown"
40#endif
41
42#define LWS_MQTT_FINAL_PART 1
43
44#define LWS_MQTT_MAX_AWSIOT_TOPICLEN 256
45#define LWS_MQTT_MAX_TOPICLEN 65535
46#define LWS_MQTT_MAX_PACKET_SIZE (1 * 1024 * 1024)
47#define LWS_MQTT_MAX_CIDLEN 128
48#define LWS_MQTT_RANDOM_CIDLEN 23 /* 3.1.3.1-5: Server MUST... between
49 1 and 23 chars... */
51#define LWS_MQTT_SHADOW_MAX_THING_LEN 128
52#define LWS_MQTT_SHADOW_MAX_SHADOW_LEN 64
53#define LWS_MQTT_SHADOW_UPDATE_STR "/update"
54#define LWS_MQTT_SHADOW_DELETE_STR "/delete"
55#define LWS_MQTT_SHADOW_GET_STR "/get"
56#define LWS_MQTT_SHADOW_RESP_ACCEPTED_STR "/accepted"
57#define LWS_MQTT_SHADOW_RESP_REJECTED_STR "/rejected"
58#define LWS_MQTT_SHADOW_RESP_DELTA_STR "/delta"
59#define LWS_MQTT_SHADOW_RESP_DOCUMENT_STR "/documents"
60#define LWS_MQTT_SHADOW_UPDATE_ACCEPTED_STR LWS_MQTT_SHADOW_UPDATE_STR LWS_MQTT_SHADOW_RESP_ACCEPTED_STR
61#define LWS_MQTT_SHADOW_UPDATE_REJECTED_STR LWS_MQTT_SHADOW_UPDATE_STR LWS_MQTT_SHADOW_RESP_REJECTED_STR
62#define LWS_MQTT_SHADOW_UPDATE_DELTA_STR LWS_MQTT_SHADOW_UPDATE_STR LWS_MQTT_SHADOW_RESP_DELTA_STR
63#define LWS_MQTT_SHADOW_UPDATE_DOCUMENT_STR LWS_MQTT_SHADOW_UPDATE_STR LWS_MQTT_SHADOW_RESP_DOCUMENT_STR
64#define LWS_MQTT_SHADOW_DELETE_ACCEPTED_STR LWS_MQTT_SHADOW_DELETE_STR LWS_MQTT_SHADOW_RESP_ACCEPTED_STR
65#define LWS_MQTT_SHADOW_DELETE_REJECTED_STR LWS_MQTT_SHADOW_DELETE_STR LWS_MQTT_SHADOW_RESP_REJECTED_STR
66#define LWS_MQTT_SHADOW_GET_ACCEPTED_STR LWS_MQTT_SHADOW_GET_STR LWS_MQTT_SHADOW_RESP_ACCEPTED_STR
67#define LWS_MQTT_SHADOW_GET_REJECTED_STR LWS_MQTT_SHADOW_GET_STR LWS_MQTT_SHADOW_RESP_REJECTED_STR
68#define LWS_MQTT_SHADOW_PREFIX_FORMAT "$aws/things/%s"
69#define LWS_MQTT_SHADOW_NAMED_SHADOW_TOPIC_FORMAT LWS_MQTT_SHADOW_PREFIX_FORMAT "/shadow/name/%s%s"
70#define LWS_MQTT_SHADOW_UNNAMED_SHADOW_TOPIC_FORMAT LWS_MQTT_SHADOW_PREFIX_FORMAT "/shadow%s"
71#define LWS_MQTT_SHADOW_UNNAMED_TOPIC_MATCH "$aws/things/+/shadow/+"
72#define LWS_MQTT_SHADOW_NAMED_TOPIC_MATCH "$aws/things/+/shadow/name/+/+"
82typedef union {
83 struct {
85 uint8_t qos:2;
86 uint8_t dup:1;
87 uint8_t ctrl_pkt_type:4;
88 } flags;
89 uint8_t bits;
93 int (*rx_add)(struct lws *wsi, const char *client_id, uint16_t pkt_id);
94 int (*rx_remove)(struct lws *wsi, const char *client_id, uint16_t pkt_id);
96
97/*
98 * MQTT connection parameters, passed into struct
99 * lws_client_connect_info to establish a connection using
100 * lws_client_connect_via_info().
103 const char *client_id; /* Client ID */
104 uint16_t keep_alive; /* MQTT keep alive
105 interval in
106 seconds */
107 uint8_t clean_start:1; /* MQTT clean
108 session */
114 /**< do not free the password */
115 struct {
116 const char *topic;
117 const char *message;
119 uint8_t retain;
120 } will_param; /* MQTT LWT
121 parameters */
122 struct {
123 const char *topic;
124 const char *message;
126 uint8_t retain;
127 } birth_param; /* MQTT Birth
128 parameters */
129 const char *username;
130 const char *password;
134
135/*
136 * MQTT publish parameters
139 char *topic; /* Topic Name */
141 const void *payload; /* Publish Payload */
142 uint32_t payload_len; /* Size of the
143 complete payload */
144 uint32_t payload_pos; /* where we are in payload */
146
147 /*--v-Following will be used by LWS-v--*/
148 uint16_t packet_id; /* Packet ID for QoS >
149 0 */
150 uint8_t dup:1; /* Retried PUBLISH,
151 for QoS > 0 */
152 uint8_t retain:1; /* Retained message */
155typedef struct topic_elem {
156 const char *name; /* Topic Name */
157 lws_mqtt_qos_levels_t qos; /* Requested QoS */
158
159 /*--v-Following will be used by LWS-v--*/
162
163/*
164 * The maximum number of topic elements that can be passed in a single
165 * lws_mqtt_client_send_subcribe() or lws_mqtt_client_send_unsubcribe()
166 * call, ie, the top end of the valid range for
167 * lws_mqtt_subscribe_param_t.num_topics. Calls with a num_topics of
168 * zero or greater than this are rejected with a nonzero return.
169 */
170#define LWS_MQTT_MAX_TOPICS 8
171
172/*
173 * MQTT publish parameters
176 uint32_t num_topics; /* Number of topics */
177 lws_mqtt_topic_elem_t *topic; /* Array of topic elements */
178
179 /*--v-Following will be used by LWS-v--*/
183typedef enum {
185 LMQCP_CTOS_CONNECT, /* Connection request */
186 LMQCP_STOC_CONNACK, /* Connection acknowledgment */
187 LMQCP_PUBLISH, /* Publish Message */
188 LMQCP_PUBACK, /* QoS 1: Publish acknowledgment */
189 LMQCP_PUBREC, /* QoS 2.1: Publish received */
190 LMQCP_PUBREL, /* QoS 2.2: Publish release */
191 LMQCP_PUBCOMP, /* QoS 2.3: Publish complete */
192 LMQCP_CTOS_SUBSCRIBE, /* Subscribe request */
193 LMQCP_STOC_SUBACK, /* Subscribe acknowledgment */
194 LMQCP_CTOS_UNSUBSCRIBE, /* Unsubscribe request */
195 LMQCP_STOC_UNSUBACK, /* Unsubscribe acknowledgment */
196 LMQCP_CTOS_PINGREQ, /* PING request */
197 LMQCP_STOC_PINGRESP, /* PONG response */
198 LMQCP_DISCONNECT, /* Disconnect notification */
199 LMQCP_AUTH /* Authentication exchange */
201
202/* flags from byte 8 of C_TO_S CONNECT */
203typedef enum {
206 LMQCFT_CLIENT_ID_NOFREE = (1 << 8),
207 /* only the low 8 are standardized and go out in the protocol */
208 LMQCFT_USERNAME = (1 << 7),
209 LMQCFT_PASSWORD = (1 << 6),
211 LMQCFT_WILL_QOS = (1 << 3),
214 LMQCFT_RESERVED = (1 << 0),
216 LMQCFT_WILL_QOS_MASK = (3 << 3),
218
219/* flags for S_TO_C CONNACK */
220typedef enum {
221 LMQCFT_SESSION_PRESENT = (1 << 0),
224typedef enum {
240
241 /* Begin - Error codes for CONNACK */
246 /* End - Error codes for CONNACK */
307
308int
309lws_read_mqtt(struct lws *wsi, unsigned char *buf, lws_filepos_t len);
310
311/* returns 0 if bd1 and bd2 are "the same", that includes empty, else nonzero */
314
316lws_mqtt_str_init(lws_mqtt_str_t *s, uint8_t *buf, uint16_t lim, char nf);
317
320
323
325lws_mqtt_str_create_cstr_dup(const char *buf, uint16_t lim);
326
329
332
335
336
366 const void *buf, uint32_t len, int final);
367
383
399lws_mqtt_client_send_unsubcribe(struct lws *wsi,
400 const lws_mqtt_subscribe_param_t *unsub);
401
412lws_mqtt_client_qos2_rx_add(struct lws *wsi, uint16_t pkt_id);
413
414#endif /* _LWS_MQTT_H */
unsigned short uint16_t
unsigned int uint32_t
#define LWS_EXTERN
unsigned char uint8_t
#define LWS_WARN_UNUSED_RESULT
#define LWS_VISIBLE
unsigned long long lws_filepos_t
struct lws_mqtt_str_st lws_mqtt_str_t
Definition lws-mqtt.h:33
struct lws_mqtt_qos2_state_ops lws_mqtt_qos2_state_ops_t
lws_mqtt_connect_flags_t
Definition lws-mqtt.h:202
@ LMQCFT_USERNAME
Definition lws-mqtt.h:207
@ LMQCFT_WILL_QOS_MASK
Definition lws-mqtt.h:215
@ LMQCFT_PASSWORD
Definition lws-mqtt.h:208
@ LMQCFT_WILL_FLAG
Definition lws-mqtt.h:211
@ LMQCFT_CLIENT_ID_NOFREE
Definition lws-mqtt.h:205
@ LMQCFT_WILL_RETAIN
Definition lws-mqtt.h:209
@ LMQCFT_RESERVED
Definition lws-mqtt.h:213
@ LMQCFT_PASSWORD_NOFREE
Definition lws-mqtt.h:204
@ LMQCFT_WILL_QOS
Definition lws-mqtt.h:210
@ LMQCFT_CLEAN_START
Definition lws-mqtt.h:212
@ LMQCFT_USERNAME_NOFREE
Definition lws-mqtt.h:203
int lws_read_mqtt(struct lws *wsi, unsigned char *buf, lws_filepos_t len)
const char * name
Definition lws-mqtt.h:155
LWS_VISIBLE LWS_EXTERN lws_mqtt_str_t * lws_mqtt_str_create_cstr_dup(const char *buf, uint16_t lim)
struct lws_mqtt_publish_param_s lws_mqtt_publish_param_t
lws_mqtt_topic_elem_t * topic
Definition lws-mqtt.h:176
LWS_VISIBLE LWS_EXTERN uint8_t * lws_mqtt_str_next(lws_mqtt_str_t *s, uint16_t *budget)
lws_mqtt_control_packet_t
Definition lws-mqtt.h:182
@ LMQCP_PUBREC
Definition lws-mqtt.h:188
@ LMQCP_STOC_SUBACK
Definition lws-mqtt.h:192
@ LMQCP_PUBACK
Definition lws-mqtt.h:187
@ LMQCP_CTOS_CONNECT
Definition lws-mqtt.h:184
@ LMQCP_STOC_UNSUBACK
Definition lws-mqtt.h:194
@ LMQCP_CTOS_UNSUBSCRIBE
Definition lws-mqtt.h:193
@ LMQCP_PUBCOMP
Definition lws-mqtt.h:190
@ LMQCP_DISCONNECT
Definition lws-mqtt.h:197
@ LMQCP_STOC_CONNACK
Definition lws-mqtt.h:185
@ LMQCP_STOC_PINGRESP
Definition lws-mqtt.h:196
@ LMQCP_RESERVED
Definition lws-mqtt.h:183
@ LMQCP_AUTH
Definition lws-mqtt.h:198
@ LMQCP_PUBREL
Definition lws-mqtt.h:189
@ LMQCP_CTOS_PINGREQ
Definition lws-mqtt.h:195
@ LMQCP_PUBLISH
Definition lws-mqtt.h:186
@ LMQCP_CTOS_SUBSCRIBE
Definition lws-mqtt.h:191
LWS_VISIBLE LWS_EXTERN void lws_mqtt_str_free(lws_mqtt_str_t **s)
LWS_VISIBLE LWS_EXTERN int lws_mqtt_client_qos2_rx_add(struct lws *wsi, uint16_t pkt_id)
LWS_VISIBLE LWS_EXTERN int lws_mqtt_str_advance(lws_mqtt_str_t *s, int n)
struct _lws_mqtt_related lws_mqtt_related_t
Definition lws-mqtt.h:31
LWS_VISIBLE LWS_EXTERN void lws_mqtt_str_init(lws_mqtt_str_t *s, uint8_t *buf, uint16_t lim, char nf)
lws_mqtt_reason_t
Definition lws-mqtt.h:223
@ LMQCP_REASON_USE_ANOTHER_SERVER
Definition lws-mqtt.h:267
@ LMQCP_REASON_TOPIC_NAME_INVALID
Definition lws-mqtt.h:255
@ LMQCP_REASON_RE_AUTHENTICATE
Definition lws-mqtt.h:233
@ LMQCP_REASON_SERVER_BUSY
Definition lws-mqtt.h:248
@ LMQCP_REASON_CONNECTION_RATE_EXCEEDED
Definition lws-mqtt.h:270
@ LMQCP_REASON_NOT_AUTHORIZED
Definition lws-mqtt.h:244
@ LMQCP_REASON_RETAIN_NOT_SUPPORTED
Definition lws-mqtt.h:265
@ LMQCP_REASON_SUBSCRIPTION_IDS_NOT_SUPPORTED
Definition lws-mqtt.h:272
@ LMQCP_REASON_TOPIC_FILTER_INVALID
Definition lws-mqtt.h:254
@ LMQCP_REASON_NORMAL_DISCONNECTION
Definition lws-mqtt.h:225
@ LMQCP_REASON_BAD_CREDENTIALS
Definition lws-mqtt.h:243
@ LMQCP_REASON_UNSPECIFIED_ERROR
Definition lws-mqtt.h:235
@ LMQCP_REASON_GRANTED_QOS0
Definition lws-mqtt.h:226
@ LMQCP_REASON_PACKET_TOO_LARGE
Definition lws-mqtt.h:260
@ LMQCP_REASON_QUOTA_EXCEEDED
Definition lws-mqtt.h:262
@ LMQCP_REASON_SESSION_TAKEN_OVER
Definition lws-mqtt.h:253
@ LMQCP_REASON_PACKET_ID_NOT_FOUND
Definition lws-mqtt.h:257
@ LMQCP_REASON_PAYLOAD_FORMAT_INVALID
Definition lws-mqtt.h:264
@ LMQCP_REASON_PACKET_ID_IN_USE
Definition lws-mqtt.h:256
@ LMQCP_REASON_UNSUPPORTED_PROTOCOL
Definition lws-mqtt.h:241
@ LMQCP_REASON_NO_MATCHING_SUBSCRIBER
Definition lws-mqtt.h:230
@ LMQCP_REASON_SERVER_MOVED
Definition lws-mqtt.h:268
@ LMQCP_REASON_BAD_AUTHENTICATION_METHOD
Definition lws-mqtt.h:251
@ LMQCP_REASON_DISCONNECT_WILL
Definition lws-mqtt.h:229
@ LMQCP_REASON_QOS_NOT_SUPPORTED
Definition lws-mqtt.h:266
@ LMQCP_REASON_TOPIC_ALIAS_INVALID
Definition lws-mqtt.h:259
@ LMQCP_REASON_KEEPALIVE_TIMEOUT
Definition lws-mqtt.h:252
@ LMQCP_REASON_MAX_RX_EXCEEDED
Definition lws-mqtt.h:258
@ LMQCP_REASON_MAXIMUM_CONNECT_TIME
Definition lws-mqtt.h:271
@ LMQCP_REASON_MALFORMED_PACKET
Definition lws-mqtt.h:236
@ LMQCP_REASON_NO_SUBSCRIPTION_EXISTED
Definition lws-mqtt.h:231
@ LMQCP_REASON_CONTINUE_AUTHENTICATION
Definition lws-mqtt.h:232
@ LMQCP_REASON_SERVER_SHUTTING_DOWN
Definition lws-mqtt.h:250
@ LMQCP_REASON_GRANTED_QOS1
Definition lws-mqtt.h:227
@ LMQCP_REASON_SHARED_SUBSCRIPTIONS_NOT_SUPPORTED
Definition lws-mqtt.h:269
@ LMQCP_REASON_PROTOCOL_ERROR
Definition lws-mqtt.h:237
@ LMQCP_REASON_SERVER_UNAVAILABLE
Definition lws-mqtt.h:247
@ LMQCP_REASON_IMPLEMENTATION_SPECIFIC_ERROR
Definition lws-mqtt.h:238
@ LMQCP_REASON_BANNED
Definition lws-mqtt.h:249
@ LMQCP_REASON_ADMINISTRATIVE_ACTION
Definition lws-mqtt.h:263
@ LMQCP_REASON_RATELIMIT
Definition lws-mqtt.h:261
@ LMQCP_REASON_GRANTED_QOS2
Definition lws-mqtt.h:228
@ LMQCP_REASON_SUCCESS
Definition lws-mqtt.h:224
@ LMQCP_REASON_CLIENT_ID_INVALID
Definition lws-mqtt.h:242
@ LMQCP_REASON_WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED
Definition lws-mqtt.h:273
LWS_VISIBLE LWS_EXTERN lws_mqtt_str_t * lws_mqtt_str_create_init(uint8_t *buf, uint16_t len, uint16_t lim)
uint8_t acked
Definition lws-mqtt.h:159
struct topic_elem lws_mqtt_topic_elem_t
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_mqtt_client_send_unsubcribe(struct lws *wsi, const lws_mqtt_subscribe_param_t *unsub)
LWS_VISIBLE LWS_EXTERN int lws_mqtt_client_send_publish(struct lws *wsi, lws_mqtt_publish_param_t *pub, const void *buf, uint32_t len, int final)
lws_mqtt_qos_levels_t qos
Definition lws-mqtt.h:156
lws_mqtt_connack_flags_t
Definition lws-mqtt.h:219
@ LMQCFT_SESSION_PRESENT
Definition lws-mqtt.h:220
lws_mqtt_property
Definition lws-mqtt.h:276
@ LMQPROP_RESPONSE_INFORMATION
Definition lws-mqtt.h:292
@ LMQPROP_RETAIN_AVAILABLE
Definition lws-mqtt.h:299
@ LMQPROP_RECEIVE_MAXIMUM
Definition lws-mqtt.h:295
@ LMQPROP_AUTHENTICATION_DATA
Definition lws-mqtt.h:288
@ LMQPROP_RESPONSE_TOPIC
Definition lws-mqtt.h:281
@ LMQPROP_SERVER_KEEP_ALIVE
Definition lws-mqtt.h:286
@ LMQPROP_PAYLOAD_FORMAT_INDICATOR
Definition lws-mqtt.h:278
@ LMQPROP_REQUEST_RESPONSE_INFORMATION
Definition lws-mqtt.h:291
@ LMQPROP_REQUEST_PROBLEM_INFORMATION
Definition lws-mqtt.h:289
@ LMQPROP_CORRELATION_DATA
Definition lws-mqtt.h:282
@ LMQPROP_ASSIGNED_CLIENT_IDENTIFIER
Definition lws-mqtt.h:285
@ LMQPROP_MESSAGE_EXPIRY_INTERVAL
Definition lws-mqtt.h:279
@ LMQPROP_INVALID
Definition lws-mqtt.h:277
@ LMQPROP_MAXIMUM_QOS
Definition lws-mqtt.h:298
@ LMQPROP_SUBSCRIPTION_IDENTIFIER
Definition lws-mqtt.h:283
@ LMQPROP_SESSION_EXPIRY_INTERVAL
Definition lws-mqtt.h:284
@ LMQPROP_SERVER_REFERENCE
Definition lws-mqtt.h:293
@ LMQPROP_MAXIMUM_PACKET_SIZE
Definition lws-mqtt.h:301
@ LMQPROP_WILDCARD_SUBSCRIPTION_AVAIL
Definition lws-mqtt.h:302
@ LMQPROP_AUTHENTICATION_METHOD
Definition lws-mqtt.h:287
@ LMQPROP_CONTENT_TYPE
Definition lws-mqtt.h:280
@ LMQPROP_SUBSCRIPTION_IDENTIFIER_AVAIL
Definition lws-mqtt.h:303
@ LMQPROP_TOPIC_ALIAS_MAXIMUM
Definition lws-mqtt.h:296
@ LMQPROP_SHARED_SUBSCRIPTION_AVAIL
Definition lws-mqtt.h:304
@ LMQPROP_TOPIC_ALIAS
Definition lws-mqtt.h:297
@ LMQPROP_WILL_DELAY_INTERVAL
Definition lws-mqtt.h:290
@ LMQPROP_REASON_STRING
Definition lws-mqtt.h:294
@ LMQPROP_USER_PROPERTY
Definition lws-mqtt.h:300
LWS_VISIBLE LWS_EXTERN int lws_mqtt_client_send_subcribe(struct lws *wsi, lws_mqtt_subscribe_param_t *sub)
LWS_VISIBLE LWS_EXTERN int lws_mqtt_bindata_cmp(const lws_mqtt_str_t *bd1, const lws_mqtt_str_t *bd2)
lws_mqtt_qos_levels_t
Definition lws-mqtt.h:73
@ QOS2
Definition lws-mqtt.h:76
@ QOS1
Definition lws-mqtt.h:75
@ RESERVED_QOS_LEVEL
Definition lws-mqtt.h:77
@ QOS0
Definition lws-mqtt.h:74
@ FAILURE_QOS_LEVEL
Definition lws-mqtt.h:78
struct lws_mqtt_client_connect_param_s lws_mqtt_client_connect_param_t
lws_mqtt_qos_levels_t qos
Definition lws-mqtt.h:144
struct lws_mqtt_subscribe_param_s lws_mqtt_subscribe_param_t
LWS_VISIBLE LWS_EXTERN lws_mqtt_str_t * lws_mqtt_str_create(uint16_t lim)
const lws_mqtt_qos2_state_ops_t * qos2_state_ops
Definition lws-mqtt.h:130
struct lws_mqtt_client_connect_param_s::@337147134133274001310372237125016327334176241026 will_param
struct lws_mqtt_client_connect_param_s::@256135335250272167350155117356271130012334140062 birth_param
int(* rx_remove)(struct lws *wsi, const char *client_id, uint16_t pkt_id)
Definition lws-mqtt.h:93
int(* rx_add)(struct lws *wsi, const char *client_id, uint16_t pkt_id)
Definition lws-mqtt.h:92