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