首页 > 解决方案 > 使用 ESP8266 上的 PubSubClient 将字节 * 转换为字符串

问题描述

你好 Stackoverflow 的好心人。

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

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

我期待收到“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
  }

标签: c++arraysarduinomqtt

解决方案


你不能只投射payloadchar*. payload是接收到的字节数组,是该数组中接收length到的数据的大小。如果字节是字符,并且您会知道该数组中还分配了一个位置,则可以将 0 放入payload[length]并强制转换为char*零结尾的字符串。但是您不知道是否再分配了一个字节,因此您必须将有效负载复制到您的字符缓冲区并在最后设置零。

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


推荐阅读