/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client *mqttClient) { //espconn_secure_set_size(0x01,6*1024); // try to modify memory size 6*1024 if ssl/tls handshake failed if (mqttClient->pCon) { // Clean up the old connection forcefully - using MQTT_Disconnect // does not actually release the old connection until the // disconnection callback is invoked. mqtt_tcpclient_delete(mqttClient); } mqttClient->pCon = (struct espconn *)os_zalloc(sizeof(struct espconn)); mqttClient->pCon->type = ESPCONN_TCP; mqttClient->pCon->state = ESPCONN_NONE; mqttClient->pCon->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); mqttClient->pCon->proto.tcp->local_port = espconn_port(); mqttClient->pCon->proto.tcp->remote_port = mqttClient->port; mqttClient->pCon->reverse = mqttClient; espconn_regist_connectcb(mqttClient->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(mqttClient->pCon, mqtt_tcpclient_recon_cb); mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; os_timer_disarm(&mqttClient->mqttTimer); os_timer_setfn(&mqttClient->mqttTimer, (os_timer_func_t *)mqtt_timer, mqttClient); os_timer_arm(&mqttClient->mqttTimer, 1000, 1); os_printf("your ESP SSL/TLS configuration is %d.[0:NO_TLS\t1:TLS_WITHOUT_AUTHENTICATION\t2ONE_WAY_ANTHENTICATION\t3TWO_WAY_ANTHENTICATION]\n",DEFAULT_SECURITY); if (UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); if (mqttClient->security) { #ifdef MQTT_SSL_ENABLE if(DEFAULT_SECURITY >= ONE_WAY_ANTHENTICATION ) { espconn_secure_ca_enable(ESPCONN_CLIENT,CA_CERT_FLASH_ADDRESS); } if(DEFAULT_SECURITY >= TWO_WAY_ANTHENTICATION) { espconn_secure_cert_req_enable(ESPCONN_CLIENT,CLIENT_CERT_FLASH_ADDRESS); } espconn_secure_connect(mqttClient->pCon); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_connect(mqttClient->pCon); } } else { INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
/** * @brief Delete MQTT client and free all memory * @param mqttClient: The mqtt client * @retval None */ void ICACHE_FLASH_ATTR mqtt_client_delete(MQTT_Client *mqttClient) { mqtt_tcpclient_delete(mqttClient); if (mqttClient->host != NULL) { os_free(mqttClient->host); mqttClient->host = NULL; } if (mqttClient->user_data != NULL) { os_free(mqttClient->user_data); mqttClient->user_data = NULL; } if(mqttClient->connect_info.client_id != NULL) { os_free(mqttClient->connect_info.client_id); mqttClient->connect_info.client_id = NULL; } if(mqttClient->connect_info.username != NULL) { os_free(mqttClient->connect_info.username); mqttClient->connect_info.username = NULL; } if(mqttClient->connect_info.password != NULL) { os_free(mqttClient->connect_info.password); mqttClient->connect_info.password = NULL; } if(mqttClient->connect_info.will_topic != NULL) { os_free(mqttClient->connect_info.will_topic); mqttClient->connect_info.will_topic = NULL; } if(mqttClient->connect_info.will_message != NULL) { os_free(mqttClient->connect_info.will_message); mqttClient->connect_info.will_message = NULL; } if(mqttClient->mqtt_state.in_buffer != NULL) { os_free(mqttClient->mqtt_state.in_buffer); mqttClient->mqtt_state.in_buffer = NULL; } if(mqttClient->mqtt_state.out_buffer != NULL) { os_free(mqttClient->mqtt_state.out_buffer); mqttClient->mqtt_state.out_buffer = NULL; } }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client *mqttClient) { if (mqttClient->pCon) { // Clean up the old connection forcefully - using MQTT_Disconnect // does not actually release the old connection until the // disconnection callback is invoked. mqtt_tcpclient_delete(mqttClient); } mqttClient->pCon = (struct espconn *)os_zalloc(sizeof(struct espconn)); mqttClient->pCon->type = ESPCONN_TCP; mqttClient->pCon->state = ESPCONN_NONE; mqttClient->pCon->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); mqttClient->pCon->proto.tcp->local_port = espconn_port(); mqttClient->pCon->proto.tcp->remote_port = mqttClient->port; mqttClient->pCon->reverse = mqttClient; espconn_regist_connectcb(mqttClient->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(mqttClient->pCon, mqtt_tcpclient_recon_cb); mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; os_timer_disarm(&mqttClient->mqttTimer); os_timer_setfn(&mqttClient->mqttTimer, (os_timer_func_t *)mqtt_timer, mqttClient); os_timer_arm(&mqttClient->mqttTimer, 1000, 1); if (UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { MQTT_INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); if (mqttClient->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_set_size(ESPCONN_CLIENT, MQTT_SSL_SIZE); espconn_secure_connect(mqttClient->pCon); #else MQTT_INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_connect(mqttClient->pCon); } } else { MQTT_INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
/** * @brief Begin connect to MQTT broker * @param client: MQTT_Client reference * @retval None */ void ICACHE_FLASH_ATTR MQTT_Connect(MQTT_Client *mqttClient) { if (mqttClient->pCon) { // Clean up the old connection forcefully - using MQTT_Disconnect // does not actually release the old connection until the // disconnection callback is invoked. mqtt_tcpclient_delete(mqttClient); } mqttClient->pCon = (struct espconn *)calloc(1, sizeof(struct espconn)); mqttClient->pCon->type = ESPCONN_TCP; mqttClient->pCon->state = ESPCONN_NONE; mqttClient->pCon->proto.tcp = (esp_tcp *)calloc(1, sizeof(esp_tcp)); mqttClient->pCon->proto.tcp->local_port = espconn_port(); mqttClient->pCon->proto.tcp->remote_port = mqttClient->port; mqttClient->pCon->reserve = mqttClient; espconn_regist_connectcb(mqttClient->pCon, mqtt_tcpclient_connect_cb); espconn_regist_reconcb(mqttClient->pCon, mqtt_tcpclient_recon_cb); mqttClient->keepAliveTick = 0; mqttClient->reconnectTick = 0; xTimerReset(mqttClient->mqttTimer, portMAX_DELAY); xTimerStart(mqttClient->mqttTimer, portMAX_DELAY); if (UTILS_StrToIP(mqttClient->host, &mqttClient->pCon->proto.tcp->remote_ip)) { INFO("TCP: Connect to ip %s:%d\r\n", mqttClient->host, mqttClient->port); if (mqttClient->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_connect(mqttClient->pCon); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_connect(mqttClient->pCon); } } else { INFO("TCP: Connect to domain %s:%d\r\n", mqttClient->host, mqttClient->port); espconn_gethostbyname(mqttClient->pCon, mqttClient->host, &mqttClient->ip, mqtt_dns_found); } mqttClient->connState = TCP_CONNECTING; }
void ICACHE_FLASH_ATTR MQTT_Task(os_event_t *e) { MQTT_Client* client = (MQTT_Client*)e->par; uint8_t dataBuffer[MQTT_BUF_SIZE]; uint16_t dataLen; if (e->par == 0) return; switch (client->connState) { case TCP_RECONNECT_REQ: break; case TCP_RECONNECT: mqtt_tcpclient_delete(client); MQTT_Connect(client); INFO("TCP: Reconnect to: %s:%d\r\n", client->host, client->port); client->connState = TCP_CONNECTING; break; case MQTT_DELETING: case TCP_DISCONNECTING: case TCP_RECONNECT_DISCONNECTING: if (client->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_disconnect(client->pCon); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_disconnect(client->pCon); } break; case TCP_DISCONNECTED: INFO("MQTT: Disconnected\r\n"); mqtt_tcpclient_delete(client); break; case MQTT_DELETED: INFO("MQTT: Deleted client\r\n"); mqtt_client_delete(client); break; case MQTT_KEEPALIVE_SEND: mqtt_send_keepalive(client); break; case MQTT_DATA: if (QUEUE_IsEmpty(&client->msgQueue) || client->sendTimeout != 0) { break; } if (QUEUE_Gets(&client->msgQueue, dataBuffer, &dataLen, MQTT_BUF_SIZE) == 0) { client->mqtt_state.pending_msg_type = mqtt_get_type(dataBuffer); client->mqtt_state.pending_msg_id = mqtt_get_id(dataBuffer, dataLen); client->sendTimeout = MQTT_SEND_TIMOUT; INFO("MQTT: Sending, type: %d, id: %04X\r\n", client->mqtt_state.pending_msg_type, client->mqtt_state.pending_msg_id); if (client->security) { #ifdef MQTT_SSL_ENABLE espconn_secure_send(client->pCon, dataBuffer, dataLen); #else INFO("TCP: Do not support SSL\r\n"); #endif } else { espconn_send(client->pCon, dataBuffer, dataLen); } client->mqtt_state.outbound_message = NULL; break; } break; } }
/** * @brief Delete MQTT client and free all memory * @param mqttClient: The mqtt client * @retval None */ void ICACHE_FLASH_ATTR mqtt_client_delete(MQTT_Client *mqttClient) { if (mqttClient == NULL) return; if (mqttClient->pCon != NULL) { mqtt_tcpclient_delete(mqttClient); } if (mqttClient->host != NULL) { os_free(mqttClient->host); mqttClient->host = NULL; } if (mqttClient->user_data != NULL) { os_free(mqttClient->user_data); mqttClient->user_data = NULL; } if (mqttClient->mqtt_state.in_buffer != NULL) { os_free(mqttClient->mqtt_state.in_buffer); mqttClient->mqtt_state.in_buffer = NULL; } if (mqttClient->mqtt_state.out_buffer != NULL) { os_free(mqttClient->mqtt_state.out_buffer); mqttClient->mqtt_state.out_buffer = NULL; } if (mqttClient->mqtt_state.outbound_message != NULL) { if (mqttClient->mqtt_state.outbound_message->data != NULL) { os_free(mqttClient->mqtt_state.outbound_message->data); mqttClient->mqtt_state.outbound_message->data = NULL; } } if (mqttClient->mqtt_state.mqtt_connection.buffer != NULL) { // Already freed but not NULL mqttClient->mqtt_state.mqtt_connection.buffer = NULL; } if (mqttClient->connect_info.client_id != NULL) { #ifdef PROTOCOL_NAMEv311 /* Don't attempt to free if it's the zero_len array */ if ( ((uint8_t*)mqttClient->connect_info.client_id) != zero_len_id ) os_free(mqttClient->connect_info.client_id); #else os_free(mqttClient->connect_info.client_id); #endif mqttClient->connect_info.client_id = NULL; } if (mqttClient->connect_info.username != NULL) { os_free(mqttClient->connect_info.username); mqttClient->connect_info.username = NULL; } if (mqttClient->connect_info.password != NULL) { os_free(mqttClient->connect_info.password); mqttClient->connect_info.password = NULL; } if (mqttClient->connect_info.will_topic != NULL) { os_free(mqttClient->connect_info.will_topic); mqttClient->connect_info.will_topic = NULL; } if (mqttClient->connect_info.will_message != NULL) { os_free(mqttClient->connect_info.will_message); mqttClient->connect_info.will_message = NULL; } if (mqttClient->msgQueue.buf != NULL) { os_free(mqttClient->msgQueue.buf); mqttClient->msgQueue.buf = NULL; } // Initialize state mqttClient->connState = WIFI_INIT; // Clear callback functions to avoid abnormal callback mqttClient->connectedCb = NULL; mqttClient->disconnectedCb = NULL; mqttClient->publishedCb = NULL; mqttClient->timeoutCb = NULL; mqttClient->dataCb = NULL; MQTT_INFO("MQTT: client already deleted\r\n"); }