保持CoAP响应,直到在Contiki上使用Erbium REST收到UDP响应为止

时间:2018-07-11 14:18:35

标签: udp contiki coap

我想向Erbium REST节点发出CoAP请求,在该请求中,我首先从另一个节点询问信息以用于响应。

为此,我命令REST节点向另一个节点发送UDP消息。此微粒将返回带有信息的响应。但是,此信息是异步接收的,在收到此信息之前,我无法阻止CoAP处理程序。

static void res_info_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset);
RESOURCE(res_info,
         "title=\"Getting info: ?len=0..\";rt=\"Text\"",
         res_info_handler,
         NULL,
         NULL,
         NULL);

static void
res_info_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
  send_to_mote("getInfo");

  //wait for the response: yield to other processes

  //if response has been received: continue
  response = info;

  REST.set_header_etag(response, (uint8_t *)&length, 1);
  REST.set_response_payload(response, buffer, length);
}

来自udp请求的数据在tcpip_handler中接收(从udp进程重复执行)

static void
tcpip_handler(void)
{
  char *str;

  if(uip_newdata()) {
    str = uip_appdata;
    str[uip_datalen()] = '\0';
    printf("ER: DATA recv '%s'\n", str);
    info = str;
  }
}

有人会知道我如何实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

由于Er基于Contiki,因此适用Contiki的任务机制;它们被描述为in the Contiki wiki

要点是,如果您想屈服于其他流程,则可以直接使用PROCESS_YIELD();这将暂停对该线程的处理,直到您通过向其发送事件将其从接收处理程序唤醒为止。