static inline void mqtt_task() { struct Network network; char client_id[20]; uint8_t mqtt_buf[100]; uint8_t mqtt_readbuf[100]; MQTTPacket_connectData data = MQTTPacket_connectData_initializer; NewNetwork( &network ); strcpy(client_id, "esp-gizmo-ir"); if (ConnectNetwork(&network, config_get_mqtt_host(), config_get_mqtt_port()) != 0) { printf("Connect to MQTT server failed\n"); return; } NewMQTTClient(&mqtt_client, &network, 5000, mqtt_buf, 100, mqtt_readbuf, 100); data.willFlag = 0; data.MQTTVersion = 3; data.clientID.cstring = client_id; data.username.cstring = NULL; data.password.cstring = NULL; data.keepAliveInterval = 10; data.cleansession = 0; printf("Send MQTT connect ... \n"); if (MQTTConnect(&mqtt_client, &data) != 0) { printf("MQTT connect failed\n"); return; } const char *topic = config_get_cmd_topic(); printf("Sibscribe to topic: %s\n", topic); if (MQTTSubscribe(&mqtt_client, topic, QOS1, topic_received) != 0) { printf("Subscription failed\n"); return; } while (MQTTYield(&mqtt_client, 1000) != DISCONNECTED) { printf("free heap: %d bytes\n", xPortGetFreeHeapSize()); uint16_t free_stack = uxTaskGetStackHighWaterMark(xTaskGetCurrentTaskHandle()); printf("minimum free stack: %d bytes\n", free_stack); }; printf("Connection dropped, request restart\n"); }
static void mqtt_task(void *pvParameters) { int ret = 0; struct Network network; MQTTClient client = DefaultClient; char mqtt_client_id[20]; uint8_t mqtt_buf[100]; uint8_t mqtt_readbuf[100]; MQTTPacket_connectData data = MQTTPacket_connectData_initializer; NewNetwork( &network ); memset(mqtt_client_id, 0, sizeof(mqtt_client_id)); strcpy(mqtt_client_id, "ESP-"); strcat(mqtt_client_id, get_my_id()); while(1) { xSemaphoreTake(wifi_alive, portMAX_DELAY); printf("%s: started\n\r", __func__); printf("%s: (Re)connecting to MQTT server %s ... ",__func__, MQTT_HOST); ret = ConnectNetwork(&network, MQTT_HOST, MQTT_PORT); if( ret ){ printf("error: %d\n\r", ret); taskYIELD(); continue; } printf("done\n\r"); NewMQTTClient(&client, &network, 5000, mqtt_buf, 100, mqtt_readbuf, 100); data.willFlag = 0; data.MQTTVersion = 3; data.clientID.cstring = mqtt_client_id; data.username.cstring = MQTT_USER; data.password.cstring = MQTT_PASS; data.keepAliveInterval = 10; data.cleansession = 0; printf("Send MQTT connect ... "); ret = MQTTConnect(&client, &data); if(ret){ printf("error: %d\n\r", ret); DisconnectNetwork(&network); taskYIELD(); continue; } printf("done\r\n"); MQTTSubscribe(&client, "/esptopic", QOS1, topic_received); xQueueReset(publish_queue); while(1){ char msg[PUB_MSG_LEN - 1] = "\0"; while(xQueueReceive(publish_queue, (void *)msg, 0) == pdTRUE){ printf("got message to publish\r\n"); MQTTMessage message; message.payload = msg; message.payloadlen = PUB_MSG_LEN; message.dup = 0; message.qos = QOS1; message.retained = 0; ret = MQTTPublish(&client, "/beat", &message); if (ret != SUCCESS ){ printf("error while publishing message: %d\n", ret ); break; } } ret = MQTTYield(&client, 1000); if (ret == DISCONNECTED) break; } printf("Connection dropped, request restart\n\r"); DisconnectNetwork(&network); taskYIELD(); } }