在基于 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 绝对方向传感器 连接起来。

我特别想要:

  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': }}

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 格式吗?