diff --git a/examples/mqtt_tcp/main/Kconfig.projbuild b/examples/mqtt_tcp/main/Kconfig.projbuild index 1c9c2e6..0310c2c 100644 --- a/examples/mqtt_tcp/main/Kconfig.projbuild +++ b/examples/mqtt_tcp/main/Kconfig.projbuild @@ -12,4 +12,10 @@ config WIFI_PASSWORD help WiFi password (WPA or WPA2) for the example to use. +config BROKER_URL + string "Broker URL" + default "mqtt://iot.eclipse.org" + help + URL of the broker to connect to + endmenu diff --git a/examples/mqtt_tcp/main/app_main.c b/examples/mqtt_tcp/main/app_main.c index 05ee57a..d690b1c 100755 --- a/examples/mqtt_tcp/main/app_main.c +++ b/examples/mqtt_tcp/main/app_main.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -34,14 +35,17 @@ static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event) switch (event->event_id) { case MQTT_EVENT_CONNECTED: ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); - msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); - ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_3", 0, 1, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); - msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); - ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + // msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + // ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); - msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); - ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + // msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + // ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + // msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + // ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); break; case MQTT_EVENT_DISCONNECTED: ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); @@ -49,8 +53,8 @@ static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event) case MQTT_EVENT_SUBSCRIBED: ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); - msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); - ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + // msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + // ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); break; case MQTT_EVENT_UNSUBSCRIBED: ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); @@ -114,12 +118,31 @@ static void wifi_init(void) static void mqtt_app_start(void) { - const esp_mqtt_client_config_t mqtt_cfg = { - .uri = "mqtt://iot.eclipse.org", + char line[128]; + esp_mqtt_client_config_t mqtt_cfg = { + .uri = CONFIG_BROKER_URL, .event_handle = mqtt_event_handler, // .user_context = (void *)your_context }; + if (strcmp(mqtt_cfg.uri, "FROM_STDIN") == 0) { + int count = 0; + printf("Please enter url of mqtt broker\n"); + while (count < 128) { + int c = fgetc(stdin); + if (c == '\n') { + line[count] = '\0'; + break; + } else if (c > 0 && c < 127) { + line[count] = c; + ++count; + } + vTaskDelay(10 / portTICK_PERIOD_MS); + } + mqtt_cfg.uri = line; + printf("Broker url: %s\n", line); + } + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); esp_mqtt_client_start(client); } diff --git a/examples/mqtt_ws/main/app_main.c b/examples/mqtt_ws/main/app_main.c index c9c65a5..2ebc65e 100755 --- a/examples/mqtt_ws/main/app_main.c +++ b/examples/mqtt_ws/main/app_main.c @@ -40,8 +40,8 @@ static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event) msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); - msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); - ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + // msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + // ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); break; case MQTT_EVENT_DISCONNECTED: ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); @@ -49,7 +49,10 @@ static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event) case MQTT_EVENT_SUBSCRIBED: ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); - msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_1", 0, 1, 0); + printf("sending msgid=%d\n", msg_id); + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data_0", 0, 0, 0); + printf("sending msgid=%d\n", msg_id); ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); break; case MQTT_EVENT_UNSUBSCRIBED: diff --git a/lib/transport.c b/lib/transport.c deleted file mode 100644 index 04f3939..0000000 --- a/lib/transport.c +++ /dev/null @@ -1,218 +0,0 @@ -#include -#include - -#include "rom/queue.h" -#include "esp_log.h" - -#include "transport.h" -#include "platform.h" - - -static const char *TAG = "TRANSPORT"; - -/** - * Transport layer structure, which will provide functions, basic properties for transport types - */ -struct transport_item_t { - int port; - int socket; /*!< Socket to use in this transport */ - char *scheme; /*!< Tag name */ - void *context; /*!< Context data */ - void *data; /*!< Additional transport data */ - connect_func _connect; /*!< Connect function of this transport */ - io_read_func _read; /*!< Read */ - io_func _write; /*!< Write */ - trans_func _close; /*!< Close */ - poll_func _poll_read; /*!< Poll and read */ - poll_func _poll_write; /*!< Poll and write */ - trans_func _destroy; /*!< Destroy and free transport */ - STAILQ_ENTRY(transport_item_t) next; -}; - - -/** - * This list will hold all transport available - */ -STAILQ_HEAD(transport_list_t, transport_item_t); - - -transport_list_handle_t transport_list_init() -{ - transport_list_handle_t list = calloc(1, sizeof(struct transport_list_t)); - ESP_MEM_CHECK(TAG, list, return NULL); - STAILQ_INIT(list); - return list; -} - -esp_err_t transport_list_add(transport_list_handle_t list, transport_handle_t t, const char *scheme) -{ - if (list == NULL || t == NULL) { - return ESP_ERR_INVALID_ARG; - } - t->scheme = calloc(1, strlen(scheme) + 1); - ESP_MEM_CHECK(TAG, t->scheme, return ESP_ERR_NO_MEM); - strcpy(t->scheme, scheme); - STAILQ_INSERT_TAIL(list, t, next); - return ESP_OK; -} - -transport_handle_t transport_list_get_transport(transport_list_handle_t list, const char *scheme) -{ - if (!list) { - return NULL; - } - if (scheme == NULL) { - return STAILQ_FIRST(list); - } - transport_handle_t item; - STAILQ_FOREACH(item, list, next) { - if (strcasecmp(item->scheme, scheme) == 0) { - return item; - } - } - return NULL; -} - -esp_err_t transport_list_destroy(transport_list_handle_t list) -{ - transport_list_clean(list); - free(list); - return ESP_OK; -} - -esp_err_t transport_list_clean(transport_list_handle_t list) -{ - transport_handle_t item = STAILQ_FIRST(list); - transport_handle_t tmp; - while (item != NULL) { - tmp = STAILQ_NEXT(item, next); - if (item->_destroy) { - item->_destroy(item); - } - transport_destroy(item); - item = tmp; - } - STAILQ_INIT(list); - return ESP_OK; -} - -transport_handle_t transport_init() -{ - transport_handle_t t = calloc(1, sizeof(struct transport_item_t)); - ESP_MEM_CHECK(TAG, t, return NULL); - return t; -} - -esp_err_t transport_destroy(transport_handle_t t) -{ - if (t->scheme) { - free(t->scheme); - } - free(t); - return ESP_OK; -} - -int transport_connect(transport_handle_t t, const char *host, int port, int timeout_ms) -{ - int ret = -1; - if (t && t->_connect) { - return t->_connect(t, host, port, timeout_ms); - } - return ret; -} - -int transport_read(transport_handle_t t, char *buffer, int len, int timeout_ms) -{ - if (t && t->_read) { - return t->_read(t, buffer, len, timeout_ms); - } - return -1; -} - -int transport_write(transport_handle_t t, const char *buffer, int len, int timeout_ms) -{ - if (t && t->_write) { - return t->_write(t, buffer, len, timeout_ms); - } - return -1; -} - -int transport_poll_read(transport_handle_t t, int timeout_ms) -{ - if (t && t->_poll_read) { - return t->_poll_read(t, timeout_ms); - } - return -1; -} - -int transport_poll_write(transport_handle_t t, int timeout_ms) -{ - if (t && t->_poll_write) { - return t->_poll_write(t, timeout_ms); - } - return -1; -} - -int transport_close(transport_handle_t t) -{ - if (t && t->_close) { - return t->_close(t); - } - return 0; -} - -void *transport_get_context_data(transport_handle_t t) -{ - if (t) { - return t->data; - } - return NULL; -} - -esp_err_t transport_set_context_data(transport_handle_t t, void *data) -{ - if (t) { - t->data = data; - return ESP_OK; - } - return ESP_FAIL; -} - -esp_err_t transport_set_func(transport_handle_t t, - connect_func _connect, - io_read_func _read, - io_func _write, - trans_func _close, - poll_func _poll_read, - poll_func _poll_write, - trans_func _destroy) -{ - if (t == NULL) { - return ESP_FAIL; - } - t->_connect = _connect; - t->_read = _read; - t->_write = _write; - t->_close = _close; - t->_poll_read = _poll_read; - t->_poll_write = _poll_write; - t->_destroy = _destroy; - return ESP_OK; -} - -int transport_get_default_port(transport_handle_t t) -{ - if (t == NULL) { - return -1; - } - return t->port; -} - -esp_err_t transport_set_default_port(transport_handle_t t, int port) -{ - if (t == NULL) { - return ESP_FAIL; - } - t->port = port; - return ESP_OK; -} diff --git a/lib/transport_ssl.c b/lib/transport_ssl.c deleted file mode 100644 index a2169c3..0000000 --- a/lib/transport_ssl.c +++ /dev/null @@ -1,259 +0,0 @@ -#include -#include - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "lwip/err.h" -#include "lwip/sockets.h" -#include "lwip/sys.h" -#include "lwip/netdb.h" -#include "lwip/dns.h" - -#include "mbedtls/platform.h" -#include "mbedtls/net_sockets.h" -#include "mbedtls/esp_debug.h" -#include "mbedtls/ssl.h" -#include "mbedtls/entropy.h" -#include "mbedtls/ctr_drbg.h" -#include "mbedtls/error.h" -#include "mbedtls/certs.h" - - -#include "esp_log.h" -#include "esp_system.h" -#include "platform.h" - -#include "transport.h" -#include "transport_ssl.h" - -static const char *TAG = "TRANS_SSL"; -/** - * mbedtls specific transport data - */ -typedef struct { - mbedtls_entropy_context entropy; - mbedtls_ctr_drbg_context ctr_drbg; - mbedtls_ssl_context ctx; - mbedtls_x509_crt cacert; - mbedtls_ssl_config conf; - mbedtls_net_context client_fd; - void *cert_pem_data; - int cert_pem_len; - bool ssl_initialized; - bool verify_server; -} transport_ssl_t; - -static int ssl_close(transport_handle_t t); - -static int ssl_connect(transport_handle_t t, const char *host, int port, int timeout_ms) -{ - int ret = -1, flags; - struct timeval tv; - transport_ssl_t *ssl = transport_get_context_data(t); - - if (!ssl) { - return -1; - } - ssl->ssl_initialized = true; - mbedtls_ssl_init(&ssl->ctx); - mbedtls_ctr_drbg_init(&ssl->ctr_drbg); - mbedtls_ssl_config_init(&ssl->conf); - mbedtls_entropy_init(&ssl->entropy); - - if ((ret = mbedtls_ssl_config_defaults(&ssl->conf, - MBEDTLS_SSL_IS_CLIENT, - MBEDTLS_SSL_TRANSPORT_STREAM, - MBEDTLS_SSL_PRESET_DEFAULT)) != 0) { - ESP_LOGE(TAG, "mbedtls_ssl_config_defaults returned %d", ret); - goto exit; - } - - if ((ret = mbedtls_ctr_drbg_seed(&ssl->ctr_drbg, mbedtls_entropy_func, &ssl->entropy, NULL, 0)) != 0) { - ESP_LOGE(TAG, "mbedtls_ctr_drbg_seed returned %d", ret); - goto exit; - } - - if (ssl->cert_pem_data) { - mbedtls_x509_crt_init(&ssl->cacert); - ssl->verify_server = true; - if ((ret = mbedtls_x509_crt_parse(&ssl->cacert, ssl->cert_pem_data, ssl->cert_pem_len + 1)) < 0) { - ESP_LOGE(TAG, "mbedtls_x509_crt_parse returned -0x%x\n\nDATA=%s,len=%d", -ret, (char*)ssl->cert_pem_data, ssl->cert_pem_len); - goto exit; - } - mbedtls_ssl_conf_ca_chain(&ssl->conf, &ssl->cacert, NULL); - mbedtls_ssl_conf_authmode(&ssl->conf, MBEDTLS_SSL_VERIFY_REQUIRED); - - if ((ret = mbedtls_ssl_set_hostname(&ssl->ctx, host)) != 0) { - ESP_LOGE(TAG, "mbedtls_ssl_set_hostname returned -0x%x", -ret); - goto exit; - } - } else { - mbedtls_ssl_conf_authmode(&ssl->conf, MBEDTLS_SSL_VERIFY_NONE); - } - - - mbedtls_ssl_conf_rng(&ssl->conf, mbedtls_ctr_drbg_random, &ssl->ctr_drbg); - -#ifdef CONFIG_MBEDTLS_DEBUG - mbedtls_esp_enable_debug_log(&ssl->conf, 4); -#endif - - if ((ret = mbedtls_ssl_setup(&ssl->ctx, &ssl->conf)) != 0) { - ESP_LOGE(TAG, "mbedtls_ssl_setup returned -0x%x\n\n", -ret); - goto exit; - } - - mbedtls_net_init(&ssl->client_fd); - - ms_to_timeval(timeout_ms, &tv); - - setsockopt(ssl->client_fd.fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); - ESP_LOGD(TAG, "Connect to %s:%d", host, port); - char port_str[8] = {0}; - sprintf(port_str, "%d", port); - if ((ret = mbedtls_net_connect(&ssl->client_fd, host, port_str, MBEDTLS_NET_PROTO_TCP)) != 0) { - ESP_LOGE(TAG, "mbedtls_net_connect returned -%x", -ret); - goto exit; - } - - mbedtls_ssl_set_bio(&ssl->ctx, &ssl->client_fd, mbedtls_net_send, mbedtls_net_recv, NULL); - - if((ret = mbedtls_ssl_set_hostname(&ssl->ctx, host)) != 0) { - ESP_LOGE(TAG, " failed\n ! mbedtls_ssl_set_hostname returned %d\n\n", ret); - goto exit; - } - - ESP_LOGD(TAG, "Performing the SSL/TLS handshake..."); - - while ((ret = mbedtls_ssl_handshake(&ssl->ctx)) != 0) { - if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) { - ESP_LOGE(TAG, "mbedtls_ssl_handshake returned -0x%x", -ret); - goto exit; - } - } - - ESP_LOGD(TAG, "Verifying peer X.509 certificate..."); - - if ((flags = mbedtls_ssl_get_verify_result(&ssl->ctx)) != 0) { - /* In real life, we probably want to close connection if ret != 0 */ - ESP_LOGW(TAG, "Failed to verify peer certificate!"); - if (ssl->cert_pem_data) { - goto exit; - } - } else { - ESP_LOGD(TAG, "Certificate verified."); - } - - ESP_LOGD(TAG, "Cipher suite is %s", mbedtls_ssl_get_ciphersuite(&ssl->ctx)); - return ret; -exit: - ssl_close(t); - return ret; -} - -static int ssl_poll_read(transport_handle_t t, int timeout_ms) -{ - transport_ssl_t *ssl = transport_get_context_data(t); - fd_set readset; - FD_ZERO(&readset); - FD_SET(ssl->client_fd.fd, &readset); - struct timeval timeout; - ms_to_timeval(timeout_ms, &timeout); - - return select(ssl->client_fd.fd + 1, &readset, NULL, NULL, &timeout); -} - -static int ssl_poll_write(transport_handle_t t, int timeout_ms) -{ - transport_ssl_t *ssl = transport_get_context_data(t); - fd_set writeset; - FD_ZERO(&writeset); - FD_SET(ssl->client_fd.fd, &writeset); - struct timeval timeout; - ms_to_timeval(timeout_ms, &timeout); - return select(ssl->client_fd.fd + 1, NULL, &writeset, NULL, &timeout); -} - -static int ssl_write(transport_handle_t t, const char *buffer, int len, int timeout_ms) -{ - int poll, ret; - transport_ssl_t *ssl = transport_get_context_data(t); - - if ((poll = transport_poll_write(t, timeout_ms)) <= 0) { - ESP_LOGW(TAG, "Poll timeout or error, errno=%s, fd=%d, timeout_ms=%d", strerror(errno), ssl->client_fd.fd, timeout_ms); - return poll; - } - ret = mbedtls_ssl_write(&ssl->ctx, (const unsigned char *) buffer, len); - if (ret <= 0) { - ESP_LOGE(TAG, "mbedtls_ssl_write error, errno=%s", strerror(errno)); - } - return ret; -} - -static int ssl_read(transport_handle_t t, char *buffer, int len, int timeout_ms) -{ - int poll = -1, ret; - transport_ssl_t *ssl = transport_get_context_data(t); - - if (mbedtls_ssl_get_bytes_avail(&ssl->ctx) <= 0) { - if ((poll = transport_poll_read(t, timeout_ms)) <= 0) { - return poll; - } - } - ret = mbedtls_ssl_read(&ssl->ctx, (unsigned char *)buffer, len); - if (ret == 0) { - return -1; - } - return ret; -} - -static int ssl_close(transport_handle_t t) -{ - int ret = -1; - transport_ssl_t *ssl = transport_get_context_data(t); - if (ssl->ssl_initialized) { - ESP_LOGD(TAG, "Cleanup mbedtls"); - mbedtls_ssl_close_notify(&ssl->ctx); - mbedtls_ssl_session_reset(&ssl->ctx); - mbedtls_net_free(&ssl->client_fd); - mbedtls_ssl_config_free(&ssl->conf); - if (ssl->verify_server) { - mbedtls_x509_crt_free(&ssl->cacert); - } - mbedtls_ctr_drbg_free(&ssl->ctr_drbg); - mbedtls_entropy_free(&ssl->entropy); - mbedtls_ssl_free(&ssl->ctx); - ssl->ssl_initialized = false; - ssl->verify_server = false; - } - return ret; -} - -static int ssl_destroy(transport_handle_t t) -{ - transport_ssl_t *ssl = transport_get_context_data(t); - transport_close(t); - free(ssl); - return 0; -} - -void transport_ssl_set_cert_data(transport_handle_t t, const char *data, int len) -{ - transport_ssl_t *ssl = transport_get_context_data(t); - if (t && ssl) { - ssl->cert_pem_data = (void *)data; - ssl->cert_pem_len = len; - } -} - -transport_handle_t transport_ssl_init() -{ - transport_handle_t t = transport_init(); - transport_ssl_t *ssl = calloc(1, sizeof(transport_ssl_t)); - ESP_MEM_CHECK(TAG, ssl, return NULL); - mbedtls_net_init(&ssl->client_fd); - transport_set_context_data(t, ssl); - transport_set_func(t, ssl_connect, ssl_read, ssl_write, ssl_close, ssl_poll_read, ssl_poll_write, ssl_destroy); - return t; -} - diff --git a/lib/transport_tcp.c b/lib/transport_tcp.c deleted file mode 100644 index e98ce93..0000000 --- a/lib/transport_tcp.c +++ /dev/null @@ -1,152 +0,0 @@ -#include -#include - -#include "lwip/sockets.h" -#include "lwip/dns.h" -#include "lwip/netdb.h" - -#include "esp_log.h" -#include "esp_system.h" -#include "esp_err.h" - -#include "platform.h" -#include "transport.h" - -static const char *TAG = "TRANS_TCP"; - -typedef struct { - int sock; -} transport_tcp_t; - -static int resolve_dns(const char *host, struct sockaddr_in *ip) { - - struct hostent *he; - struct in_addr **addr_list; - he = gethostbyname(host); - if (he == NULL) { - return ESP_FAIL; - } - addr_list = (struct in_addr **)he->h_addr_list; - if (addr_list[0] == NULL) { - return ESP_FAIL; - } - ip->sin_family = AF_INET; - memcpy(&ip->sin_addr, addr_list[0], sizeof(ip->sin_addr)); - return ESP_OK; -} - -static int tcp_connect(transport_handle_t t, const char *host, int port, int timeout_ms) -{ - struct sockaddr_in remote_ip; - struct timeval tv; - transport_tcp_t *tcp = transport_get_context_data(t); - - bzero(&remote_ip, sizeof(struct sockaddr_in)); - - //if stream_host is not ip address, resolve it AF_INET,servername,&serveraddr.sin_addr - if (inet_pton(AF_INET, host, &remote_ip.sin_addr) != 1) { - if (resolve_dns(host, &remote_ip) < 0) { - return -1; - } - } - - tcp->sock = socket(PF_INET, SOCK_STREAM, 0); - - if (tcp->sock < 0) { - ESP_LOGE(TAG, "Error create socket"); - return -1; - } - - remote_ip.sin_family = AF_INET; - remote_ip.sin_port = htons(port); - - ms_to_timeval(timeout_ms, &tv); - - setsockopt(tcp->sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); - - ESP_LOGD(TAG, "[sock=%d],connecting to server IP:%s,Port:%d...", - tcp->sock, ipaddr_ntoa((const ip_addr_t*)&remote_ip.sin_addr.s_addr), port); - if (connect(tcp->sock, (struct sockaddr *)(&remote_ip), sizeof(struct sockaddr)) != 0) { - close(tcp->sock); - tcp->sock = -1; - return -1; - } - return tcp->sock; -} - -static int tcp_write(transport_handle_t t, const char *buffer, int len, int timeout_ms) -{ - int poll; - transport_tcp_t *tcp = transport_get_context_data(t); - if ((poll = transport_poll_write(t, timeout_ms)) <= 0) { - return poll; - } - return write(tcp->sock, buffer, len); -} - -static int tcp_read(transport_handle_t t, char *buffer, int len, int timeout_ms) -{ - transport_tcp_t *tcp = transport_get_context_data(t); - int poll = -1; - if ((poll = transport_poll_read(t, timeout_ms)) <= 0) { - return poll; - } - int read_len = read(tcp->sock, buffer, len); - if (read_len == 0) { - return -1; - } - return read_len; -} - -static int tcp_poll_read(transport_handle_t t, int timeout_ms) -{ - transport_tcp_t *tcp = transport_get_context_data(t); - fd_set readset; - FD_ZERO(&readset); - FD_SET(tcp->sock, &readset); - struct timeval timeout; - ms_to_timeval(timeout_ms, &timeout); - return select(tcp->sock + 1, &readset, NULL, NULL, &timeout); -} - -static int tcp_poll_write(transport_handle_t t, int timeout_ms) -{ - transport_tcp_t *tcp = transport_get_context_data(t); - fd_set writeset; - FD_ZERO(&writeset); - FD_SET(tcp->sock, &writeset); - struct timeval timeout; - ms_to_timeval(timeout_ms, &timeout); - return select(tcp->sock + 1, NULL, &writeset, NULL, &timeout); -} - -static int tcp_close(transport_handle_t t) -{ - transport_tcp_t *tcp = transport_get_context_data(t); - int ret = -1; - if (tcp->sock >= 0) { - ret = close(tcp->sock); - tcp->sock = -1; - } - return ret; -} - -static esp_err_t tcp_destroy(transport_handle_t t) -{ - transport_tcp_t *tcp = transport_get_context_data(t); - transport_close(t); - free(tcp); - return 0; -} - -transport_handle_t transport_tcp_init() -{ - transport_handle_t t = transport_init(); - transport_tcp_t *tcp = calloc(1, sizeof(transport_tcp_t)); - ESP_MEM_CHECK(TAG, tcp, return NULL); - tcp->sock = -1; - transport_set_func(t, tcp_connect, tcp_read, tcp_write, tcp_close, tcp_poll_read, tcp_poll_write, tcp_destroy); - transport_set_context_data(t, tcp); - - return t; -} diff --git a/lib/transport_ws.c b/lib/transport_ws.c index df0ae1b..59599ec 100644 --- a/lib/transport_ws.c +++ b/lib/transport_ws.c @@ -98,7 +98,7 @@ static int ws_connect(transport_handle_t t, const char *host, int port, int time unsigned char client_key_b64[64], valid_client_key[20], accept_key[32] = {0}; int key_len = sprintf((char*)client_key_b64, "%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", (char*)client_key); - mbedtls_sha1(client_key_b64, (size_t)key_len, valid_client_key); + mbedtls_sha1_ret(client_key_b64, (size_t)key_len, valid_client_key); mbedtls_base64_encode(accept_key, 32, &outlen, valid_client_key, 20); accept_key[outlen] = 0; ESP_LOGD(TAG, "server key=%s, send_key=%s, accept_key=%s", (char *)server_key, (char*)client_key, accept_key); diff --git a/mqtt_client.c b/mqtt_client.c index f9f9a44..fd1cedb 100644 --- a/mqtt_client.c +++ b/mqtt_client.c @@ -844,6 +844,10 @@ int esp_mqtt_client_publish(esp_mqtt_client_handle_t client, const char *topic, if (len <= 0) { len = strlen(data); } + // Note: Need to enqueue the qos>0 msg + // if (qos > 0) { + // mqtt_enqueue(client); + // } client->mqtt_state.outbound_message = mqtt_msg_publish(&client->mqtt_state.mqtt_connection, topic, data, len, @@ -853,6 +857,7 @@ int esp_mqtt_client_publish(esp_mqtt_client_handle_t client, const char *topic, client->mqtt_state.pending_msg_type = mqtt_get_type(client->mqtt_state.outbound_message->data); client->mqtt_state.pending_msg_id = pending_msg_id; client->mqtt_state.pending_msg_count ++; + // Note: Need to enqueue the qos>0 msg to pass https://code.google.com/archive/p/mqtt4erl/wikis/QualityOfServiceUseCases.wiki mqtt_enqueue(client); }