我使用的是Nordic Semiconductor的开发套件nrf9160。我的代码中的服务器主机名是";加利福尼亚州。eclipseprojects。io"以及对等体";5684";。
我想使用CoAP的PUT方法发送一个JSON负载。为此,我使用以下函数创建JSON Payload:
{
cJSON *root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "JSON", 50);
cJSON_AddNumberToObject(root, "Content-Form", 12);
return root;
}
主要功能:
cJSON_Init();
cJSON *item = createJsonFromParams();
char *payload=cJSON_Print(item);
我发送的是:
{
"JSON": 50,
"Content-Form": 12
}
服务器得到的是:"{nt"
有人能帮忙告诉我,为什么会这样吗?这是发送JSON Payload的合适方式吗?
的结果
cJSON_Init();
cJSON *item = createJsonFromParams();
char *payload=cJSON_Print(item);
将是一个带有\000字节的通用C字符串,用于终止该字符串。
coap_packet_append_payload(&request, (uint8_t *)payload, sizeof(payload)-1);
是一个snippet,通常用于与sizeof相同范围的数组定义。
char payload[] = "I'm a array";
printf("sizeof %d, strlen %dn", sizeof(payload), strlen(payload));
打印:
尺寸12,strlen 11
因为sizeof包含尾部\000,所以strlen不包含。
如果您使用sizeof作为指针,作为
char *payload=cJSON_Print(item);
printf("sizeof %d, strlen %dn", sizeof(payload), strlen(payload));
结果将是指针的大小(取决于您的cpu架构(和返回的JSON字符串的长度。
尺寸4,strlen n
现在,您可以将错误减少1(对于数组来说是可以的(,结果是3。你需要做什么来修复它:
coap_packet_append_payload(&request, (uint8_t *)payload, strlen(payload));
请注意:C有很多陷阱,在这里,不要忘记在准备好后释放有效负载。如果您陷入这样的陷阱,您的应用程序将变得不稳定。