物模型编程

更新时间: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);
}

results matching ""

    No results matching ""