c++ - 使用 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
}
解决方案
你不能只投射payload
到char*
. payload
是接收到的字节数组,是该数组中接收length
到的数据的大小。如果字节是字符,并且您会知道该数组中还分配了一个位置,则可以将 0 放入payload[length]
并强制转换为char*
以零结尾的字符串。但是您不知道是否再分配了一个字节,因此您必须将有效负载复制到您的字符缓冲区并在最后设置零。
您可以使用strcmp
C 函数来比较字符串,也可以使用memcmp与字符串进行比较payload
。
推荐阅读
- java - 从 JSON 检索数据但无法从 JSONobject 访问 Arraylist
- python - UnicodeDecodeError:“utf-8”编解码器无法解码位置 0 的字节 0xb9:无效的起始字节
- laravel - 无法打开文件以读取 [文件链接] laravel
- django - 在 Django 中,如何在 UpdateView 等基于类的视图中访问 request.meta 和 http_referer?
- eclipse - 为什么在适用于 Enterprise Java Developers 2020-09 (4.17.0) 的 Eclipse IDE 上安装 Roo 支持失败 内部版本 ID:20200910-1200 与 STS 4.8.0
- python - 在 DataFrame 中查看具有正确表示的 \n (换行符)值
- drake - 如何解决“以下环境没有变量 x 的条目”的问题?
- docker - Docker学习问题
- java - 采用非对称方法的 OAuth2
- ios - App Store Overlay 的问题:“获取完整的应用程序”横幅