在基于 CC2538 的 RE-Mote 板中使用浮点用于带有 Contiki 的 CoAP 服务器 OS
using floating point in CC2538 based RE-Mote board for CoAP Server with Contiki OS
我正在使用 RE-Mote Development Board along with Contiki-OS。我正在将它与 Adafruit BNO055 绝对方向传感器 连接起来。
我特别想要:
- 浮点精度的加速度计数据。
- 浮点精度的欧拉角。
我做了一些深入研究,发现 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': }}
struct
:
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:关于 plaintext/json 分支 - 我建议您检查您的模块提供了哪些 range/precision 值。也许像@Lundin 所说的那样使用 double 没有什么大不了的。
此外,您真的需要纯文本和 json 格式吗?
我正在使用 RE-Mote Development Board along with Contiki-OS。我正在将它与 Adafruit BNO055 绝对方向传感器 连接起来。
我特别想要:
- 浮点精度的加速度计数据。
- 浮点精度的欧拉角。
我做了一些深入研究,发现 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': }}
struct
:
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:关于 plaintext/json 分支 - 我建议您检查您的模块提供了哪些 range/precision 值。也许像@Lundin 所说的那样使用 double 没有什么大不了的。
此外,您真的需要纯文本和 json 格式吗?