gpt4 book ai didi

c - 在基于 CC2538 的 RE-Mote 板中使用浮点用于带有 Contiki OS 的 CoAP 服务器

转载 作者:行者123 更新时间:2023-11-30 14:55:15 24 4
gpt4 key购买 nike

我正在使用RE-Mote Development Board以及Contiki-OS 。我将其与 Adafruit BNO055 绝对方向传感器连接。

我特别想要:

  1. 浮点精度的加速度计数据
  2. 浮点精度的欧拉角

我做了一些深入研究,发现 Contiki 中的 printf 与主板相关,并且没有多少主板具有浮点打印实现 source

但是,这对于创建 CoAP 资源可能变得至关重要,因为返回数据时代码使用 snprintf

代码片段:

/*GET Method*/

RESOURCE(res_bno055,
"title=\"BNO055 Euler\";rt=\"bno055\"",
res_get_handler,
NULL,
NULL,
NULL);

static void res_get_handler(void *request, void *response, uint8_t *buffer,
uint16_t preferred_size, int32_t *offset) {

adafruit_bno055_vector_t euler_data = getVector(VECTOR_EULER);
double eu_x = euler_data.x;
double eu_y = euler_data.y;
double eu_z = euler_data.z;

unsigned int accept = -1;

REST.get_header_accept(request, &accept);

if(accept == -1 || accept == REST.type.TEXT_PLAIN) {
/*PLAIN TEXT Response*/
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
// >>>>>>>>>>will snprintf create a problem? <<<<<<<<<<<<<<<<<
snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%lf, %lf, %lf",eu_x,eu_y, eu_z,);
REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
} else if (accept == REST.type.APPLICATION_JSON) {
/*Return JSON REPONSE*/
REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
// >>>>>>>>>>>>>>>same question here.. <<<<<<<<<<<<<<<<<<<<<<<<<<<<
snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'bno055_eu':{ 'X':%f, 'Y':%f, 'Z':%f}}",
eu_x, eu_y, eu_z);
REST.set_response_payload(response, buffer, strlen((char *)buffer));
} else {
REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
const char *msg = "Only text/plain and application/json";
REST.set_response_payload(response, msg, strlen(msg));
}
}

我已经尝试了上述资源代码并设置了CoAP服务器,但我得到了

纯文本响应:

, , ,

json 响应:

{'bno055_eu: { 'X': , 'Y': , 'Z': }}

结构:

typedef struct {
double x;
double y;
double z;
}adafruit_bno055_vector_t

创建具有浮点响应的 GET CoAP 资源的最佳方式是什么?

最佳答案

@eugene-nikolaev I am just playing by the examples available. I am not sure what you mean but I think set_payload_response() function might not take the values of double. If you can give me a hint as to how to proceed I can try it out.

我对 C 的经验不是很丰富,所以我无法向您展示一个好的片段。但是您将缓冲区转换为 (uint8_t) 并且肯定 set_payload_response 获取二进制有效负载。

就像(我再次指出 - 它可能不太正确):

REST.set_response_payload(response, (uint8_t *) &euler_data, sizeof(adafruit_bno055_vector_t));

但它仅适用于您的 else 分支。

在 CoAP 的经典含义中,我用于发送二进制有效负载或 CBOR 编码的有效负载,并在类似情况下在另一端解析它。这完全取决于您的 CoAP 同行是什么以及您想要实现什么目标。

UPD:关于纯文本/json 分支 - 我建议您检查模块提供的值的范围/精度。也许像 @Lundin 所说的那样使用 double 没有什么大意义。

另外,你真的需要纯文本和 json 格式吗?

关于c - 在基于 CC2538 的 RE-Mote 板中使用浮点用于带有 Contiki OS 的 CoAP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46070117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com