2017-06-21 31 views
0

我编写了一个处理MQTT消息(有效负载)的回调函数。我想切换的引脚不是基于传入的有效负载。我现在的问题是第一条语句在发送11时很好地执行。但第二条语句不起作用。奇怪的是,当我发送两条消息,一条包含1x和另一条x1时,我可以再次切换两个引脚。这是一个非常奇怪的问题! 任何人都可以帮助我,非常感谢。我正在使用PubSubClient库。回调函数不执行第二条语句 - C++ MQTT

void callback(char* topic, byte* payload, unsigned int length) { 
     Serial.print("Message arrived ["); 
     Serial.print(topic); 
     Serial.print("] "); 
     for (int i = 0; i < length; i++) { 
     Serial.print((char)payload[i]); 
     } 

     //Set GPIO0 to HIGH or LOW on first character received in message 
     if (payload[0] == '1') { 
     digitalWrite(GPIO0, HIGH); // Turn the relay on 
     client.publish(getOutTopic().c_str(), "GPIO0 set to HIGH"); 
     } else if (payload[0] == '0') { 
     digitalWrite(GPIO0, LOW); // Turn the relay off 
     client.publish(getOutTopic().c_str(), "GPIO0 set to LOW"); 
     } 

     //Set GPIO2 to HIGH or LOW on first character received in message 
     if (payload[1] == '1') { 
     digitalWrite(GPIO2, HIGH); // turn LED off. With High it is inactive on the ESP-01) 
     client.publish(getOutTopic().c_str(), "GPIO2 set to HIGH"); 
     } else if (payload[1] == '0') { 
     digitalWrite(GPIO2, LOW); // Turn the LED on by making the voltage LOW 
     client.publish(getOutTopic().c_str(), "GPIO2 set to LOW"); 
     } 
} 
+0

当有效载荷为11时for循环的输出是什么?另外,您应该在for循环中放置一个分隔符来区分有效载荷[1]和有效载荷[1]。 – Rezniaq

+0

forloop正确显示有效载荷。 – Ansjovis86

+1

在第一个'if/elseif'之后再次输出你的'payload'数据。我有一种感觉,你的'client.publish()'会破坏你的'payload'指针?如果它在第一个for循环之后输出了'11',我在代码中没有看到为什么第二个'if/else'不会触发的原因。你是否也可以删除所有'client.publish()'调用,只需用LED指示灯看看GPIO输出引脚? –

回答

0

client.publish销毁有效载荷缓冲区。所以我不得不将有效载荷转化为新的变量来克服这个问题。

void callback(char* topic, byte* payload, unsigned int length) { 
     char p0 = (char)payload[0]; 
     char p1 = (char)payload[1]; 
     Serial.print("Message arrived ["); 
     Serial.print(topic); 
     Serial.print("] "); 
     for (int i = 0; i < length; i++) { 
     Serial.print((char)payload[i]); 
     } 

     //Set GPIO0 to HIGH or LOW on first character received in message 
     if (p0 == '1') { 
     digitalWrite(GPIO0, HIGH); // Turn the relay on 
     client.publish(getOutTopic().c_str(), "GPIO0 set to HIGH"); 
     } else if (p0 == '0') { 
     digitalWrite(GPIO0, LOW); // Turn the relay off 
     client.publish(getOutTopic().c_str(), "GPIO0 set to LOW"); 
     } 

     //Set GPIO2 to HIGH or LOW on first character received in message 
     if (p1 == '1') { 
     digitalWrite(GPIO2, HIGH); // turn LED off. With High it is inactive on the ESP-01) 
     client.publish(getOutTopic().c_str(), "GPIO2 set to HIGH"); 
     } else if (p1 == '0') { 
     digitalWrite(GPIO2, LOW); // Turn the LED on by making the voltage LOW 
     client.publish(getOutTopic().c_str(), "GPIO2 set to LOW"); 
     } 
}