我想向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;
}
}
有人会知道我如何实现这一目标吗?
答案 0 :(得分:0)
由于Er基于Contiki,因此适用Contiki的任务机制;它们被描述为in the Contiki wiki。
要点是,如果您想屈服于其他流程,则可以直接使用PROCESS_YIELD()
;这将暂停对该线程的处理,直到您通过向其发送事件将其从接收处理程序唤醒为止。