【发布时间】:2016-01-14 05:08:19
【问题描述】:
我正在使用一个接受字符串对象作为参数的函数。该函数用于通过 MQTT 协议发送数据。我需要通过 MQTT 发送二进制数据。我设法做到了,但我的解决方案存在问题。以下是相关代码;
MqttClient mqtt("192.168.1.71", 1883, onMessageReceived);
char buffer[100];
//buffer filled with binary data terminated with null character at this point
mqtt_msg = String(buffer);
String topic = "XXX";
mqtt.publish(topic, mqtt_msg );
我将用空字符 0x00 终止缓冲区中的二进制数据。当 0x00 恰好是二进制数据的一部分时,问题就出现了。这个问题怎么解决?
String 对象类似于 Arduino 中使用的 String 对象。
【问题讨论】:
-
我建议检查这个神秘的
String类是否有一个构造函数,它同时接受const char*和(希望是size_t)长度/大小值。这就是std::string允许您使用特定长度的任意二进制数据(可能包括 NUL)构造它的方式,而不需要您从中复制数据的缓冲区被 NUL 终止。 -
@Robert Crovella,你很敏锐。我刚刚更正了那部分代码。
-
我认为@TonyD 是在正确的轨道上。看看here。因此,请找到您正在使用的特定 MQTT 客户端的 API 文档,并寻找一个替代的
publish方法,该方法采用指向有效负载和长度的指针。 (并且该特定方法可能需要其他参数,例如 QoS 等) -
@Robert Crovella,谢谢,但我碰巧使用的 MQTT 库只接受消息参数的字符串类型。我可以切换库,但这需要做很多工作。