ESP8266 - Added method to receive PUBLISH packets from server
This commit is contained in:
parent
6d4b7c4e79
commit
6044f00137
4 changed files with 48 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue