Browse Source

fix bugs in topic parsing

Chris Mullins 8 years ago
parent
commit
d8dd939680
3 changed files with 13 additions and 7 deletions
  1. 1 1
      lib/Helpers/UrlTokenBindings.cpp
  2. 11 5
      lib/MQTT/MqttClient.cpp
  3. 1 1
      platformio.ini

+ 1 - 1
lib/Helpers/UrlTokenBindings.cpp

@@ -10,7 +10,7 @@ bool UrlTokenBindings::hasBinding(const char* searchToken) const {
   while (patternTokens.hasNext()) {
     const char* token = patternTokens.nextToken();
 
-    if (strcmp(token, searchToken) == 0) {
+    if (token[0] == ':' && strcmp(token+1, searchToken) == 0) {
       return true;
     }
   }

+ 11 - 5
lib/MQTT/MqttClient.cpp

@@ -75,17 +75,19 @@ void MqttClient::publishCallback(char* topic, byte* payload, int length) {
   uint16_t deviceId = 0;
   uint8_t groupId = 0;
   MiLightRadioConfig* config = &MilightRgbCctConfig;
-  const char* strPayload = reinterpret_cast<const char*>(payload);
+  char cstrPayload[length + 1];
+  cstrPayload[length] = 0;
+  memcpy(cstrPayload, payload, sizeof(byte)*length);
 
 #ifdef MQTT_DEBUG
-  printf_P(PSTR("MqttClient - Got message on topic: %s\n%s\n"), topic, strPayload);
+  printf_P(PSTR("MqttClient - Got message on topic: %s\n%s\n"), topic, cstrPayload);
 #endif
 
   char topicPattern[settings.mqttTopicPattern.length()];
   strcpy(topicPattern, settings.mqttTopicPattern.c_str());
 
-  TokenIterator patternIterator(topicPattern, settings.mqttTopicPattern.length());
-  TokenIterator topicIterator(topic, strlen(topic));
+  TokenIterator patternIterator(topicPattern, settings.mqttTopicPattern.length(), '/');
+  TokenIterator topicIterator(topic, strlen(topic), '/');
   UrlTokenBindings tokenBindings(patternIterator, topicIterator);
 
   if (tokenBindings.hasBinding("device_id")) {
@@ -101,7 +103,11 @@ void MqttClient::publishCallback(char* topic, byte* payload, int length) {
   }
 
   StaticJsonBuffer<400> buffer;
-  JsonObject& obj = buffer.parseObject(strPayload);
+  JsonObject& obj = buffer.parseObject(cstrPayload);
+
+#ifdef MQTT_DEBUG
+  printf_P(PSTR("MqttClient - device %04X, group %u\n"), deviceId, groupId);
+#endif
 
   milightClient->prepare(*config, deviceId, groupId);
   milightClient->update(obj);

+ 1 - 1
platformio.ini

@@ -17,7 +17,7 @@ lib_deps_external =
   WiFiManager
   ArduinoJson
   PubSubClient
-build_flags = !python .get_version.py
+build_flags = !python .get_version.py -DMQTT_DEBUG
 # -D MILIGHT_UDP_DEBUG
 # -D DEBUG_PRINTF