1.创建json字符串
cJSON *jsonObject = cJSON_CreateObject();
cJSON *moduleArray = cJSON_CreateArray();
cJSON_AddItemToArray(moduleArray, cJSON_CreateNumber(1));
cJSON_AddItemToArray(moduleArray, cJSON_CreateNumber(2));
// 添加 "module" 数组到 JSON 对象
cJSON_AddItemToObject(jsonObject, "module", moduleArray);
// 添加 "time" 数字到 JSON 对象
cJSON_AddItemToObject(jsonObject, "time", cJSON_CreateNumber(123456));
// 将 cJSON 对象转换为 JSON 字符串
char *jsonString = cJSON_PrintUnformatted(jsonObject);
send(mqttTopic, jsonString);
cJSON_Delete(jsonObject);
free(jsonString);
2.通过 MQTT 发送消息
#include <iostream>
#include <cstring>
#include <mqtt/async_client.h>
// 回调函数,处理收到的消息
class MyCallback : public virtual mqtt::callback {
public:
void message_arrived(mqtt::const_message_ptr msg) override {
std::cout << "Message Arrived: " << msg->get_payload_str() << std::endl;
}
};
int main() {
const std::string server_address = "tcp://mqtt.eclipse.org:1883";
const std::string client_id = "my_cpp_client";
const std::string topic = "my_topic";
const std::string payload = "Hello, MQTT!";
// 创建 MQTT 客户端
mqtt::async_client client(server_address, client_id);
// 设置回调函数
MyCallback callback;
client.set_callback(callback);
try {
// 连接到 MQTT 服务器
client.connect()->wait();
// 创建消息
mqtt::message_ptr message = mqtt::make_message(topic, payload);
// 发布消息
client.publish(message)->wait();
// 断开连接
client.disconnect()->wait();
} catch (const mqtt::exception& exc) {
std::cerr << "Error: " << exc.what() << std::endl;
return 1;
}
return 0;
}
1.// 将 JSON 对象转换为字符串
char *jsonString = cJSON_PrintUnformatted(jsonObject);
// 构建 MQTT 消息
MQTTAsync_message message = MQTTAsync_message_initializer;
message.payload = jsonString;
message.payloadlen = compressedSize;
printf("jsonString_len: %d\n", message.payloadlen);
通过 MQTT 发送消息ompressedData 可能包含二进制数据,其中可能存在 null 字符('\0'),这会导致 strlen(jsonString) 在第一个 null 字符处停止,因此导致字符串长度小于实际压缩数据的大小。
如果 compressedData 中可能包含 null 字符,你应该使用 compressedSize 来指定正确的长度,而不是依赖于 strlen(jsonString)。这样可以确保 JSON 字符串能够包含二进制数据而不会在 null 字符处截断。
message.payload = jsonString;
message.payloadlen = compressedSize; // 使用正确的长度
3.补充:JSONCpp
JsonCpp是一个开源的C++库,用于解析和生成JSON(JavaScript Object Notation)数据格式。JSON是一种轻量级的数据交换格式,广泛用于各种应用程序和网络服务中。
JsonCpp库的主要特点包括:
-
1.轻量级:JsonCpp具有很小的代码体积和低的内存占用,因此非常适合嵌入式系统或资源受限的环境。
-
2.跨平台:JsonCpp可以在多种操作系统上运行,包括Windows、Linux、Mac等。
-
3.简单易用:JsonCpp提供了简洁的API,使得解析和生成JSON数据变得非常容易。开发人员可以通过简单的函数调用来实现JSON数据的读取、修改和生成。