You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

nrf9160使用CoAP PUT向Californium服务器发JSON payload异常求助

问题原因分析与解决方案

JSON构造逻辑正确性判断

你当前构造JSON payload的方式没有问题,cJSON相关API调用符合规范,生成的JSON结构完全符合预期。

服务器仅收到"{\n\t"截断内容的核心原因(按出现概率从高到低排序)

  • 最高发问题:发送时payload长度参数传错
    nRF9160是32位Arm架构,指针类型的sizeof值固定为4。如果调用CoAP payload设置接口时,错误使用sizeof(payload)作为长度参数(payload是char*类型的指针),就会仅发送前4个字节,刚好匹配你服务器收到的"{\n\t"内容。
    正确长度参数需要用strlen(payload)获取JSON字符串的实际长度。
  • 发送逻辑未做完整性校验
    CoAP基于UDP/DTLS传输,如果你直接调用BSD socket接口发送数据,发送函数可能因为socket缓冲区满、DTLS握手未完成等原因,仅返回部分发送成功的长度。你如果没有判断返回值、补发剩余未发送的字节,就会导致服务器只收到部分内容。
  • payload内存被意外篡改
    检查cJSON_Print返回后到发送前的代码逻辑,是否存在栈溢出、指针越界等操作覆盖了payload字符串后续的内容,也会导致发送内容被截断。
  • DTLS链路未建立就发送数据
    你使用的5684是CoAP over DTLS的加密端口,如果DTLS握手还没有完成就发送应用数据,数据会被modem直接丢弃或者截断,也会出现接收不完整的问题。

修复步骤

  1. 发送前打印payload的完整内容和strlen(payload)的数值,确认JSON生成正常、长度符合预期
  2. 替换CoAP发送接口的长度参数为strlen(payload),禁止用sizeof获取指针类型的长度
  3. 检查发送函数返回值,确保所有字节都被成功发出
  4. 确认DTLS链路建立完成后再执行payload发送操作
  5. 发送完成后调用cJSON_Delete(item)和cJSON_free(payload)释放内存,避免内存泄漏

内容的提问来源于stack exchange,提问作者ced237

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:57:01