PubSubClient.publish 尝试将 char 转换为 unsigned int 并抛出错误

PubSubClient.publish tries convert char into unsinged int and throws error

首先,我与经验丰富的程序员相差甚远,如果我在这里问初学者问题,请原谅我。

我在尝试使用 ESP8266 上的 PubSubClient 发布负载时遇到问题。我正在将 VS Code 与 Platformio 结合使用。

在构建过程中,我收到以下错误。看起来 PubSubClient 正在尝试将有效负载从 char 转换为 unsinged int,即使有效负载在 PubSubClient 库的 API 中定义为 const char。

src\main.cpp: In function 'void sendStatusViaMqtt(String)': src\main.cpp:389:39: error: invalid conversion from 'char*' to 'const uint8_t*' {aka 'const unsigned char*'} [-fpermissive] 389 |     mqttClient->publish(relay_Status, mqttMessageCharArray, msglength, false); |                                       ^~~~~~~~~~~~~~~~~~~~ |                                       | |                                       char* In file included from src\main.cpp:15: .pio\libdeps\esp12e\PubSubClient\src/PubSubClient.h:154:55: note:   initializing argument 2 of 'boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int, boolean)' 154 |    boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);

这是我使用的代码片段。实际上,根据 PubSubClient 文档,我特意将字符串转换为所需的字符。

void sendStatusViaMqtt()
{
  unsigned long now = millis();
  if (now - lastMqttMsg > 100000) //Making sure I only send messages after a certain time has elapsed
  {
    String mqttMessage = generateStatusString(); //Function generateStatusString()puts putting current values of variables of the running code on the ESP8266 into a String and returns it
    unsigned int msglength = mqttMessage.length();
    char mqttMessageCharArray[mqttMessage.length()]; 
    mqttMessage.toCharArray(mqttMessageCharArray, mqttMessage.length()); //Generating a CHAR Array out of the String
    lastMqttMsg = now; 
    Serial.print("Publish message: ");
    Serial.println(mqttMessage);
    mqttClient->publish(relay_Status, mqttMessageCharArray, msglength, false);
  }  
}

感谢任何提示!

你的 mqttMessageCharArraychar[] 类型(decayschar* 传递给函数),而你的 mqttClient->publish() 需要 uint8_t*作为它的第二个参数。

只需将最后一行替换为 :-

即可修复
mqttClient->publish(relay_Status, (uint8_t*)&mqttMessageCharArray, msglength, false);

这里我们使用 & 获取 mqttMessageCharArray 的地址,然后将其转换为 uint8_t*.

uint8_t(又名无符号 8 位整数)在几乎每个系统上与 unsigned char 基本相同。根据定义,它们都是 1 字节大小,因此可以安全地在它们之间进行转换而不会丢失任何数据。