537|2

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【匠芯创D133CBS】--2.Rt-thread系统下使用CJSON组包解包数据 [复制链接]

 
# 简介 cJSON是一个用C语言的轻量级JSON编解码器,它允许开发者在C程序中轻松地创建、解析和处理JSON数据。cJSON库的主要特点包括轻便、易用和跨平台,使其成为处理JSON数据的理想选择,特别是在资源受限的环境中,如嵌入式系统和单片机开发中。在开发中经常会使用到JSON 来配置用户信息,及解析网络或本地的JSON文件从中提取配置信息。匠芯创的开发包的RT-thread 系统内部已经支持了cJSON 的软件包我们不需要额外的修改即可直接在RT-thread 平台上使用CJSON,本次我们基于RT-thread 环境下使用CJSON 来打包及解包CJSON 数据。

CJSON 代码加入编译

在RT-thread 环境下使用CJSON 软件包非常的简单只要在menucoonfig 界面下打开CJOSN 配置开关即可。

配置开启后在命令行使用scons 工具编译代码发现CJSON 的源代码已经被加入工程编译了

CJSON 对数据的组包过程需要动态申请内存,及删除的时候需要释放内存,其中会依赖平台相关的内存动态申请释放的接口在RT-thread 的CJSON软件包里面已经做了这方面的适配工作,对应的处理如下已经对接到RT-thread 的接口了,我们不需要再额外修改了。

编写测试代码验证

编写如下代码验证组包逻辑:

  1. #include <rtthread.h>
  2. #include <cJSON.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. void json_pack(rt_uint16_t date1 ,rt_uint16_t date2 ,rt_uint16_t date3)
  6. {
  7. char *str=NULL;
  8. /* 创建一个JSON数据对象(链表头结点) */
  9. cJSON *cupload = cJSON_CreateObject();
  10. /* 创建int类型数据 */
  11. cJSON *cdate1 = cJSON_CreateNumber(date1);
  12. cJSON *cdate2 = cJSON_CreateNumber(date2);
  13. cJSON *cdate3 = cJSON_CreateNumber(date3);
  14. /* 创建一个JSON数据对象(链表结点) //创建JSON对象,{}扩起来的*/
  15. cJSON *cparams = cJSON_CreateObject();
  16. /* 创建 "date": cdate键值对,加入到 cparams对象中*/
  17. cJSON_AddItemToObject(cparams, "date1", cdate1);
  18. cJSON_AddItemToObject(cparams, "date2", cdate2);
  19. cJSON_AddItemToObject(cparams, "date3", cdate3);
  20. /* 创建字符串类型数据 */
  21. cJSON *cclientToken = cJSON_CreateString("clientToken-18b42b4ee12");
  22. cJSON *creport = cJSON_CreateString("report");
  23. /* 加入到JSON数据对象cupload */
  24. cJSON_AddItemToObject(cupload, "method", creport);
  25. cJSON_AddItemToObject(cupload, "clientToken", cclientToken);
  26. cJSON_AddItemToObject(cupload, "params", cparams);
  27. /* 转换为标准JSON数据格式 */
  28. str=cJSON_Print(cupload);
  29. rt_kprintf("cjson:%s",str);
  30. /* 释放str内存 */
  31. cJSON_free(str);
  32. /* 删除json对象,释放内存 */
  33. cJSON_Delete(cupload);
  34. }
  35. static int cmd_cjson_package(int argc, char **argv)
  36. {
  37. json_pack(100 ,200 ,300);
  38. return 0;
  39. }
  40. MSH_CMD_EXPORT_ALIAS(cmd_cjson_package, cjsonp, package json data);

编写如下代码验证解包逻辑:

  1. /*
  2. {
  3. "method": "report",
  4. "clientToken": "clientToken-18b42b4ee12",
  5. "params": {
  6. "date1": 1,
  7. "date2": 2,
  8. "date3": 3
  9. }
  10. */
  11. void json_unpack()
  12. {
  13. /* json_str为模拟需要解析的json数据包 */
  14. char *json_str =" {\"method\":\"report\",\"clientToken\": \"clientToken-18b42b4ee12\",\"params\":{\"date1\": 1,\"date2\": 2,\"date3\": 3}}";
  15. char *str=NULL;
  16. rt_uint8_t date;
  17. cJSON *cjson_data;
  18. cjson_data = cJSON_Parse(json_str);//将json字符串转化成CJSON结构体类型的数据
  19. if(!cjson_data)
  20. {
  21. //转换错误则退出解析
  22. rt_kprintf("json phase error%s\r\n",cjson_data);
  23. cJSON_Delete(cjson_data);
  24. return;
  25. }
  26. /*将"params"成员 放入cparams*/
  27. cJSON* cparams = cJSON_GetObjectItem(cjson_data,"params");
  28. if(cparams)
  29. {
  30. /* 将"params"成员里面的"date1"转换为标准JSON数据格式 */
  31. str = cJSON_Print(cJSON_GetObjectItem(cparams,"date1"));
  32. /* 将str转换int类型*/
  33. date= atoi(str);
  34. if(date)rt_kprintf("date:%d\r\n",date);
  35. /* 释放str内存*/
  36. cJSON_free(str);
  37. str = cJSON_Print(cJSON_GetObjectItem(cparams,"date2"));
  38. date= atoi(str);
  39. if(date)rt_kprintf("date2:%d\r\n",date);
  40. cJSON_free(str);
  41. str = cJSON_Print(cJSON_GetObjectItem(cparams,"date3"));
  42. date= atoi(str);
  43. if(date)rt_kprintf("date3:%d\r\n",date);
  44. cJSON_free(str);
  45. }
  46. else
  47. {
  48. rt_kprintf("str phase error\r\n");
  49. }
  50. /* 删除json对象,释放内存 */
  51. cJSON_Delete(cjson_data);
  52. }
  53. static int cmd_cjson_unpackage(int argc, char **argv)
  54. {
  55. json_unpack();
  56. return 0;
  57. }
  58. MSH_CMD_EXPORT_ALIAS(cmd_cjson_unpackage, cjsonup, unpackage json data);

烧写板卡验证

输入测试命令cjsonp 验证打包逻辑,输入后发现打印输出不完整没有打印完整整包数据:

调查发现是因为console 的输出buff 不够造成的打印被截断,按照如下方法修改buff 大小配置

修改后发现已经可以按照预期的打印出组包的数据了:

输入cjsonup 命令也按照预期解析到数据了。

查看精华帖全部内容,请登录或者注册

最新回复

RT-thread 越来越做得不错了很多软件库都直接包含进去了。用CJSON比直接解析方便多了。   详情 回复 发表于 2024-8-19 13:51
点赞(1) 关注
 
 

回复
举报

6205

帖子

4

TA的资源

版主

沙发
 

RT-thread 越来越做得不错了很多软件库都直接包含进去了。用CJSON比直接解析方便多了。

点评

相对组件很丰富,好多现成的软件包可以拿来使用这点比较方便  详情 回复 发表于 2024-8-21 20:12
 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
damiaa 发表于 2024-8-19 13:51 RT-thread 越来越做得不错了很多软件库都直接包含进去了。用CJSON比直接解析方便多了。

相对组件很丰富,好多现成的软件包可以拿来使用这点比较方便

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
直播报名最后1周:艾迈斯欧司朗 OSP 开放协议,从氛围灯动态照明到传感器交互融合
直播时间:4月22日(周二)10:00
直播奖励:京东卡、蓝牙温湿度计、定制水杯

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 8

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表