【问题标题】:Sending data as binary hex when function supports String type only当函数仅支持字符串类型时以二进制十六进制发送数据
【发布时间】: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 库只接受消息参数的字符串类型。我可以切换库,但这需要做很多工作。

标签: c++ string arduino mqtt


【解决方案1】:

您是否考虑过在发送数据之前对数据进行 base64 编码?这将提供数据的字符串安全版本,但在另一端使用之前需要解码。

这里是一个 Arduino base64 库(我自己没用过)

https://github.com/adamvr/arduino-base64

【讨论】:

    猜你喜欢
    • 2019-02-21
    • 2017-11-19
    • 1970-01-01
    • 2017-03-22
    • 2016-02-26
    • 1970-01-01
    • 2018-06-24
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多