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

时间:2017-09-06 08:18:00

标签: c contiki coap

我正在使用RE-Mote Development BoardContiki-OS。我正在与 Adafruit BNO055绝对定位传感器进行接口。

我特别想要:

  1. 浮点精度加速度计数据
  2. Euler Angles 的浮点精度。
  3. 我做了一些挖掘,发现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资源的最佳方法是什么?

1 个答案:

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