物模型编程
更新时间:2018-10-23 21:20:44
本地预置TSL
设备的物模型(TSL)文件可以预先设置到程序中,也可以到云端去动态拉取。可以调用linkkit_set_tsl()函数来静态设置设备的模型,如下所示:
if (!get_tsl_from_cloud) {
/*
* if get_tsl_from_cloud = 0, set default tsl [TSL_STRING]
* please modify TSL_STRING by the TSL's defined.
*/
linkkit_set_tsl(TSL_STRING, strlen(TSL_STRING));
}
初始化与连接云端
调用linkkit_start()进行初始化以及连接云端,示例代码如下所示:
int get_tsl_from_cloud = 0; /* the param of whether it is get tsl from cloud */
linkkit_ops_t linkkit_ops = {
.on_connect = on_connect, /* connect handler */
.on_disconnect = on_disconnect, /* disconnect handler */
.raw_data_arrived = raw_data_arrived, /* receive raw data handler */
.thing_create = thing_create, /* thing created handler */
.thing_enable = thing_enable, /* thing enabled handler */
.thing_disable = thing_disable, /* thing disabled handler */
.thing_call_service = thing_call_service, /* self-defined service handler */
.thing_prop_changed = thing_prop_changed, /* property set handler */
.linkit_data_arrived = linkit_data_arrived, /* transparent transmission data handler */
};
EXAMPLE_TRACE("linkkit start");
if (-1 == linkkit_start(16, get_tsl_from_cloud, linkkit_loglevel_debug, &linkkit_ops, linkkit_cloud_domain_shanghai,
&sample_ctx)) {
EXAMPLE_TRACE("linkkit start fail");
return -1;
}
注:
如果TSL文件需要动态拉取,调用linkkit_start时的第二个参数设置为1即可
上面例子中的linkkit_cloud_domain_shanghai是指定设备去连接中国的服务器
属性上报
属性上报通过调用linkkit_set_value()以及linkkit_post_property()实现,如下面的代码所示:
linkkit_set_value(linkkit_method_set_property_value, sample_ctx->thing, "WIFI_Band", band, NULL);
linkkit_post_property(sample_ctx->thing,"WIFI_Band",post_property_cb);
属性设置
属性设置通过调用linkkit_set_value()实现,需要注意的是,属性设置只是将属性值设置到本地缓存中,并不与云端发生交互,如果需要将属性值同步到云端,还需要调用linkkit_post_property()上报属性。属性设置如下面的代码所示:
/* 设置数值类型属性,以int型为例 */
int wifi_channel = 3;
linkkit_set_value(linkkit_method_set_property_value, sample_ctx->thing, "WIFI_Channel", &wifi_channel, NULL);
/* 设置字符串类型属性 */
char *wifi_ap_bssid = "router";
linkkit_set_value(linkkit_method_set_property_value, sample_ctx->thing, "WIFI_AP_BSSID", wifi_ap_bssid, NULL);
服务处理
服务是由云端主动下推的消息,可以通过注册回调函数的方式接收云端下推的数据,如下面的代码所示:
linkkit_ops_t linkkit_ops = {
.on_connect = on_connect, /* connect handler */
.on_disconnect = on_disconnect, /* disconnect handler */
.raw_data_arrived = raw_data_arrived, /* receive raw data handler */
.thing_create = thing_create, /* thing created handler */
.thing_enable = thing_enable, /* thing enabled handler */
.thing_disable = thing_disable, /* thing disabled handler */
.thing_call_service = thing_call_service, /* self-defined service handler */
.thing_prop_changed = thing_prop_changed, /* property set handler */
.linkit_data_arrived = linkit_data_arrived, /* transparent transmission data handler */
};
/* 云端下推的数据会到达thing_call_service这个回调函数中,可以在这里处理服务请求 */
static int thing_call_service(const void *thing_id, const char *service, int request_id, void *ctx)
{
sample_context_t *sample_ctx = ctx;
EXAMPLE_TRACE("service(%s) requested, id: thing@%p, request id:%d\n",
service, thing_id, request_id);
/* please follow TSL modify the idendifier --- Custom */
if (strcmp(service, "Custom") == 0) {
/* 在这里处理"Custom"服务的请求,云端下推的服务输入参数可用linkkit_get_value获取 */
int transparency_value = 0;
linkkit_get_value(linkkit_method_get_service_input_value, thing, "Custom.transparency", &transparency_value, NULL);
EXAMPLE_TRACE("identifier: %s value is %d.\n", identifier, transparency_value);
/* 云端下推的消息内容是服务的输入参数,如果用户有定义服务的输出参数,则需要先使用linkkit_set_value设置输出参数,
使用linkkit_answer_service将输出参数返回给云端,如下代码所示 */
int contrastratio_value = transparency_value + 5;
linkkit_set_value(linkkit_method_set_service_output_value, thing, "Custom.Contrastratio", &contrastratio_value, NULL);
linkkit_answer_service(thing, service_identifier, request_id, 200);
}
return 0;
}
事件上报
事件的上报可以通过linkkit_set_value(), linkkit_trigger_event()这两个函数的组合来完成, 云端返回的应答可在post_property_cb()中得到处理,如下所示:
int trigger_event(sample_context_t *sample)
{
char event_output_identifier[64];
snprintf(event_output_identifier, sizeof(event_output_identifier), "%s.%s", EVENT_ERROR_IDENTIFIER, EVENT_ERROR_OUTPUT_INFO_IDENTIFIER);
int errorCode = 0;
linkkit_set_value(linkkit_method_set_event_output_value,
sample->thing,
event_output_identifier,
&errorCode, NULL);
return linkkit_trigger_event(sample->thing, EVENT_ERROR_IDENTIFIER, post_property_cb);
}