mirror of
https://github.com/nodemcu/nodemcu-firmware.git
synced 2025-02-06 21:18:25 +08:00
c695a451ee
* mqtt: remove concept of connection timeout Just rely on the network stack to tell us when things have gone south. * mqtt: remove write-only mqtt_state.port field * mqtt: drop useless conditional * mqtt: decouple message sent flag from timer * mqtt: reconnect callback does not need to hang up The network stack has certainly done that for us at this point. Similarly, since we're about to call mqtt_socket_disconnected, don't bother unregistering the timer here, either. * mqtt: don't tick once per second Set the timer for the duration of the wait and cancel it on the other side. * mqtt: defer message queue destruction to _disconnect We're going to want to publish a disconnect message for real, so doing this in _close does no one any favors * mqtt: miscellaneous cleanups No functional change intended * mqtt: close() should send disconnect message for real This means waiting for _sent() to fire again before telling the network stack to disconnect. * mqtt: tidy connect and dns - Push the self-ref to after all allocations and error returns - Don't try to extract IPv4 from the domain string ourselves, let the resolver, since it can - Don't try to connect to localhost. That can't possibly work. * mqtt: common up some callback invocations * mqtt: don't retransmit messages on timeout There's no point in retransmitting messages on timeout; the network stack will be trying to do it for us anyway. * mqtt: remove unnecessary NULL udata checks * mqtt: hold strings in Lua, not C Eliminates a host of C-side allocations. While here, move the rest of the mqtt_connect_info structure out to its own thing, and pack some flags using a bitfield. * mqtt: mqtt_socket_on use lua_checkoption * mqtt: slightly augment debug messages These changes have made some debugging ever so slightly easier.
86 lines
1.7 KiB
C
86 lines
1.7 KiB
C
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include "msg_queue.h"
|
|
#include "user_config.h"
|
|
|
|
msg_queue_t *msg_enqueue(msg_queue_t **head, mqtt_message_t *msg, uint16_t msg_id, int msg_type, int publish_qos){
|
|
if(!head){
|
|
return NULL;
|
|
}
|
|
if (!msg || !msg->data || msg->length == 0){
|
|
NODE_DBG("empty message\n");
|
|
return NULL;
|
|
}
|
|
msg_queue_t *node = (msg_queue_t *)calloc(1,sizeof(msg_queue_t));
|
|
if(!node){
|
|
NODE_DBG("not enough memory\n");
|
|
return NULL;
|
|
}
|
|
|
|
node->sent = 0;
|
|
|
|
node->msg.data = (uint8_t *)calloc(1,msg->length);
|
|
if(!node->msg.data){
|
|
NODE_DBG("not enough memory\n");
|
|
free(node);
|
|
return NULL;
|
|
}
|
|
memcpy(node->msg.data, msg->data, msg->length);
|
|
node->msg.length = msg->length;
|
|
node->next = NULL;
|
|
node->msg_id = msg_id;
|
|
node->msg_type = msg_type;
|
|
node->publish_qos = publish_qos;
|
|
|
|
msg_queue_t *tail = *head;
|
|
if(tail){
|
|
while(tail->next!=NULL) tail = tail->next;
|
|
tail->next = node;
|
|
} else {
|
|
*head = node;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
void msg_destroy(msg_queue_t *node){
|
|
if(!node) return;
|
|
if(node->msg.data){
|
|
free(node->msg.data);
|
|
node->msg.data = NULL;
|
|
}
|
|
free(node);
|
|
}
|
|
|
|
msg_queue_t * msg_dequeue(msg_queue_t **head){
|
|
if(!head || !*head){
|
|
return NULL;
|
|
}
|
|
msg_queue_t *node = *head; // fetch head.
|
|
*head = node->next; // update head.
|
|
node->next = NULL;
|
|
return node;
|
|
}
|
|
|
|
msg_queue_t * msg_peek(msg_queue_t **head){
|
|
if(!head || !*head){
|
|
return NULL;
|
|
}
|
|
return *head; // fetch head.
|
|
}
|
|
|
|
int msg_size(msg_queue_t **head){
|
|
if(!head || !*head){
|
|
return 0;
|
|
}
|
|
int i = 1;
|
|
msg_queue_t *tail = *head;
|
|
if(tail){
|
|
while(tail->next!=NULL){
|
|
tail = tail->next;
|
|
i++;
|
|
}
|
|
}
|
|
return i;
|
|
}
|