• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  * Description: HiLink产品适配实现源文件(此文件为DEMO,需集成方适配修改)
15  */
16 #include "hilink_device.h"
17 #include <stdlib.h>
18 #include "hilink.h"
19 #include "securec.h"
20 #include "hilink_sal_defines.h"
21 
22 /* 设备产品ID */
23 static const char *PRODUCT_ID = "2AQO";
24 
25 /* 设备产品子型号ID */
26 static const char *SUB_PRODUCT_ID = "00";
27 /* 设备类型ID */
28 static const char *DEVICE_TYPE_ID = "046";
29 /* 设备类型英文名称 */
30 static const char *DEVICE_TYPE_NAME = "Table Lamp";
31 /* 设备制造商ID */
32 static const char *MANUAFACTURER_ID = "17C";
33 /* 设备制造商英文名称 */
34 static const char *MANUAFACTURER_NAME = "DALEN";
35 /* 设备型号 */
36 static const char *PRODUCT_MODEL = "DL-01W";
37 /* 设备SN */
38 static const char *PRODUCT_SN = "123";
39 /* 设备固件版本号 */
40 static const char *FIRMWARE_VER = "1.0.0";
41 /* 设备硬件版本号 */
42 static const char *HARDWARE_VER = "1.0.0";
43 /* 设备软件版本号 */
44 static const char *SOFTWARE_VER = "1.0.0";
45 
46 /*
47  *
48  * 服务信息定义
49  * 注意:(1)适配格式{svcType, svcId}
50  *       (2)与devicepartner平台物模型定义必须保持一致
51  */
52 static const HILINK_SvcInfo SVC_INFO[] = {
53     { "switch", "switch" }
54 };
55 
HILINK_GetDevInfo(HILINK_DevInfo * devinfo)56 int HILINK_GetDevInfo(HILINK_DevInfo *devinfo)
57 {
58     if (devinfo == NULL) {
59         return -1;
60     }
61     int err = EOK;
62     err |= strcpy_s(devinfo->sn, sizeof(devinfo->sn), PRODUCT_SN);
63     HILINK_SAL_DEBUG("HILINK_GetDevInfo sn: [%s]\r\n", devinfo->sn);
64     err |= strcpy_s(devinfo->prodId, sizeof(devinfo->prodId), PRODUCT_ID);
65     HILINK_SAL_DEBUG("HILINK_GetDevInfo prodId: [%s]\r\n", devinfo->prodId);
66     err |= strcpy_s(devinfo->subProdId, sizeof(devinfo->subProdId), SUB_PRODUCT_ID);
67     HILINK_SAL_DEBUG("HILINK_GetDevInfo subProdId: [%s]\r\n", devinfo->subProdId);
68     err |= strcpy_s(devinfo->model, sizeof(devinfo->model), PRODUCT_MODEL);
69     HILINK_SAL_DEBUG("HILINK_GetDevInfo model: [%s]\r\n", devinfo->model);
70     err |= strcpy_s(devinfo->devTypeId, sizeof(devinfo->devTypeId), DEVICE_TYPE_ID);
71     HILINK_SAL_DEBUG("HILINK_GetDevInfo devTypeId: [%s]\r\n", devinfo->devTypeId);
72     err |= strcpy_s(devinfo->devTypeName, sizeof(devinfo->devTypeName), DEVICE_TYPE_NAME);
73     HILINK_SAL_DEBUG("HILINK_GetDevInfo devTypeName: [%s]\r\n", devinfo->devTypeName);
74     err |= strcpy_s(devinfo->manuId, sizeof(devinfo->manuId), MANUAFACTURER_ID);
75     HILINK_SAL_DEBUG("HILINK_GetDevInfo manuId: [%s]\r\n", devinfo->manuId);
76     err |= strcpy_s(devinfo->manuName, sizeof(devinfo->manuName), MANUAFACTURER_NAME);
77     HILINK_SAL_DEBUG("HILINK_GetDevInfo manuName: [%s]\r\n", devinfo->manuName);
78     err |= strcpy_s(devinfo->fwv, sizeof(devinfo->fwv), FIRMWARE_VER);
79     HILINK_SAL_DEBUG("HILINK_GetDevInfo fwv: [%s]\r\n", devinfo->fwv);
80     err |= strcpy_s(devinfo->hwv, sizeof(devinfo->hwv), HARDWARE_VER);
81     HILINK_SAL_DEBUG("HILINK_GetDevInfo hwv: [%s]\r\n", devinfo->hwv);
82     err |= strcpy_s(devinfo->swv, sizeof(devinfo->swv), SOFTWARE_VER);
83     HILINK_SAL_DEBUG("HILINK_GetDevInfo swv: [%s]\r\n", devinfo->swv);
84     if (err != EOK) {
85         return -1;
86     }
87     return 0;
88 }
89 
HILINK_GetSvcInfo(HILINK_SvcInfo * svcInfo[],unsigned int size)90 int HILINK_GetSvcInfo(HILINK_SvcInfo *svcInfo[], unsigned int size)
91 {
92     unsigned int svcNum = sizeof(SVC_INFO) / sizeof(HILINK_SvcInfo);
93     if ((svcInfo == NULL) || (size == 0) || (size < svcNum)) {
94         return -1;
95     }
96 
97     for (unsigned int i = 0; i < svcNum; ++i) {
98         if (memcpy_s(svcInfo[i], sizeof(HILINK_SvcInfo), &SVC_INFO[i], sizeof(HILINK_SvcInfo)) != EOK) {
99             return -1;
100         }
101     }
102     return svcNum;
103 }
104 
105 /* AC参数 */
106 unsigned char A_C[48] = {
107     0x49, 0x3F, 0x45, 0x4A, 0x3A, 0x72, 0x38, 0x7B, 0x36, 0x32, 0x50, 0x3C, 0x49, 0x39, 0x62, 0x38,
108     0x72, 0xCB, 0x6D, 0xC5, 0xAE, 0xE5, 0x4A, 0x82, 0xD3, 0xE5, 0x6D, 0xF5, 0x36, 0x82, 0x62, 0xEB,
109     0x89, 0x30, 0x6C, 0x88, 0x32, 0x56, 0x23, 0xFD, 0xB8, 0x67, 0x90, 0xA7, 0x7B, 0x61, 0x1E, 0xAE
110 };
111 
112 /* 获取加密 AC 参数  */
HILINK_GetAutoAc(void)113 unsigned char *HILINK_GetAutoAc(void)
114 {
115     return A_C;
116 }
117 
118 /*
119  * 修改服务当前字段值
120  * svcId为服务的ID,payload为接收到需要修改的Json格式的字段与其值,len为payload的长度
121  * 返回0表示服务状态值修改成功,不需要底层设备主动上报,由Hilink Device SDK上报;
122  * 返回-101表示获得报文不符合要求;
123  * 返回-111表示服务状态值正在修改中,修改成功后底层设备必须主动上报;
124  */
HILINK_PutCharState(const char * svcId,const char * payload,unsigned int len)125 int HILINK_PutCharState(const char *svcId, const char *payload, unsigned int len)
126 {
127     return 0;
128 }
129 
130 /*
131  * 添加单设备多服务批控服务接口
132  * 1.使用场景:单产品需要在一个报文包中包含多个服务同时处理
133  * 2.使用方法:
134  * (1)厂商需要编写支持批控的H5页面,增加type = 4以及在action中可以包含一个或者以上的服务。
135  * (2)厂商需要通过HILINK_EnableBatchControl(bool flag)接口打开或关闭批量功能,当前默认关闭。
136  * 3.使用约束:
137  * (1)payload为接收到报文的actions内容,为数组格式,len为actions内容的长度;详情请参考《指南》
138  * (2)返回值判断:
139  *     返回0表示服务状态值修改成功,不需要底层设备主动上报,由HiLink SDK上报;
140  *     返回-101表示获得报文不符合要求;
141  *     返回-111表示服务状态值正在修改中;
142  */
HILINK_ControlCharState(const char * payload,unsigned int len)143 int HILINK_ControlCharState(const char *payload, unsigned int len)
144 {
145     return 0;
146 }
147 
148 /*
149  * 获取服务字段值
150  * svcId表示服务ID。厂商实现该函数时,需要对svcId进行判断;
151  * in表示接收到的Json格式的字段与其值;
152  * inLen表示接收到的in的长度;
153  * out表示保存服务字段值内容的指针,内存由厂商开辟,使用完成后,由Hilink Device SDK释放;
154  * outLen表示读取到的payload的长度;
155  * 返回0表示服务状态字段值获取成功,返回非0表示获取服务状态字段值不成功。
156  */
HILINK_GetCharState(const char * svcId,const char * in,unsigned int inLen,char ** out,unsigned int * outLen)157 int HILINK_GetCharState(const char *svcId, const char *in, unsigned int inLen, char **out, unsigned int *outLen)
158 {
159     return 0;
160 }
161 
162 /*
163  * 功能: 获取SoftAp配网PIN码
164  * 返回: 返回10000000到99999999之间的8位数字PIN码, 返回-1表示使用HiLink SDK的默认PIN码
165  * 注意: (1)安全认证要求,PIN码不能由sn、mac等设备固定信息生成
166  *       (2)该接口实现需要与devicepartner平台匹配
167  */
HILINK_GetPinCode(void)168 int HILINK_GetPinCode(void)
169 {
170     return -1;
171 }
172 
173 /*
174  * 通知设备的状态
175  * status表示设备当前的状态
176  * 注意,此函数由设备厂商根据产品业务选择性实现
177  * 注意: (1) 此函数由设备厂商根据产品业务选择性实现
178  *      (2) 禁止在HILINK_NotifyDevStatus接口内回调HiLink SDK的对外接口
179  */
HILINK_NotifyDevStatus(int status)180 void HILINK_NotifyDevStatus(int status)
181 {
182     HILINK_SAL_DEBUG("HILINK_NotifyDevStatus status: %d\r\n", status);
183     switch (status) {
184         case HILINK_M2M_CLOUD_OFFLINE:
185             /* 设备与云端连接断开,请在此处添加实现 */
186             break;
187         case HILINK_M2M_CLOUD_ONLINE:
188             /* 设备连接云端成功,请在此处添加实现 */
189             break;
190         case HILINK_M2M_LONG_OFFLINE:
191             /* 设备与云端连接长时间断开,请在此处添加实现 */
192             break;
193         case HILINK_M2M_LONG_OFFLINE_REBOOT:
194             /* 设备与云端连接长时间断开后进行重启,请在此处添加实现 */
195             break;
196         case HILINK_UNINITIALIZED:
197             /* HiLink线程未启动,请在此处添加实现 */
198             break;
199         case HILINK_LINK_UNDER_AUTO_CONFIG:
200             /* 设备处于配网模式,请在此处添加实现 */
201             break;
202         case HILINK_LINK_CONFIG_TIMEOUT:
203             /* 设备处于10分钟超时状态,请在此处添加实现 */
204             break;
205         case HILINK_LINK_CONNECTTING_WIFI:
206             /* 设备正在连接路由器,请在此处添加实现 */
207             break;
208         case HILINK_LINK_CONNECTED_WIFI:
209             /* 设备已经连上路由器,请在此处添加实现 */
210             break;
211         case HILINK_M2M_CONNECTTING_CLOUD:
212             /* 设备正在连接云端,请在此处添加实现 */
213             break;
214         case HILINK_LINK_DISCONNECT:
215             /* 设备与路由器的连接断开,请在此处添加实现 */
216             break;
217         case HILINK_DEVICE_REGISTERED:
218             /* 设备被注册,请在此处添加实现 */
219             break;
220         case HILINK_DEVICE_UNREGISTER:
221             /* 设备被解绑,请在此处添加实现 */
222             break;
223         case HILINK_REVOKE_FLAG_SET:
224             /* 设备被复位标记置位,请在此处添加实现 */
225             break;
226         case HILINK_NEGO_REG_INFO_FAIL:
227             /* 设备协商配网信息失败 */
228             break;
229         case HILINK_LINK_CONNECTED_FAIL:
230             /* 设备与路由器的连接失败 */
231             break;
232         case HILINK_CLOUD_TO_CENTRAL:
233             /* 直连云模式切成中枢模式 */
234             break;
235         case HILINK_DEVICE_CLEAN:
236             /* 设备完全清除,包括前装跟后装信息 */
237             break;
238         default:
239             break;
240     }
241 
242     return;
243 }
244 
245  /*
246  * 功能:实现模组重启前的设备操作
247  * 参数:flag 入参,触发重启的类型
248  *          0表示HiLink SDK 线程看门狗触发模组重启;
249  *          1表示APP删除设备触发模组重启;
250  *          2表示设备长时间离线无法恢复而重启;
251  * 返回值:0表示处理成功, 系统可以重启,使用硬重启;
252  *         1表示处理成功, 系统可以重启,如果通过HILINK_SetSdkAttr()注册了软重启(sdkAttr.rebootSoftware),使用软重启;
253  *         负值表示处理失败,系统不能重启
254  * 注意:(1) 此函数由设备厂商实现;
255  *       (2) 若APP删除设备触发模组重启时,设备操作完务必返回0,否则会导致删除设备异常;
256  *       (3) 设备长时间离线无法恢复而重启,应对用户无感,不可影响用户体验,否则不可以重启;
257  */
HILINK_ProcessBeforeRestart(int flag)258 int HILINK_ProcessBeforeRestart(int flag)
259 {
260     /* HiLink SDK线程看门狗超时触发模组重启 */
261     if (flag == 0) {
262         /* 实现模组重启前的操作(如:保存系统状态等) */
263         return -1;
264     }
265 
266     /* APP删除设备触发模组重启 */
267     if (flag == 1) {
268         /* 实现模组重启前的操作(如:保存系统状态等) */
269         return 1;
270     }
271 
272     /* 设备长时间离线触发模组重启,尝试恢复网络 */
273     if (flag == 2) {
274         /* 实现模组重启前的操作(如:保存系统状态等) */
275         return -1;
276     }
277 
278     return -1;
279 }
280