From e21df6484553a6043a07336d7556dcc6e34cc6f7 Mon Sep 17 00:00:00 2001 From: frizzy Date: Thu, 3 Nov 2016 19:32:20 +0000 Subject: [PATCH 1/2] MQTT: Add support for slash in subscriber topic --- core/MyProtocolMySensors.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) mode change 100644 => 100755 core/MyProtocolMySensors.cpp diff --git a/core/MyProtocolMySensors.cpp b/core/MyProtocolMySensors.cpp old mode 100644 new mode 100755 index f5302b4..f3c9ac4 --- a/core/MyProtocolMySensors.cpp +++ b/core/MyProtocolMySensors.cpp @@ -120,40 +120,42 @@ bool protocolMQTTParse(MyMessage &message, char* topic, uint8_t* payload, unsign uint8_t bvalue[MAX_PAYLOAD]; uint8_t blen = 0; uint8_t command = 0; + uint8_t topiclen = strlen(topic) - strlen(MY_MQTT_SUBSCRIBE_TOPIC_PREFIX); + char topicTrimmed[topiclen]; - for (str = strtok_r(topic, "/", &p); str && i <= 5; + if (topic != strstr(topic, MY_MQTT_SUBSCRIBE_TOPIC_PREFIX)) { + // Prefix doesn't match incoming topic + return false; + } + // Extract the topic sans prefix + strncpy(topicTrimmed, &topic[strlen(MY_MQTT_SUBSCRIBE_TOPIC_PREFIX) + 1], topiclen); + topicTrimmed[topiclen] = (char)0; + + for (str = strtok_r(topicTrimmed, "/", &p); str && i <= 5; str = strtok_r(NULL, "/", &p)) { switch (i) { case 0: { - // Topic prefix - if (strcmp(str, MY_MQTT_SUBSCRIBE_TOPIC_PREFIX) != 0) { - // Message not for us or malformed! - return false; - } - break; - } - case 1: { // Node id message.destination = atoi(str); break; } - case 2: { + case 1: { // Sensor id message.sensor = atoi(str); break; } - case 3: { + case 2: { // Command type command = atoi(str); mSetCommand(message, command); break; } - case 4: { + case 3: { // Ack flag mSetRequestAck(message, atoi(str)?1:0); break; } - case 5: { + case 4: { // Sub type message.type = atoi(str); break; @@ -162,7 +164,7 @@ bool protocolMQTTParse(MyMessage &message, char* topic, uint8_t* payload, unsign i++; } - if (i != 6) { + if (i != 5) { return false; } From 2321c67ffa5903e6e473121fed32e239ac2beddc Mon Sep 17 00:00:00 2001 From: frizzy Date: Fri, 4 Nov 2016 19:42:34 +0000 Subject: [PATCH 2/2] MQTT: Removed need for new topic buffer --- core/MyProtocolMySensors.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/core/MyProtocolMySensors.cpp b/core/MyProtocolMySensors.cpp index f3c9ac4..d046e57 100755 --- a/core/MyProtocolMySensors.cpp +++ b/core/MyProtocolMySensors.cpp @@ -120,18 +120,11 @@ bool protocolMQTTParse(MyMessage &message, char* topic, uint8_t* payload, unsign uint8_t bvalue[MAX_PAYLOAD]; uint8_t blen = 0; uint8_t command = 0; - uint8_t topiclen = strlen(topic) - strlen(MY_MQTT_SUBSCRIBE_TOPIC_PREFIX); - char topicTrimmed[topiclen]; - if (topic != strstr(topic, MY_MQTT_SUBSCRIBE_TOPIC_PREFIX)) { // Prefix doesn't match incoming topic return false; } - // Extract the topic sans prefix - strncpy(topicTrimmed, &topic[strlen(MY_MQTT_SUBSCRIBE_TOPIC_PREFIX) + 1], topiclen); - topicTrimmed[topiclen] = (char)0; - - for (str = strtok_r(topicTrimmed, "/", &p); str && i <= 5; + for (str = strtok_r(topic + strlen(MY_MQTT_SUBSCRIBE_TOPIC_PREFIX) + 1, "/", &p); str && i <= 5; str = strtok_r(NULL, "/", &p)) { switch (i) { case 0: {