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 #ifndef HILINK_DEVICE_H 17 #define HILINK_DEVICE_H 18 19 #include "hilink.h" 20 21 #ifdef __cplusplus 22 #if __cplusplus 23 extern "C" { 24 #endif 25 #endif 26 27 typedef struct { 28 char sn[40]; /* 设备唯一标识,比如sn号,有效字符长度范围[0,40),为空时使用MAC地址作为SN */ 29 char prodId[5]; /* 设备产品ID,有效字符长度为4 */ 30 char subProdId[3]; /* 设备子型号,有效字符长度为0或2 */ 31 char model[32]; /* 设备型号,长度范围[0,32) */ 32 char devTypeId[4]; /* 设备类型ID,有效字符长度为3 */ 33 char devTypeName[32]; /* 设备类型英文名称,长度范围[0,32) */ 34 char manuId[4]; /* 设备制造商ID,有效字符长度为3 */ 35 char manuName[32]; /* 设备制造商英文名称,长度范围[0,32) */ 36 char fwv[64]; /* 设备固件版本,长度范围[0,64) */ 37 char hwv[64]; /* 设备硬件版本,长度范围[0,64) */ 38 char swv[64]; /* 设备软件版本,长度范围[0,64) */ 39 } HILINK_DevInfo; 40 41 typedef struct { 42 char svcType[32]; /* 服务类型,字符长度范围(0, 32) */ 43 char svcId[64]; /* 服务ID,字符长度范围(0, 64) */ 44 } HILINK_SvcInfo; 45 46 enum HILINK_StateMachine { 47 /* 设备与云端连接断开(版本向前兼容) */ 48 HILINK_M2M_CLOUD_OFFLINE = 0, 49 /* 设备连接云端成功,处于正常工作态(版本向前兼容) */ 50 HILINK_M2M_CLOUD_ONLINE, 51 /* 设备与云端连接长时间断开(版本向前兼容) */ 52 HILINK_M2M_LONG_OFFLINE, 53 /* 设备与云端连接长时间断开后进行重启(版本向前兼容) */ 54 HILINK_M2M_LONG_OFFLINE_REBOOT, 55 /* HiLink线程未启动 */ 56 HILINK_UNINITIALIZED, 57 /* 设备处于配网模式 */ 58 HILINK_LINK_UNDER_AUTO_CONFIG, 59 /* 设备处于10分钟超时状态 */ 60 HILINK_LINK_CONFIG_TIMEOUT, 61 /* 设备正在连接路由器 */ 62 HILINK_LINK_CONNECTTING_WIFI, 63 /* 设备已经连上路由器 */ 64 HILINK_LINK_CONNECTED_WIFI, 65 /* 设备正在连接云端 */ 66 HILINK_M2M_CONNECTTING_CLOUD, 67 /* 设备与路由器的连接断开 */ 68 HILINK_LINK_DISCONNECT, 69 /* 设备被注册 */ 70 HILINK_DEVICE_REGISTERED, 71 /* 设备被解绑 */ 72 HILINK_DEVICE_UNREGISTER, 73 /* 设备复位标记置位 */ 74 HILINK_REVOKE_FLAG_SET, 75 /* 设备协商注册信息失败 */ 76 HILINK_NEGO_REG_INFO_FAIL, 77 /* 设备与路由器的连接失败 */ 78 HILINK_LINK_CONNECTED_FAIL, 79 /* 打开中枢模式成功 */ 80 HILINK_OPEN_CENTRAL_MODE_OK, 81 /* 打开中枢模式失败 */ 82 HILINK_OPEN_CENTRAL_MODE_FAILE, 83 /* 本地端口创建成功 */ 84 HILINK_CREATE_CENTRAL_PORT_OK, 85 /* 设备恢复交房标记 */ 86 HILINK_RECOVER_HANDOVER, 87 /* 设备交房标记 */ 88 HILINK_HANDOVER, 89 /* 设备已初始化 */ 90 HILINK_INITIALIZED, 91 /* 直连云模式切成中枢模式 */ 92 HILINK_CLOUD_TO_CENTRAL, 93 /* 设备信息完全清除,包括前装跟后装信息 */ 94 HILINK_DEVICE_CLEAN, 95 /* 共部署设备被设置为单品模式 */ 96 HILINK_DEVICE_MODE, 97 /* 设备TLS链路重连事件 */ 98 HILINK_TLS_LINK_RECONNECTED, 99 }; 100 101 typedef int (*HILINK_GetAcKeyFunc)(unsigned char *acKey, unsigned int acLen); 102 103 /* 104 * 功能:注册获取ACkeyV2函数,key文件在开发者平台获取 105 * 参数:HILINK_GetAcKeyFun 入参 106 * 备注,SDK优先使用ACkeyV2,HILINK_GetAutoAc逐渐日落。 107 */ 108 void HILINK_RegisterGetAcV2Func(HILINK_GetAcKeyFunc func); 109 110 /* 111 * 功能:获取设备信息 112 * 参数:devinfo 出入参,待填充的设备信息 113 * 返回:获取成功返回 0,否则返-1 114 * 注意:(1) sn不填充时将使用设备mac地址作为sn。 115 * (2) 如果产品定义有子型号则需要填充subProdId。 116 * (3) 所有需要填充的字段都需要以'\0'结束。 117 * (4) softap配网时devTypeName与manuName用来拼接ssid,两个字段长度和尽量不超过10字节,否则会截断。 118 */ 119 int HILINK_GetDevInfo(HILINK_DevInfo *devinfo); 120 121 /* 122 * 功能:获取设备服务信息 123 * 参数:(1) svcInfo 出入参,待填充的设备服务信息结构体指针数组。 124 * (2) size 入参,svcInfo结构体指针数组大小。 125 * 返回:获取成功返回服务数量,否则返-1。 126 * 注意:所有需要填充的字段都需要以'\0'结束。 127 */ 128 int HILINK_GetSvcInfo(HILINK_SvcInfo *svcInfo[], unsigned int size); 129 130 /* 获取AC 参数接口函数 */ 131 unsigned char *HILINK_GetAutoAc(void); 132 133 /* 134 * 修改服务当前字段值 135 * svcId为服务的ID,payload为接收到需要修改的Json格式的字段与其值,len为payload的长度。 136 * 返回0表示该次控制为同步上报,由HILINK SDK上报。 137 * 返回-111表示该次控制为异步上报,修改成功后设备必须调用HILINK_ReportCharState主动上报。 138 * 其余返回值均为错误值,HILINK SDK不会上报任何信息。 139 */ 140 int HILINK_PutCharState(const char *svcId, const char *payload, unsigned int len); 141 142 /* 143 * 功能:单设备多服务批控接口 144 * 参数:payload为Json格式的报文内容(数组格式),len为payload的长度,例如: 145 * [ 146 * {"sid": "switch", "data":{"on": 1}}, 147 * {"sid": "brightness","data": {"brightness": 20}} 148 * ] 149 * 返回值:0表示服务状态值修改成功,不需要底层设备主动上报,由HiLink SDK上报。 150 * -101表示获得报文不符合要求。 151 * -111表示服务状态值正在修改中。 152 * 注意:(1) 此函数由设备厂商实现。 153 * (2) 厂商需通过HILINK_EnableBatchControl(bool flag)接口打开或关闭批量控制功能,默认关闭。 154 */ 155 int HILINK_ControlCharState(const char *payload, unsigned int len); 156 157 /* 158 * 获取服务字段值 159 * svcId表示服务ID。厂商实现该函数时,需要对svcId进行判断。 160 * in表示接收到的Json格式的字段与其值。 161 * inLen表示接收到的in的长度。 162 * out表示保存服务字段值内容的指针,内存由厂商开辟,使用完成后,由Hilink Device SDK释放,需要以'\0'结尾,并保证内容符合json格式。 163 * outLen表示读取到的payload的长度。 164 * 返回0表示服务状态字段值获取成功,返回非0表示获取服务状态字段值不成功。 165 */ 166 int HILINK_GetCharState(const char *svcId, const char *in, unsigned int inLen, char **out, unsigned int *outLen); 167 168 /* 169 * 获取SoftAp配网PIN码 170 * 返回值为8位数字PIN码, 返回-1表示使用HiLink SDK的默认PIN码。 171 * 该接口需设备开发者实现。 172 * 安全认证要求,PIN码不能由sn、mac等设备固定信息生成。 173 */ 174 int HILINK_GetPinCode(void); 175 176 /* 177 * 通知设备的状态 178 * status表示设备当前的状态 179 * 注意: (1) 此函数由设备厂商根据产品业务选择性实现。 180 * (2) 禁止在HILINK_NotifyDevStatus接口内回调HiLink SDK的对外接口。 181 */ 182 void HILINK_NotifyDevStatus(int status); 183 184 /* 185 * 功能:实现模组重启前的设备操作 186 * 参数:flag 入参,触发重启的类型 187 * 0表示HiLink SDK 线程看门狗触发模组重启。 188 * 1表示APP删除设备触发模组重启。 189 * 2表示设备长时间离线无法恢复而重启。 190 3表示网关定时重启。 191 * 返回值:0表示处理成功, 系统可以重启,使用硬重启。 192 * 1表示处理成功, 系统可以重启,如果通过HILINK_SetSdkAttr()注册了软重启(sdkAttr.rebootSoftware),使用软重启。 193 * 负值表示处理失败,系统不能重启。 194 * 注意:(1) 此函数由设备厂商实现。 195 * (2) 若APP删除设备触发模组重启时,设备操作完务必返回0,否则会导致删除设备异常。 196 * (3) 设备长时间离线无法恢复而重启,应对用户无感,不可影响用户体验,否则不可以重启。 197 */ 198 int HILINK_ProcessBeforeRestart(int flag); 199 200 #ifdef __cplusplus 201 #if __cplusplus 202 } 203 #endif 204 #endif 205 206 #endif /* HILINK_DEVICE_H */