当前位置: 首页 > 文档资料 > 五天入门物联网 >

1.8.1.1 API

优质
小牛编辑
138浏览
2023-12-01

contiki的COAP在apps/er-coap中实现。Erbium REST引擎在apps/rest-engine中实现 COAP引擎(当前版本COAP-18)在由er-coap-engine.c实现。 引擎接口由以下结构提供:

const struct rest_implementation coap_rest_implementation = {
coap_init_engine,
coap_set_service_callback,
coap_get_header_uri_path,
(...)
}

再次调用CoAP引擎:

REST.get_query_variable();

Web服务抽象为资源,并且可以通过它们的URL唯一地识别。

REST基本设计采用HTTP或COAP协议的典型CRUD操作(创建,读取,更新,删除):

  • POST:创建资源
  • GET:获取资源
  • PUT:更新资源
  • 删除:删除资源

服务器上有很多可用的资源。服务器的每个资源都具有可供REST层调用响应客户端请求的处理函数。服务器向客户端发送所请求资源内容作为响应。

apps/rest-engine中定义有相关宏,可用于创建新的COAP资源。

正常资源(normal resource)可由关联资源储量函数的静态Uri路径定义,这也是其他资源类型的基础。

父资源通过评估Uri路径管理若干子资源,子资源可能比父资源路径长

#define PARENT_RESOURCE(name, attributes, get_handler, post_handler, put_handler,
delete_handler) \
resource_t name = { NULL, NULL, HAS_SUB_RESOURCES, attributes, get_handler,
post_handler, put_handler, delete_handler, { NULL } }

如果服务器不能立即响应CON请求,服务器将发送ACK空消息简单响应,这样客户端就停止重发请求。当服务器准备好响应后,它发送CON消息响应。

下面的宏允许创建独立响应的COAP资源:

#define SEPARATE_RESOURCE(name, attributes, get_handler, post_handler, put_handler,
delete_handler, resume_handler) \
resource_t name = { NULL, NULL, IS_SEPARATE, attributes, get_handler,
post_handler, put_handler, delete_handler, { .resume = resume_handler } }

事件资源与周期资源类似,但对于非周期性事件如按下按钮,可调用event_handler处理。

#define EVENT_RESOURCE(name, attributes, get_handler, post_handler, put_handler,
delete_handler, event_handler) \
resource_t name = { NULL, NULL, IS_OBSERVABLE, attributes, get_handler,
post_handler, put_handler, delete_handler, { .trigger = event_handler } }

如果我们需要声明周期资源,例如轮询传感器和发布变量到订阅客户端,那么我们应该使用:

#define PERIODIC_RESOURCE(name, attributes, get_handler, post_handler, put_handler,
delete_handler, period, periodic_handler) \
periodic_resource_t periodic_##name; \
resource_t name = { NULL, NULL, IS_OBSERVABLE | IS_PERIODIC, attributes,
get_handler, post_handler, put_handler, delete_handler, { .periodic =
&periodic_##name } }; \
periodic_resource_t periodic_##name = { NULL, &name, period, { { 0 } },
periodic_handler };

注意,PERIODIC_RESOURCE和EVENT_RESOURCE可可观察,意味着指定资源变化将通知客户端。

一旦我们声明并实现了资源,我们需要初始化REST框架,并启动HTTP或COAP进程。 可以调用以下函数实现:

void rest_init_engine(void);

如果想要访问的已声明资源,我们需要还调用以下函数注册(激活)资源。

void rest_activate_resource(resource_t *resource, char *path);

假定在res-hello.c中创建了hello-world资源,声明如下

"title=\"Hello world: ?len=0..\";rt=\"Text\"",
res_get_handler,
NULL,
NULL,
NULL);

为了使能(激活)资源,调用函数:

rest_activate_resource(&res_hello, "test/hello");

这样将可以在test/hello URI路径下访问到hello-world资源。

rest_activate_resource()函数将资源存储到列表。当要列出可用的资源时,可调用rest_get_resources函数,返回资源列表。

rest_get_resources();

注意,COAP默认端口是5683。

下面进入实践环节,演示如何使用Coap。