ESP8266 - Added method to receive PUBLISH packets from server

This commit is contained in:
Jan Gromeš 2018-07-10 15:12:50 +02:00
parent 6d4b7c4e79
commit 6044f00137
4 changed files with 48 additions and 0 deletions

View file

@ -117,6 +117,7 @@ ERR_MQTT_CONN_SERVER_UNAVAILABLE LITERAL1
ERR_MQTT_CONN_BAD_USERNAME_PASSWORD LITERAL1
ERR_MQTT_CONN_NOT_AUTHORIZED LITERAL1
ERR_MQTT_UNEXPECTED_PACKET_ID LITERAL1
ERR_MQTT_NO_NEW_PACKET_AVAILABLE LITERAL1
MQTT_SUBS_SUCCESS_QOS_0 LITERAL1
MQTT_SUBS_SUCCESS_QOS_1 LITERAL1
MQTT_SUBS_SUCCESS_QOS_2 LITERAL1

View file

@ -83,6 +83,7 @@
#define ERR_MQTT_CONN_BAD_USERNAME_PASSWORD 0x08
#define ERR_MQTT_CONN_NOT_AUTHORIZED 0x09
#define ERR_MQTT_UNEXPECTED_PACKET_ID 0x0A
#define ERR_MQTT_NO_NEW_PACKET_AVAILABLE 0x0B
#define MQTT_SUBS_SUCCESS_QOS_0 0x00
#define MQTT_SUBS_SUCCESS_QOS_1 0x01
#define MQTT_SUBS_SUCCESS_QOS_2 0x02

View file

@ -619,6 +619,51 @@ uint8_t ESP8266::MqttPing() {
return(ERR_RESPONSE_MALFORMED);
}
uint8_t ESP8266::MqttCheck(void (*func)(const char*, const char*)) {
// ping the server
uint8_t state = MqttPing();
if(state != ERR_NONE) {
return(state);
}
// check new data
uint16_t numBytes = getNumBytes();
if(numBytes == 0) {
return(ERR_MQTT_NO_NEW_PACKET_AVAILABLE);
}
// read the PUBLISH packet from server
uint8_t* dataIn = new uint8_t[numBytes];
receive(dataIn, numBytes);
if(dataIn[0] == MQTT_PUBLISH << 4) {
// TODO: properly decode remaining length
uint8_t remainingLength = dataIn[1];
// get the topic
size_t topicLength = dataIn[3] | dataIn[2] << 8;
char* topic = new char[topicLength + 1];
memcpy(topic, dataIn + 4, topicLength);
topic[topicLength] = 0x00;
// get the message
size_t messageLength = remainingLength - topicLength - 2;
char* message = new char[messageLength + 1];
memcpy(message, dataIn + 4 + topicLength, messageLength);
message[messageLength] = 0x00;
// execute the callback function provided by user
func(topic, message);
delete[] topic;
delete[] message;
delete[] dataIn;
return(ERR_NONE);
}
delete[] dataIn;
return(MQTT_NO_NEW_PACKET);
}
uint8_t ESP8266::send(const char* data) {
// build AT command
char lenStr[8];

View file

@ -49,6 +49,7 @@ class ESP8266 {
uint8_t MqttSubscribe(const char* topicFilter);
uint8_t MqttUnsubscribe(const char* topicFilter);
uint8_t MqttPing();
uint8_t MqttCheck(void (*func)(const char*, const char*));
// Transport layer methods
uint8_t openTransportConnection(const char* host, const char* protocol, uint16_t port, uint16_t tcpKeepAlive = 0);