JSON 对象转换为字符串并通过构建 MQTT消息发送

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. 1.轻量级:JsonCpp具有很小的代码体积和低的内存占用,因此非常适合嵌入式系统或资源受限的环境。

  2. 2.跨平台:JsonCpp可以在多种操作系统上运行,包括Windows、Linux、Mac等。

  3. 3.简单易用:JsonCpp提供了简洁的API,使得解析和生成JSON数据变得非常容易。开发人员可以通过简单的函数调用来实现JSON数据的读取、修改和生成。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当接收到 MQTT 消息后,你可以将其解析为 JSON 字符串,并将该字符串作为参数传递给 JSON 读取函数来处理。下面是一个示例代码: ```java import org.eclipse.paho.client.mqttv3.*; import org.json.JSONObject; public class MqttExample { public static void main(String[] args) { String broker = "tcp://mqtt.example.com:1883"; // MQTT 服务器地址 String clientId = "your-client-id"; // 客户端ID String topic = "your-topic"; // 主题 try { MqttClient client = new MqttClient(broker, clientId); client.connect(); // 订阅消息 client.subscribe(topic, (topic, message) -> { String payload = new String(message.getPayload()); System.out.println("Received message: " + payload); // 将消息解析为 JSON 对象 JSONObject json = new JSONObject(payload); // 调用 JSON 读取函数处理 JSON 对象 processJson(json); }); client.disconnect(); } catch (MqttException e) { e.printStackTrace(); } } private static void processJson(JSONObject json) { // 在这里处理 JSON 对象,根据需要读取其中的字段值 // 示例:读取名为 "name" 的字段 String name = json.getString("name"); System.out.println("Name: " + name); } } ``` 在上述示例代码中,我们使用了一个 Lambda 表达式来定义订阅消息时的回调函数。在回调函数中,我们首先将收到的 MQTT 消息转换字符串 `payload`,然后将其解析为 JSON 对象 `json`。 接下来,我们调用 `processJson` 函数来处理 JSON 对象。你可以在该函数中根据需要读取和操作 JSON 中的字段。 请记得将示例中的 `broker`、`clientId` 和 `topic` 替换为你实际使用的值。另外,为了成功解析 JSON,你可能需要添加 JSON 解析库的依赖,比如 `org.json` 或者其他更常用的 JSON 解析库,具体取决于你的项目需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值