使用Jansson库在C语言中创建JSON对象并通过Paho MQTT C客户端发送时出现段错误的问题排查
解决Paho C客户端发送JSON消息时的段错误问题
嘿,我能帮你找出问题所在啦!你遇到的段错误,核心原因是Jansson的json_pack函数里,格式说明符和变量类型完全不匹配,导致程序错误地访问了非法内存区域。
问题分析
你在json_pack里用了s:s格式,但这个格式是用来处理**字符串类型(char*)**的键值对。而你的变量timestamp是long int类型,temperature、D850、D280都是float类型——把数字类型传给字符串格式符,会让Jansson尝试把数字当作字符串指针去读取,这必然会触发内存访问错误,也就是你看到的段错误。
修正后的代码
我们需要把格式说明符改成对应变量类型的:
l对应long int类型f对应float类型
修正后的完整核心代码如下:
#include <stdio.h> #include <jansson.h> int main(int argc, char* argv[]) { // ..... 创建客户端 .... // 创建JSON long int timestamp = 1609446771; float temperature = 30.14; float D850 = 102.48; float D280 = 4845.84; // 注意这里的格式符:l对应long int,f对应float json_t *obj = json_pack("{s:l,s:f,s:f,s:f}", "timestamp", timestamp, "temperature", temperature, "D850", D850, "D280", D280); if (!obj) { fprintf(stderr, "Failed to create JSON object\n"); return 1; } // 将JSON对象转换为字符串,用于MQTT发送 char *json_msg = json_dumps(obj, JSON_COMPACT); // JSON_COMPACT生成紧凑的无格式字符串,适合网络传输 if (!json_msg) { fprintf(stderr, "Failed to dump JSON to string\n"); json_decref(obj); return 1; } // .... 发布消息:用json_msg作为MQTT的payload .... // 示例:MQTTClient_publish(client, topic, strlen(json_msg), json_msg, QOS, retained, &token); // 记得释放内存,避免泄漏 free(json_msg); json_decref(obj); // ..... 其他客户端清理操作 .... return 0; }
额外注意事项
- 内存管理:Jansson的对象需要用
json_decref释放,json_dumps生成的字符串需要用free释放,不然会有内存泄漏。 - 编译参数:如果你的Jansson头文件不在系统默认路径,编译时需要加上
-I参数指定头文件目录,比如:gcc -I/home/MYUSER/jansson/include -L/home/MYUSER/MQTT/paho.mqtt.c/build/output pahocclient.c -lpaho-mqtt3c -ljansson -lm -o publish_c.out
这样修正后,程序应该就能正常运行,不会再出现段错误啦!
内容的提问来源于stack exchange,提问作者Shahriar.M
相关产品推荐
相关产品推荐

