6 Commits
v1.1 ... v1.5

Author SHA1 Message Date
ef75340e6e * Added default constructor
* Fixed compile error when used with arduino-0021 or later
2010-12-27 19:49:46 +00:00
07547e2ec0 Added default constructor 2010-07-27 16:08:51 +01:00
a937a97659 Fixed connection lost handling 2010-07-20 20:05:03 +01:00
ad96f3e82a Updated CHANGES.txt 2010-02-27 21:42:32 +00:00
f8a977ddd0 Fixed packet reading issue in PubSubClient.readPacket 2010-02-27 21:37:58 +00:00
265016844b Fixed compile error when used with arduino-0016 or later 2009-07-24 15:44:30 +01:00
3 changed files with 41 additions and 17 deletions

View File

@ -1,3 +1,17 @@
1.5
* Added default constructor
* Fixed compile error when used with arduino-0021 or later
1.4
* Fixed connection lost handling
1.3
* Fixed packet reading bug in PubSubClient.readPacket
1.2
* Fixed compile error when used with arduino-0016 or later
1.1 1.1
* Reduced size of library * Reduced size of library
* Added support for Will messages * Added support for Will messages

View File

@ -4,7 +4,6 @@
http://knolleary.net http://knolleary.net
*/ */
#include "WConstants.h"
#include "PubSubClient.h" #include "PubSubClient.h"
#include "Client.h" #include "Client.h"
#include "string.h" #include "string.h"
@ -13,6 +12,8 @@
#define MQTTPUBLISH 3<<4 #define MQTTPUBLISH 3<<4
#define MQTTSUBSCRIBE 8<<4 #define MQTTSUBSCRIBE 8<<4
PubSubClient::PubSubClient() : _client(0) {
}
PubSubClient::PubSubClient(uint8_t *ip, uint16_t port, void (*callback)(char*,uint8_t*,int)) : _client(ip,port) { PubSubClient::PubSubClient(uint8_t *ip, uint16_t port, void (*callback)(char*,uint8_t*,int)) : _client(ip,port) {
this->callback = callback; this->callback = callback;
@ -22,7 +23,7 @@ int PubSubClient::connect(char *id) {
} }
int PubSubClient::connect(char *id, char* willTopic, uint8_t willQos, uint8_t willRetain, char* willMessage) { int PubSubClient::connect(char *id, char* willTopic, uint8_t willQos, uint8_t willRetain, char* willMessage) {
if (!_client.connected()) { if (!connected()) {
if (_client.connect()) { if (_client.connect()) {
nextMsgId = 1; nextMsgId = 1;
uint8_t d[9] = {0x00,0x06,0x4d,0x51,0x49,0x73,0x64,0x70,0x03}; uint8_t d[9] = {0x00,0x06,0x4d,0x51,0x49,0x73,0x64,0x70,0x03};
@ -37,7 +38,7 @@ int PubSubClient::connect(char *id, char* willTopic, uint8_t willQos, uint8_t wi
buffer[length++] = 0x02; buffer[length++] = 0x02;
} }
buffer[length++] = 0; buffer[length++] = 0;
buffer[length++] = (KEEPALIVE/500); buffer[length++] = (KEEPALIVE/1000);
length = writeString(id,buffer,length); length = writeString(id,buffer,length);
if (willTopic) { if (willTopic) {
length = writeString(willTopic,buffer,length); length = writeString(willTopic,buffer,length);
@ -46,26 +47,30 @@ int PubSubClient::connect(char *id, char* willTopic, uint8_t willQos, uint8_t wi
write(MQTTCONNECT,buffer,length); write(MQTTCONNECT,buffer,length);
while (!_client.available()) {} while (!_client.available()) {}
uint8_t len = readPacket(); uint8_t len = readPacket();
if (len == 4 && buffer[3] == 0) { if (len == 4 && buffer[3] == 0) {
lastActivity = millis(); lastActivity = millis();
return 1; return 1;
} }
_client.stop();
} }
_client.stop();
} }
return 0; return 0;
} }
uint8_t PubSubClient::readByte() {
while(!_client.available()) {}
return _client.read();
}
uint8_t PubSubClient::readPacket() { uint8_t PubSubClient::readPacket() {
uint8_t len = 0; uint8_t len = 0;
buffer[len++] = _client.read(); buffer[len++] = readByte();
uint8_t multiplier = 1; uint8_t multiplier = 1;
uint8_t length = 0; uint8_t length = 0;
uint8_t digit = 0; uint8_t digit = 0;
do { do {
digit = _client.read(); digit = readByte();
buffer[len++] = digit; buffer[len++] = digit;
length += (digit & 127) * multiplier; length += (digit & 127) * multiplier;
multiplier *= 128; multiplier *= 128;
@ -74,21 +79,22 @@ uint8_t PubSubClient::readPacket() {
for (int i = 0;i<length;i++) for (int i = 0;i<length;i++)
{ {
if (len < MAX_PACKET_SIZE) { if (len < MAX_PACKET_SIZE) {
buffer[len++] = _client.read(); buffer[len++] = readByte();
} else { } else {
_client.read(); readByte();
len = 0; // This will cause the packet to be ignored. len = 0; // This will cause the packet to be ignored.
} }
} }
return len; return len;
} }
int PubSubClient::loop() { int PubSubClient::loop() {
if (_client.connected()) { if (connected()) {
long t = millis(); long t = millis();
if (t - lastActivity > KEEPALIVE) { if (t - lastActivity > KEEPALIVE) {
_client.write(192); _client.write(192);
_client.write(0); _client.write((uint8_t)0);
lastActivity = t; lastActivity = t;
} }
if (_client.available()) { if (_client.available()) {
@ -109,7 +115,7 @@ int PubSubClient::loop() {
} }
} else if (type == 12) { // PINGREG } else if (type == 12) { // PINGREG
_client.write(208); _client.write(208);
_client.write(0); _client.write((uint8_t)0);
lastActivity = t; lastActivity = t;
} }
} }
@ -125,7 +131,7 @@ int PubSubClient::publish(char* topic, char* payload) {
int PubSubClient::publish(char* topic, uint8_t* payload, uint8_t plength) { int PubSubClient::publish(char* topic, uint8_t* payload, uint8_t plength) {
if (_client.connected()) { if (connected()) {
uint8_t length = writeString(topic,buffer,0); uint8_t length = writeString(topic,buffer,0);
int i; int i;
for (i=0;i<plength;i++) { for (i=0;i<plength;i++) {
@ -150,7 +156,7 @@ int PubSubClient::write(uint8_t header, uint8_t* buf, uint8_t length) {
void PubSubClient::subscribe(char* topic) { void PubSubClient::subscribe(char* topic) {
if (_client.connected()) { if (connected()) {
uint8_t length = 2; uint8_t length = 2;
nextMsgId++; nextMsgId++;
buffer[0] = nextMsgId >> 8; buffer[0] = nextMsgId >> 8;
@ -163,7 +169,7 @@ void PubSubClient::subscribe(char* topic) {
void PubSubClient::disconnect() { void PubSubClient::disconnect() {
_client.write(224); _client.write(224);
_client.write(0); _client.write((uint8_t)0);
_client.stop(); _client.stop();
lastActivity = millis(); lastActivity = millis();
} }
@ -183,7 +189,9 @@ uint8_t PubSubClient::writeString(char* string, uint8_t* buf, uint8_t pos) {
int PubSubClient::connected() { int PubSubClient::connected() {
return (int)_client.connected(); int rc = (int)_client.connected();
if (!rc) _client.stop();
return rc;
} }

View File

@ -21,9 +21,11 @@ private:
long lastActivity; long lastActivity;
void (*callback)(char*,uint8_t*,int); void (*callback)(char*,uint8_t*,int);
uint8_t readPacket(); uint8_t readPacket();
uint8_t readByte();
int write(uint8_t header, uint8_t* buf, uint8_t length); int write(uint8_t header, uint8_t* buf, uint8_t length);
uint8_t writeString(char* string, uint8_t* buf, uint8_t pos); uint8_t writeString(char* string, uint8_t* buf, uint8_t pos);
public: public:
PubSubClient();
PubSubClient(uint8_t *, uint16_t, void(*)(char*,uint8_t*,int)); PubSubClient(uint8_t *, uint16_t, void(*)(char*,uint8_t*,int));
int connect(char *); int connect(char *);
int connect(char*, char*, uint8_t, uint8_t, char*); int connect(char*, char*, uint8_t, uint8_t, char*);