在基于CC2538的远程主板中使用浮点,用于带有Contiki OS的CoAP服务器
我正在使用。我正在将其与Adafruit BNO055绝对方向传感器连接 我特别想要:在基于CC2538的远程主板中使用浮点,用于带有Contiki OS的CoAP服务器,c,contiki,coap,C,Contiki,Coap,我正在使用。我正在将其与Adafruit BNO055绝对方向传感器连接 我特别想要: 加速计数据以浮点精度显示 浮点精度下的欧拉角 我做了一些深入研究,发现Contiki中的printf依赖于电路板,没有多少电路板具有浮点打印实现 但是,这对于创建CoAP资源可能变得至关重要,因为返回数据时代码使用snprintf 片段: /*GET Method*/ RESOURCE(res_bno055, "title=\"BNO055 Euler\";rt=\"bno055\"", r
printf
依赖于电路板,没有多少电路板具有浮点打印实现
但是,这对于创建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));
}
}
json响应:
结构
:
typedef struct {
double x;
double y;
double z;
}adafruit_bno055_vector_t
使用浮点响应创建GET CoAP资源的最佳方法是什么
@eugene nikolaev我只是在玩可用的例子。我不确定您的意思,但我认为set_payload_response()函数可能不接受double的值。如果你能给我一个如何进行的提示,我可以试试
我对C语言不是很有经验,所以我无法向您展示一个好的代码片段。但您正在将缓冲区强制转换为(uint8_t),并且确定set_payload_response会获取二进制有效负载
它会是这样的(我再次指出,它可能不太正确):
但它只适用于您的else
分支
在CoAP的经典含义中,我用于发送二进制有效负载或CBOR编码的有效负载,并在类似情况下在另一侧解析它。这完全取决于你的CoAP同龄人是什么以及你想要实现什么
UPD:关于明文/json分支,我建议您检查模块提供的值的范围/精度。也许像@Lundin所说的那样使用double没有什么意义
另外,您真的需要纯文本和json格式吗?为什么需要浮点?对于给定的代码来说,这远不是显而易见的。你需要做三角计算或类似的计算吗?我不相信指定板上的MCU有FPU,所以浮点将导致糟糕的性能。一个原因是亚GHz的可用性。另一个问题是,该应用程序将用于船上,在船上,加速计的更高精度至关重要。亚GHz无线电与浮点有什么关系?浮点运算究竟是如何提高精度的?因为众所周知,它们会降低精度。而且你的加速计没有64位分辨率,更可能是12位左右。所以,无论你在软件中做什么,你都不会得到比这更好的解决方案。我理解。谢谢亚GHz点有故障。道歉。我的意思是,该板是唯一一个在同一块板上提供亚GHz和2.4 GHz无线设备的板。如果我完全弄错了,很抱歉,但是为什么您需要sprintf呢?为什么不以字节的形式发送浮点值呢?+1表示CBOR。我认为JSON是传感器值的良好数据表示格式,因此我可以使用CoAP客户端轮询服务器,并在客户端收集信息进行一些分析。除此之外,我对任何方式的数据格式都持开放态度。
{'bno055_eu: { 'X': , 'Y': , 'Z': }}
typedef struct {
double x;
double y;
double z;
}adafruit_bno055_vector_t
REST.set_response_payload(response, (uint8_t *) &euler_data, sizeof(adafruit_bno055_vector_t));