我正在使用RE-Mote Development Board和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资源的最佳方法是什么?
答案 0 :(得分:1)
@ eugene-nikolaev我只是在玩可用的例子。我不确定你的意思,但我认为set_payload_response()函数可能不会采用double的值。如果你能给我一个关于如何继续的提示,我可以尝试一下。
我对C不是很有经验所以我不能&#39;给你一个很好的片段。但是你要将缓冲区转换为(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说道。
另外,你真的需要纯文本和json格式吗?