欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
所有教程请看 AliOS Things 入门教程系列
此教程在SimonLiu的CSDN博客同步更新。
AliOS Things 2.1.0 的
linkkitapp
和旧版本相比有了很大的改变,linkkitapp
是最重要的一个例程,所有实际联网的产品基本都是基于linkkitapp
。现在你就跟随SimonLiu一起来看一下linkkitapp
如何进行属性设置请求处理和属性上报。
- 首先你要在智能生活平台创建产品并添加测试设备。假设产品有一个属性为
PowerSwitch
。 - 根据SimonLiu的ESP8266与AliOS Things 学习教程系列之十一来基于
linkkit app
新建自己的一个项目。 - 修改
linkkit_example_solo.c
源码。
3.1 修改设备的三元组。
3.2 源码中注册了如下回调:
/* Register Callback */
IOT_RegisterCallback(ITE_CONNECT_SUCC, user_connected_event_handler);
IOT_RegisterCallback(ITE_DISCONNECTED, user_disconnected_event_handler);
IOT_RegisterCallback(ITE_RAWDATA_ARRIVED, user_down_raw_data_arrived_event_handler);
IOT_RegisterCallback(ITE_SERVICE_REQUST, user_service_request_event_handler);
IOT_RegisterCallback(ITE_PROPERTY_SET, user_property_set_event_handler);
IOT_RegisterCallback(ITE_PROPERTY_GET, user_property_get_event_handler);
IOT_RegisterCallback(ITE_REPORT_REPLY, user_report_reply_event_handler);
IOT_RegisterCallback(ITE_TRIGGER_EVENT_REPLY, user_trigger_event_reply_event_handler);
IOT_RegisterCallback(ITE_TIMESTAMP_REPLY, user_timestamp_reply_event_handler);
IOT_RegisterCallback(ITE_INITIALIZE_COMPLETED, user_initialized);
IOT_RegisterCallback(ITE_FOTA, user_fota_event_handler);
IOT_RegisterCallback(ITE_COTA, user_cota_event_handler);
3.3 属性设置请求在user_property_set_event_handler()
中,默认代码是把下发到属性设置请求原样上报:
static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
{
int res = 0;
user_example_ctx_t *user_example_ctx = user_example_get_ctx();
EXAMPLE_TRACE("Property Set Received, Devid: %d, Request: %s", devid, request);
res = IOT_Linkkit_Report(user_example_ctx->master_devid, ITM_MSG_POST_PROPERTY,
(unsigned char *)request, request_len);
EXAMPLE_TRACE("Post Property Message ID: %d", res);
return 0;
}
3.4 我们跑一跑代码,然后从网页调试或者云智能
进行PowerSwitch
的属性改变,就可以看到PowerSwitch
属性设置请求如下:
␛[0m[626700] Publish Result: 0
[626700] Receive Message Type: 15
[626710] Receive Message: {"devid":0,"payload":{"PowerSwitch":0}}
␛[1;32;40muser_property_set_event_handler.183: Property Set Received, Devid: 0, Request: {"PowerSwitch":0}␛[0m
收到的内容就是{"PowerSwitch":0}
。
3.5 我们只需要解析{"PowerSwitch":0}
即可:
cJSON *root = NULL, *item_PowerSwitch = NULL;
root = cJSON_Parse(request);
item_PowerSwitch = cJSON_GetObjectItem(root, "PowerSwitch");
if (item_PowerSwitch != NULL)
{
if(item_PowerSwitch->valueint)
{
printf("\r\n Turn on power \r\n");
}
else
{
printf("\r\n Turn off power \r\n");
}
}
3.6 属性上报在user_post_property(void)
中,里面给出了正确和错误的案例。简单版本:
static int example_index = 0;
int res = 0;
user_example_ctx_t *user_example_ctx = user_example_get_ctx();
char *event_id = "Error";
char *event_payload = "NULL";
property_payload = "{\"LightSwitch\":0}";
/* 属性payload准备好以后, 使用如下接口进行上报 */
IOT_Linkkit_Report(devid, ITM_MSG_POST_PROPERTY, payload, strlen(payload));
3.7 不同类型的属性上报:
/* 整型数据 */
c har *paylo ad = "{ \"Br i ght ne ss\":50} ";
/* 浮点型数据上报 */
char *payload = "{\"Temperature\":11.11}";
/* 枚举型数据上报 */
char *payload = "{\"WorkMode\":2}";
/* 布尔型数据上报, 在物模型定义中, 布尔型为整型, 取值为0或1, 与JSON格式的整型不同 */
char *payload = "{\"LightSwitch\":1}";
/* 字符串数据上报 */
char *payload = "{\"Description\":\"Amazing Example\"}";
/* 时间型数据上报, 在物模型定义中, 时间型为字符串 */
char *payload = "{\"Timestamp\":\"1252512000\"}";
/* 复合类型属性上报, 在物模型定义中, 符合类型属性为JSON对象 */
c har *paylo ad = "{\"RGBColor:{\"Red\":11,\"Green\":22,\"Blue\":33} \"}";
/* 多属性上报, 如果需要上报以上各种数据类型的所有属性, 将它们放在一个JSON对象中即可 */
char *payload = "{\"Brightness\":50,\"Temperature\":11.11,\"WorkMode\":2,\"LightSwitch\":1};
属性的设置和上报我们就都完成了。其实并不复杂。