提问者:小点点

使用ESP8266上的PubSubClient将字节*转换为字符串


你好,好心的StackOverflow的人们。

我使用PubSubClient库在MQTT上发布和接收消息。但我正与以正确的“格式”接收数据作斗争。

这个库中的回调函数使用一个*字节来处理来自MQTT的有效负载,但是我需要将这个*字节转换为字符串。

我希望收到“dragon”和“boa”的有效负载,所以我需要对不同的字符串做出反应。

请参见下面的代码以供参考。

我希望有人能给我指明正确的方向:-)

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

    if (payload = "dragon"){
    Serial.println("dragon");
  }
  else if (payload = "boa"){
    Serial.println("boa");
  }

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01) 
    }
   else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

共1个答案

匿名用户

您不能只将有效载荷强制转换为字符*Payload是接收字节数组,length是该数组中接收数据的大小。如果字节是字符,并且您知道在该数组中还分配了一个位置,则可以将0放到有效载荷[length],通过强制转换到char*,它将成为以零结尾的字符串。但是您无法知道是否有多分配的一个字节,因此您必须将有效负载复制到您的字符缓冲区中,并在结尾处设置一个零。

您可以使用strcmpC函数比较字符串,也可以使用memcmp将payload与字符串进行比较。