物的模型服务
更新时间:2018-10-19 11:29:34
linkkit_set_value
定义描述
函数原型 | int linkkit_set_value(linkkit_method_set_t method_set, const void thing_id, const char identifier, const void value, const char value_str) |
---|---|
描述 | 根据identifier 设置物对象的 TSL 属性,如果标识符为struct类型、event output类型或者service output类型,使用点'.'分隔字段;例如"identifier1.identifier2"指向特定的项 |
请求参数
参数 | 类型 | 必填 | 描述 | 备注 |
---|---|---|---|---|
method_set | linkkit_method_set_t | 是 | 设置 TSL 属性的类型 | linkkit_method_set_property_value: 设置物模型property value linkkit_method_set_event_output_value: 设置物模型event output value linkkit_method_set_service_output_value: 设置物模型 service output value |
thing_id | const void* | 是 | 物的唯一标识符 | 物对象的标识符,可从 thing_create 回调获得 linkkit 创建的 thing id |
identifier | const char* | 是 | TSL 属性标示符 | 物对象 TSL 属性的标识符 |
value | const void* | 否 | 输入的属性值 | 和 value_str, 二选一必填 |
value_str | const char* | 否 | 输入的字符串格式的属性值 | 和 value, 二选一必填 |
示例
static int post_fault_alert(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);
//将EVENT_ERROR_IDENTIFIER事件上报给云端
return linkkit_trigger_event(sample->thing, EVENT_ERROR_IDENTIFIER, NULL);
}
返回值
值 | 详细描述 |
---|---|
0 | 物对象 TSL 属性设置成功 |
-1 | 物对象 TSL 属性设置失败 |
linkkit_get_value
定义描述
函数原型 | int linkkit_get_value(linkkit_method_get_t method_get, const void thing_id, const char identifier, void value, char* value_str) |
---|---|
描述 | 根据identifier 获取物对象的 TSL 属性 |
请求参数
参数 | 类型 | 必填 | 描述 | 备注 |
---|---|---|---|---|
method_get | linkkit_method_get_t | 是 | 获取的 TSL 属性的类型 | linkkit_method_get_property_value: 获取物模型 property value linkkit_method_get_event_output_value: 获取物模型 event output value linkkit_method_get_service_input_value: 获取物模型 service input value linkkit_method_get_service_output_value: 获取物模型 service output value |
thing_id | const void* | 是 | 物的唯一标识符 | 物对象的标识符,可从 thing_create 回调获得linkkit 创建的thing id |
identifier | const char* | 是 | TSL 属性标识 | 物对象 TSL 属性的标识符 |
返回参数
名称 | 类型 | 描述 |
---|---|---|
value | void* | 获取的属性值(和 value_str, 二选一必填) |
value_str | char** | 字符串类型的 value (和 value, 二选一必填) |
示例
static int thing_prop_changed(void* thing_id, char* property, void* ctx)
{
char* value_str = NULL;
char property_buf[64] = {0};
/* get new property value */
linkkit_get_value(linkkit_method_get_property_value, thing_id, property, NULL, &value_str);
LINKKIT_PRINTF("#### property(%s) new value set: %s ####\n", property, value_str);
/* do user's process logical here. */
linkkit_trigger_event(thing_id, EVENT_PROPERTY_POST_IDENTIFIER, property);
return 0;
}
返回值
值 | 详细描述 |
---|---|
0 | TSL 属性获取成功 |
-1 | TSL 属性获取失败 |
linkkit_set_tsl
定义描述
函数原型 | void linkkit_set_tsl(const char tsl, int tsl_len) |
---|---|
描述 | 从本地读取 TSL 文件,生成物的对象并添加到 linkkit 中 |
请求参数
参数 | 类型 | 必填 | 描述 | 备注 |
---|---|---|---|---|
tsl | const char* | 是 | 设备描述信息( JSON 类型) | tsl 必须和设备三元组所属的产品的 Alink JSON 格式协议相同 |
tsl_len | int | 是 | 设备描述信息长度 |
示例
#define TSL_STRING "{\"schema\":\"http://aliyun/iot/thing/desc/schema\",\"profile\":{\"productKey\":\"a1nmfrdo3MI\",\"deviceName\":\"light_demo_for_ilop_device_test\"},\"link\":\"/sys/a1nmfrdo3MI/light_demo_for_ilop_device_test/thing/\",\"services\":[{\"outputData\":[],\"identifier\":\"set\",\"inputData\":[{\"identifier\":\"LightSwitch\",\"dataType\":{\"specs\":{\"0\":\"关闭\",\"1\":\"开启\"},\"type\":\"bool\"},\"name\":\"主灯开关\"},{\"identifier\":\"WorkMode\",\"dataType\":{\"specs\":{\"0\":\"手动\",\"1\":\"阅读\",\"2\":\"影院\",\"3\":\"夜灯\",\"4\":\"生活\",\"5\":\"柔和\"},\"type\":\"enum\"},\"name\":\"工作模式\"}],\"method\":\"thing.service.property.set\",\"name\":\"set\",\"required\":true,\"callType\":\"sync\",\"desc\":\"属性设置\"},{\"outputData\":[{\"identifier\":\"LightSwitch\",\"dataType\":{\"specs\":{\"0\":\"关闭\",\"1\":\"开启\"},\"type\":\"bool\"},\"name\":\"主灯开关\"},{\"identifier\":\"WorkMode\",\"dataType\":{\"specs\":{\"0\":\"手动\",\"1\":\"阅读\",\"2\":\"影院\",\"3\":\"夜灯\",\"4\":\"生活\",\"5\":\"柔和\"},\"type\":\"enum\"},\"name\":\"工作模式\"}],\"identifier\":\"get\",\"inputData\":[\"LightSwitch\",\"WorkMode\"],\"method\":\"thing.service.property.get\",\"name\":\"get\",\"required\":true,\"callType\":\"sync\",\"desc\":\"属性获取\"},{\"outputData\":[],\"identifier\":\"SetLightSwitchTimer\",\"inputData\":[{\"identifier\":\"Timer\",\"dataType\":{\"specs\":{\"unit\":\"min\",\"min\":\"0\",\"unitName\":\"分钟\",\"max\":\"1440\"},\"type\":\"int\"},\"name\":\"计时器\"},{\"identifier\":\"LightSwitch\",\"dataType\":{\"specs\":{\"0\":\"关闭\",\"1\":\"开启\"},\"type\":\"bool\"},\"name\":\"主灯开关\"}],\"method\":\"thing.service.SetLightSwitchTimer\",\"name\":\"设置主灯开关倒计时\",\"required\":true,\"callType\":\"async\"},{\"outputData\":[],\"identifier\":\"StopCountdown\",\"inputData\":[],\"method\":\"thing.service.StopCountdown\",\"name\":\"停止倒计时\",\"required\":true,\"callType\":\"async\"},{\"outputData\":[],\"identifier\":\"FlipLightSwitch\",\"inputData\":[],\"method\":\"thing.service.FlipLightSwitch\",\"name\":\"翻转主灯开关\",\"required\":true,\"callType\":\"async\"}],\"properties\":[{\"identifier\":\"LightSwitch\",\"dataType\":{\"specs\":{\"0\":\"关闭\",\"1\":\"开启\"},\"type\":\"bool\"},\"name\":\"主灯开关\",\"accessMode\":\"rw\",\"required\":true},{\"identifier\":\"WorkMode\",\"dataType\":{\"specs\":{\"0\":\"手动\",\"1\":\"阅读\",\"2\":\"影院\",\"3\":\"夜灯\",\"4\":\"生活\",\"5\":\"柔和\"},\"type\":\"enum\"},\"name\":\"工作模式\",\"accessMode\":\"rw\",\"required\":true}],\"events\":[{\"outputData\":[{\"identifier\":\"LightSwitch\",\"dataType\":{\"specs\":{\"0\":\"关闭\",\"1\":\"开启\"},\"type\":\"bool\"},\"name\":\"主灯开关\"},{\"identifier\":\"WorkMode\",\"dataType\":{\"specs\":{\"0\":\"手动\",\"1\":\"阅读\",\"2\":\"影院\",\"3\":\"夜灯\",\"4\":\"生活\",\"5\":\"柔和\"},\"type\":\"enum\"},\"name\":\"工作模式\"}],\"identifier\":\"post\",\"method\":\"thing.event.property.post\",\"name\":\"post\",\"type\":\"info\",\"required\":true,\"desc\":\"属性上报\"},{\"outputData\":[{\"identifier\":\"errorCode\",\"dataType\":{\"specs\":{\"0\":\"正常\"},\"type\":\"enum\"},\"name\":\"故障代码\"}],\"identifier\":\"Error\",\"method\":\"thing.event.Error.post\",\"name\":\"故障上报\",\"type\":\"info\",\"required\":true}]}"
linkkit_set_tsl(TSL_STRING, strlen(TSL_STRING));
返回值
值 | 详细描述 |
---|---|
NULL | 失败 |
other | 物的唯一标识符 |
linkkit_answer_service
定义描述
| 函数原型 | #ifdef RRPC_ENABLED
int linkkit_answer_service(const void thing_id, const char service_identifier, int response_id, int code, int rrpc);
#else
int linkkit_answer_service(const void thing_id, const char service_identifier, int response_id, int code);
#endif / RRPC_ENABLED / |
| --- | --- |
| 描述 | 对云端服务请求进行回应 |
请求参数
参数 | 类型 | 必填 | 描述 | 备注 |
---|---|---|---|---|
thing_id | const void* | 是 | 物的唯一标识符 | 物对象的标识符,可从 thing_create 回调获得 linkkit 创建的 thing id |
service_identifer | const char* | 是 | 服务标识符 | 用户应该从 linkkit 的回调函数获得此标识符,使用此函数生成回复码发送给服务端 |
response_id | int | 是 | 回复 ID | response_id 应该从linkkit 回调函数中获得此参数 |
code | int | 是 | 回复状态码 | 200: 成功 400: 失败 |
[rrpc] | int | 否 | rrpc服务 | 0:普通服务调用 非0:rrpc服务调用 宏定义RRPC_ENABLED此参数有效 |
示例
#ifdef RRPC_ENABLED
static int handle_service_custom(sample_context_t* sample, void* thing, char* service_identifier, int request_id, int rrpc)
#else
static int handle_service_custom(sample_context_t* sample, void* thing, char* service_identifier, int request_id)
#endif /* RRPC_ENABLED */
{
char identifier[128] = {0};
/*
* get iutput value.
*/
snprintf(identifier, sizeof(identifier), "%s.%s", service_identifier, "transparency");
linkkit_get_value(linkkit_method_get_service_input_value, thing, identifier, &sample->service_custom_input_transparency, NULL);
/*
* set output value according to user's process result.
*/
snprintf(identifier, sizeof(identifier), "%s.%s", service_identifier, "Contrastratio");
sample->service_custom_output_contrastratio = sample->service_custom_input_transparency >= 0 ? sample->service_custom_input_transparency : sample->service_custom_input_transparency * -1;
linkkit_set_value(linkkit_method_set_service_output_value, thing, identifier, &sample->service_custom_output_contrastratio, NULL);
#ifdef RRPC_ENABLED
linkkit_answer_service(thing, service_identifier, request_id, 200, rrpc);
#else
linkkit_answer_service(thing, service_identifier, request_id, 200);
#endif /* RRPC_ENABLED */
return 0;
}
#ifdef RRPC_ENABLED
static int thing_call_service(void* thing_id, char* service, int request_id, int rrpc, void* ctx)
#else
static int thing_call_service(void* thing_id, char* service, int request_id, void* ctx)
#endif /* RRPC_ENABLED */
{
sample_context_t* sample = ctx;
LINKKIT_PRINTF("service(%s) requested, id: thing@%p, request id:%d\n",
service, thing_id, request_id);
if (strcmp(service, "Custom") == 0) {
#ifdef RRPC_ENABLED
handle_service_custom(sample, thing_id, service, request_id, rrpc);
#else
handle_service_custom(sample, thing_id, service, request_id);
#endif /* RRPC_ENABLED */
}
return 0;
}
返回值
值 | 详细描述 |
---|---|
0 | 成功 |
-1 | 失败 |
linkkit_invoke_raw_service
定义描述
函数原型 | int linkkit_invoke_raw_service(const void thing_id, int is_up_raw, void raw_data, int raw_data_length) |
---|---|
描述 | 向云端发送裸数据 |
请求参数
参数 | 类型 | 必填 | 描述 | 备注 |
---|---|---|---|---|
thing_id | const void* | 是 | 物的唯一标识符 | 物对象的标识符,可从 thing_create 回调获得 linkkit 创建的 thing id |
is_up_ram | int | 是 | 消息类型 | 非0: raw 上行 0: raw 下行回复 |
raw_data | void* | 是 | 裸数据 | 发送给云端的裸数据 |
raw_data_length | int | 是 | 裸数据长度 | 发送给云端的裸数据长度 |
示例
static int raw_data_arrived(void* thing_id, void* data, int len, void* ctx)
{
char raw_data[128] = {0};
LINKKIT_PRINTF("raw data arrived,len:%d\n", len);
/* do user's raw data process logical here. */
/* ............................... */
/* user's raw data process logical complete */
snprintf(raw_data, sizeof(raw_data), "test down raw reply data %lld", HAL_UptimeMs());
linkkit_invoke_raw_service(thing_id, 0, raw_data, strlen(raw_data));
return 0;
}
返回值
值 | 详细描述 |
---|---|
0 | 成功 |
-1 | 失败 |
linkkit_trigger_event
定义描述
函数原型 | int linkkit_trigger_event(const void thing_id, const char event_identifier, const char* property_identifier) |
---|---|
描述 | 上报设备事件到云端 |
请求参数
参数 | 类型 | 必填 | 描述 | 备注 |
---|---|---|---|---|
thing_id | const void* | 是 | 物的唯一标识符 | 物对象的标识符,可从 thing_create 回调获得 linkkit 创建的thing id |
event_identifier | const char* | 是 | 事件标示符 | 上报的事件的标识符 |
property_identifier | const char* | 是 | 属性标示符 | 如果 event_identifier所属字段的 method 为 "event.property.post", 则上报 property_identifier 对应的 property,否则上报所有的 property |
示例
static int post_event_error(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, NULL);
}
返回值
值 | 详细描述 |
---|---|
0 | 成功 |
-1 | 失败 |
linkkit_trigger_deviceinfo_operate
定义描述
函数原型 | int linkkit_trigger_deviceinfo_operate(const void thing_id, const char params, linkkit_deviceinfo_operate_t linkkit_deviceinfo_operation); |
---|---|
描述 | 向云端更新拓展属性 |
请求参数
参数 | 类型 | 必填 | 描述 | 备注 |
---|---|---|---|---|
thing_id | const void* | 是 | 物的唯一标识符 | 物对象的标识符,可从 thing_create 回调获得 linkkit 创建的thing id |
params | const char* | 是 | 拓展属性 | 需要在控制台拓展信息新增属性后方可使用 |
linkkit_deviceinfo_operation | linkkit_deviceinfo_operate_t | 是 | 设备拓展信息操作 | linkkit_deviceinfo_operate_update: 更新拓展属性 linkkit_deviceinfo_operate_delete: 删除拓展属性 |
示例
//需要在云控制台增加拓展属性Key:Temperature
if (now % 30 == 0 && is_active(sample_ctx)) {
ret = linkkit_trigger_deviceinfo_operate(sample_ctx->thing, "[{\"attrKey\":\"Temperature\",\"attrValue\":\"36.8\"}]", linkkit_deviceinfo_operate_update);
}
返回值
值 | 详细描述 |
---|---|
0 | 成功 |
-1 | 失败 |