MQTT Client API¶
MQTT Client API provides sequential API built on top of MQTT Client.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | /*
* MQTT client API example with GSM device.
*
* Once device is connected to network,
* it will try to connect to mosquitto test server and start the MQTT.
*
* If successfully connected, it will publish data to "lwgsm_mqtt_topic" topic every x seconds.
*
* To check if data are sent, you can use mqtt-spy PC software to inspect
* test.mosquitto.org server and subscribe to publishing topic
*/
#include "lwgsm/apps/lwgsm_mqtt_client_api.h"
#include "mqtt_client_api.h"
#include "lwgsm/lwgsm_mem.h"
#include "lwgsm/lwgsm_network_api.h"
/**
* \brief Connection information for MQTT CONNECT packet
*/
static const lwgsm_mqtt_client_info_t
mqtt_client_info = {
.keep_alive = 10,
/* Server login data */
.user = "8a215f70-a644-11e8-ac49-e932ed599553",
.pass = "26aa943f702e5e780f015cd048a91e8fb54cca28",
/* Device identifier address */
.id = "2c3573a0-0176-11e9-a056-c5cffe7f75f9",
};
/**
* \brief Memory for temporary topic
*/
static char
mqtt_topic_str[256];
/**
* \brief Generate random number and write it to string
* \param[out] str: Output string with new number
*/
void
generate_random(char* str) {
static uint32_t random_beg = 0x8916;
random_beg = random_beg * 0x00123455 + 0x85654321;
sprintf(str, "%u", (unsigned)((random_beg >> 8) & 0xFFFF));
}
/**
* \brief MQTT client API thread
*/
void
mqtt_client_api_thread(void const* arg) {
lwgsm_mqtt_client_api_p client;
lwgsm_mqtt_conn_status_t conn_status;
lwgsm_mqtt_client_api_buf_p buf;
lwgsmr_t res;
char random_str[10];
/* Request network attach */
while (lwgsm_network_request_attach() != lwgsmOK) {
lwgsm_delay(1000);
}
/* Create new MQTT API */
client = lwgsm_mqtt_client_api_new(256, 128);
if (client == NULL) {
goto terminate;
}
while (1) {
/* Make a connection */
printf("Joining MQTT server\r\n");
/* Try to join */
conn_status = lwgsm_mqtt_client_api_connect(client, "mqtt.mydevices.com", 1883, &mqtt_client_info);
if (conn_status == LWGSM_MQTT_CONN_STATUS_ACCEPTED) {
printf("Connected and accepted!\r\n");
printf("Client is ready to subscribe and publish to new messages\r\n");
} else {
printf("Connect API response: %d\r\n", (int)conn_status);
lwgsm_delay(5000);
continue;
}
/* Subscribe to topics */
sprintf(mqtt_topic_str, "v1/%s/things/%s/cmd/#", mqtt_client_info.user, mqtt_client_info.id);
if (lwgsm_mqtt_client_api_subscribe(client, mqtt_topic_str, LWGSM_MQTT_QOS_AT_LEAST_ONCE) == lwgsmOK) {
printf("Subscribed to topic\r\n");
} else {
printf("Problem subscribing to topic!\r\n");
}
while (1) {
/* Receive MQTT packet with 1000ms timeout */
res = lwgsm_mqtt_client_api_receive(client, &buf, 5000);
if (res == lwgsmOK) {
if (buf != NULL) {
printf("Publish received!\r\n");
printf("Topic: %s, payload: %s\r\n", buf->topic, buf->payload);
lwgsm_mqtt_client_api_buf_free(buf);
buf = NULL;
}
} else if (res == lwgsmCLOSED) {
printf("MQTT connection closed!\r\n");
break;
} else if (res == lwgsmTIMEOUT) {
printf("Timeout on MQTT receive function. Manually publishing.\r\n");
/* Publish data on channel 1 */
generate_random(random_str);
sprintf(mqtt_topic_str, "v1/%s/things/%s/data/1", mqtt_client_info.user, mqtt_client_info.id);
lwgsm_mqtt_client_api_publish(client, mqtt_topic_str, random_str, strlen(random_str), LWGSM_MQTT_QOS_AT_LEAST_ONCE, 0);
}
}
goto terminate;
}
terminate:
lwgsm_mqtt_client_api_delete(client);
lwgsm_network_request_detach();
printf("MQTT client thread terminate\r\n");
lwgsm_sys_thread_terminate(NULL);
}
|
-
group
LWGSM_APP_MQTT_CLIENT_API Sequential, single thread MQTT client API.
Typedefs
-
typedef struct lwgsm_mqtt_client_api_buf *
lwgsm_mqtt_client_api_buf_p¶ Pointer to lwgsm_mqtt_client_api_buf_t structure.
Functions
-
lwgsm_mqtt_client_api_p
lwgsm_mqtt_client_api_new(size_t tx_buff_len, size_t rx_buff_len)¶ Create new MQTT client API.
- Return
Client handle on success,
NULLotherwise- Parameters
[in] tx_buff_len: Maximal TX buffer for maximal packet length[in] rx_buff_len: Maximal RX buffer
-
void
lwgsm_mqtt_client_api_delete(lwgsm_mqtt_client_api_p client)¶ Delete client from memory.
- Parameters
[in] client: MQTT API client handle
-
lwgsm_mqtt_conn_status_t
lwgsm_mqtt_client_api_connect(lwgsm_mqtt_client_api_p client, const char *host, lwgsm_port_t port, const lwgsm_mqtt_client_info_t *info)¶ Connect to MQTT broker.
- Return
LWGSM_MQTT_CONN_STATUS_ACCEPTED on success, member of lwgsm_mqtt_conn_status_t otherwise
- Parameters
[in] client: MQTT API client handle[in] host: TCP host[in] port: TCP port[in] info: MQTT client info
-
lwgsmr_t
lwgsm_mqtt_client_api_subscribe(lwgsm_mqtt_client_api_p client, const char *topic, lwgsm_mqtt_qos_t qos)¶ Subscribe to topic.
- Return
- Parameters
[in] client: MQTT API client handle[in] topic: Topic to subscribe on[in] qos: Quality of service. This parameter can be a value of lwgsm_mqtt_qos_t
-
lwgsmr_t
lwgsm_mqtt_client_api_unsubscribe(lwgsm_mqtt_client_api_p client, const char *topic)¶ Unsubscribe from topic.
-
lwgsmr_t
lwgsm_mqtt_client_api_publish(lwgsm_mqtt_client_api_p client, const char *topic, const void *data, size_t btw, lwgsm_mqtt_qos_t qos, uint8_t retain)¶ Publish new packet to MQTT network.
- Return
- Parameters
[in] client: MQTT API client handle[in] topic: Topic to publish on[in] data: Data to send[in] btw: Number of bytes to send for data parameter[in] qos: Quality of service. This parameter can be a value of lwgsm_mqtt_qos_t[in] retain: Set to1for retain flag,0otherwise
-
uint8_t
lwgsm_mqtt_client_api_is_connected(lwgsm_mqtt_client_api_p client)¶ Check if client MQTT connection is active.
- Return
1on success,0otherwise- Parameters
[in] client: MQTT API client handle
-
lwgsmr_t
lwgsm_mqtt_client_api_receive(lwgsm_mqtt_client_api_p client, lwgsm_mqtt_client_api_buf_p *p, uint32_t timeout)¶ Receive next packet in specific timeout time.
- Note
This function can be called from separate thread than the rest of API function, which allows you to handle receive data separated with custom timeout
- Return
lwgsmOK on success, lwgsmCLOSED if MQTT is closed, lwgsmTIMEOUT on timeout
- Parameters
[in] client: MQTT API client handle[in] p: Pointer to output buffer[in] timeout: Maximal time to wait before function returns timeout
-
void
lwgsm_mqtt_client_api_buf_free(lwgsm_mqtt_client_api_buf_p p)¶ Free buffer memory after usage.
- Parameters
[in] p: Buffer to free
-
struct
lwgsm_mqtt_client_api_buf_t¶ - #include <lwgsm_mqtt_client_api.h>
MQTT API RX buffer.
-
typedef struct lwgsm_mqtt_client_api_buf *