1 /*
2  * Copyright (C) 2015-2019 Alibaba Group Holding Limited
3  */
4 
5 #include "amp_platform.h"
6 #include "aos_system.h"
7 #include "amp_defines.h"
8 #include "aos_network.h"
9 #include "aos/kv.h"
10 #include "aiot_state_api.h"
11 #include "aiot_sysdep_api.h"
12 #include "aiot_mqtt_api.h"
13 #include "aiot_devinfo_api.h"
14 #include "module_aiot.h"
15 
16 #define MOD_STR "AIOT_ACTINFO"
17 
amp_app_devinfo_report(void * mqtt_handle)18 int32_t amp_app_devinfo_report(void *mqtt_handle)
19 {
20     int32_t res = STATE_SUCCESS;
21     void *devinfo_handle = NULL;
22     aiot_devinfo_msg_t *devinfo = NULL;
23     char *msg = NULL;
24     int32_t msg_len = 0;
25     char product_key[IOTX_PRODUCT_KEY_LEN] = {0};
26     char device_name[IOTX_DEVICE_NAME_LEN] = {0};
27     int productkey_len = IOTX_PRODUCT_KEY_LEN;
28     int devicename_len = IOTX_DEVICE_NAME_LEN;
29 
30     devinfo_handle = aiot_devinfo_init();
31     if (devinfo_handle == NULL) {
32         amp_debug(MOD_STR, "ntp service init failed");
33         return -1;
34     }
35 
36     res = aiot_devinfo_setopt(devinfo_handle, AIOT_DEVINFOOPT_MQTT_HANDLE, (void *)mqtt_handle);
37     if (res < STATE_SUCCESS) {
38         amp_debug(MOD_STR, "devinfo set mqtt handle failed");
39         aiot_devinfo_deinit(&devinfo_handle);
40         return -1;
41     }
42 
43     aos_kv_get(AMP_CUSTOMER_PRODUCTKEY, product_key, &productkey_len);
44     aos_kv_get(AMP_CUSTOMER_DEVICENAME, device_name, &devicename_len);
45 
46     msg_len = strlen(DEVICE_INFO_UPDATE_FMT) + 32;
47     msg = (char *)aos_malloc(msg_len);
48     if (msg == NULL) {
49         amp_debug(MOD_STR, "malloc msg err");
50         return -1;
51     }
52     memset(msg, 0, msg_len);
53 
54     /* devinfo update message */
55     res = snprintf(msg,
56                        msg_len,
57                        DEVICE_INFO_UPDATE_FMT,
58                        APPLICATION,
59                        MODULE_NAME
60                       );
61     if (res <= 0) {
62         amp_debug(MOD_STR, "topic msg generate err");
63         aos_free(msg);
64         return -1;
65     }
66 
67     devinfo = aos_malloc(sizeof(aiot_devinfo_msg_t));
68     if (devinfo == NULL) {
69         amp_debug(MOD_STR, "device update info malloc failed");
70         aos_free(msg);
71         return -1;
72     }
73     memset(devinfo, 0, sizeof(aiot_devinfo_msg_t));
74 
75     devinfo->product_key = aos_malloc(IOTX_PRODUCT_KEY_LEN);
76     if (devinfo->product_key == NULL) {
77         amp_debug(MOD_STR, "device update info malloc failed");
78         aos_free(msg);
79         aos_free(devinfo);
80         return -1;
81     }
82     memset(devinfo->product_key, 0, IOTX_PRODUCT_KEY_LEN);
83 
84     devinfo->device_name = aos_malloc(IOTX_DEVICE_NAME_LEN);
85     if (devinfo->device_name == NULL) {
86         amp_debug(MOD_STR, "device update info malloc failed");
87         aos_free(msg);
88         aos_free(devinfo);
89         return -1;
90     }
91     memset(devinfo->device_name, 0, IOTX_DEVICE_NAME_LEN);
92 
93     devinfo->data.update.params = aos_malloc(msg_len);
94     if (devinfo == NULL) {
95         amp_debug(MOD_STR, "device update info malloc failed");
96         aos_free(msg);
97         aos_free(devinfo);
98         return -1;
99     }
100     memset(devinfo->data.update.params, 0, msg_len);
101 
102     devinfo->type = AIOT_DEVINFO_MSG_UPDATE;
103     memcpy(devinfo->product_key, product_key, strlen(product_key));
104     memcpy(devinfo->device_name, device_name, strlen(device_name));
105     memcpy(devinfo->data.update.params, msg, msg_len);
106 
107     res = aiot_devinfo_send(devinfo_handle, devinfo);
108     if (res < STATE_SUCCESS) {
109         amp_debug(MOD_STR, "das stepping failed");
110         aos_free(msg);
111         aos_free(devinfo->product_key);
112         aos_free(devinfo->device_name);
113         aos_free(devinfo->data.update.params);
114         aos_free(devinfo);
115         aiot_devinfo_deinit(&devinfo_handle);
116         return -1;
117     }
118 
119     aos_free(msg);
120     aos_free(devinfo->product_key);
121     aos_free(devinfo->device_name);
122     aos_free(devinfo->data.update.params);
123     aos_free(devinfo);
124 
125     return res;
126 }