Added publish_P, for publishing a message from PROGMEM.

Message can be any size.
This commit is contained in:
Joby Taffey 2012-07-13 16:41:31 +01:00
parent 62693d406c
commit 9607eefa0f
2 changed files with 47 additions and 0 deletions

View File

@ -210,6 +210,52 @@ boolean PubSubClient::publish(char* topic, uint8_t* payload, unsigned int plengt
return false; return false;
} }
boolean PubSubClient::publish_P(char* topic, uint8_t* PROGMEM payload, unsigned int plength, boolean retained) {
uint8_t lenBuf[4];
uint8_t llen = 0;
uint8_t digit;
int rc;
uint16_t tlen;
int pos = 0;
int i;
uint8_t header;
unsigned int len;
if (!connected())
return false;
tlen = strlen(topic);
header = MQTTPUBLISH;
if (retained)
header |= 1;
len = plength + 2 + tlen;
do {
digit = len % 128;
len = len / 128;
if (len > 0) {
digit |= 0x80;
}
lenBuf[pos++] = digit;
llen++;
} while(len>0);
rc += _client.write(&header, 1);
rc += _client.write(lenBuf, llen);
lenBuf[0] = tlen >> 8; // MSB
lenBuf[1] = tlen & 0xFF; // LSB
rc += _client.write(lenBuf, 2);
rc += _client.write((uint8_t *)topic, tlen);
for (i=0;i<plength;i++)
rc += _client.write((char)pgm_read_byte_near(payload + i));
lastOutActivity = millis();
return rc == len + 1 + plength;
}
boolean PubSubClient::write(uint8_t header, uint8_t* buf, uint16_t length) { boolean PubSubClient::write(uint8_t header, uint8_t* buf, uint16_t length) {
uint8_t lenBuf[4]; uint8_t lenBuf[4];

View File

@ -65,6 +65,7 @@ public:
boolean publish(char *, char *); boolean publish(char *, char *);
boolean publish(char *, uint8_t *, unsigned int); boolean publish(char *, uint8_t *, unsigned int);
boolean publish(char *, uint8_t *, unsigned int, boolean); boolean publish(char *, uint8_t *, unsigned int, boolean);
boolean publish_P(char *, uint8_t PROGMEM *, unsigned int, boolean);
boolean subscribe(char *); boolean subscribe(char *);
boolean loop(); boolean loop();
boolean connected(); boolean connected();