uiot_import.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. /*
  2. * Copyright (C) 2012-2019 UCloud. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License").
  5. * You may not use this file except in compliance with the License.
  6. * A copy of the License is located at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * or in the "license" file accompanying this file. This file is distributed
  11. * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
  12. * express or implied. See the License for the specific language governing
  13. * permissions and limitations under the License.
  14. */
  15. #ifndef C_SDK_UIOT_IMPORT_H_
  16. #define C_SDK_UIOT_IMPORT_H_
  17. #if defined(__cplusplus)
  18. extern "C" {
  19. #endif
  20. #include <stdio.h>
  21. #include <stdint.h>
  22. #include <stdlib.h>
  23. #include <stdbool.h>
  24. #include <stdarg.h>
  25. #include <inttypes.h>
  26. #include "uiot_defs.h"
  27. #include "HAL_Timer_Platform.h"
  28. #include "HAL_Flash_Platform.h"
  29. #include "utils_net.h"
  30. #include "lite-utils.h"
  31. #include "json_parser.h"
  32. /**
  33. * @brief 创建互斥量
  34. *
  35. * @return 创建成功返回Mutex指针,创建失败返回NULL
  36. */
  37. void *HAL_MutexCreate(void);
  38. /**
  39. * @brief 销毁互斥量
  40. *
  41. * @param Mutex指针
  42. */
  43. void HAL_MutexDestroy(_IN_ void *mutex);
  44. /**
  45. * @brief 阻塞式加锁。如果互斥量已被另一个线程锁定和拥有,则调用该函数的线程将阻塞,直到该互斥量变为可用为止
  46. *
  47. * @param Mutex指针
  48. */
  49. void HAL_MutexLock(_IN_ void *mutex);
  50. /**
  51. * @brief 非阻塞式加锁。如果mutex参数所指定的互斥锁已经被锁定,调用函数将立即返回FAILURE,不会阻塞当前线程
  52. *
  53. * @param Mutex指针
  54. * @return 如果成功获取锁,则返回SUCCESS,获取失败返回FAILURE
  55. */
  56. IoT_Error_t HAL_MutexTryLock(_IN_ void *mutex);
  57. /**
  58. * @brief 释放互斥量
  59. *
  60. * @param Mutex指针
  61. */
  62. void HAL_MutexUnlock(_IN_ void *mutex);
  63. /**
  64. * @brief 申请内存块
  65. *
  66. * @param size 申请的内存块大小
  67. * @return 申请成功返回指向内存首地址的指针,申请失败返回NULL
  68. */
  69. void *HAL_Malloc(_IN_ uint32_t size);
  70. /**
  71. * @brief 释放内存块
  72. *
  73. * @param ptr 指向要释放的内存块的指针
  74. */
  75. void HAL_Free(_IN_ void *ptr);
  76. /**
  77. * @brief 打印函数,向标准输出格式化打印一个字符串
  78. *
  79. * @param fmt 格式化字符串
  80. * @param ... 可变参数列表
  81. */
  82. void HAL_Printf(_IN_ const char *fmt, ...);
  83. /**
  84. * @brief 打印函数, 向内存缓冲区格式化打印一个字符串
  85. *
  86. * @param str 指向字符缓冲区的指针
  87. * @param len 缓冲区字符长度
  88. * @param fmt 格式化字符串
  89. * @param ... 可变参数列表
  90. * @return 实际写入缓冲区的字符长度
  91. */
  92. int HAL_Snprintf(_OU_ char *str, _IN_ int len, _IN_ const char *fmt, ...);
  93. /**
  94. * @brief 打印函数, 格式化输出字符串到指定buffer中
  95. *
  96. * @param [out] str: 用于存放写入字符串的buffer
  97. * @param [in] len: 允许写入的最大字符串长度
  98. * @param [in] fmt: 格式化字符串
  99. * @param [in] ap: 可变参数列表
  100. * @return 成功写入的字符串长度
  101. */
  102. int HAL_Vsnprintf(_OU_ char *str, _IN_ int len, _IN_ const char *fmt, _IN_ va_list ap);
  103. /**
  104. * @brief 检索自系统启动以来已运行的毫秒数.
  105. *
  106. * @return 返回毫秒数.
  107. */
  108. uint64_t HAL_UptimeMs(void);
  109. /**
  110. * @brief 休眠.
  111. *
  112. * @param ms 休眠的时长, 单位毫秒.
  113. */
  114. void HAL_SleepMs(_IN_ uint32_t ms);
  115. /**
  116. * @brief 获取产品序列号。从设备持久化存储(例如FLASH)中读取产品序列号。
  117. *
  118. * @param productSN 存放ProductSN的字符串缓冲区
  119. * @return 返回SUCCESS, 表示获取成功,FAILURE表示获取失败
  120. */
  121. IoT_Error_t HAL_GetProductSN(_OU_ char productSN[IOT_PRODUCT_SN_LEN + 1]);
  122. /**
  123. * @brief 获取产品密钥(动态注册)。从设备持久化存储(例如FLASH)中读取产品密钥。
  124. *
  125. * @param productSecret 存放ProductSecret的字符串缓冲区
  126. * @return 返回SUCCESS, 表示获取成功,FAILURE表示获取失败
  127. */
  128. IoT_Error_t HAL_GetProductSecret(_OU_ char productSecret[IOT_PRODUCT_SECRET_LEN + 1]);
  129. /**
  130. * @brief 获取设备序列号。从设备持久化存储(例如FLASH)中读取设备序列号。
  131. *
  132. * @param deviceSN 存放DeviceSN的字符串缓冲区
  133. * @return 返回SUCCESS, 表示获取成功,FAILURE表示获取失败
  134. */
  135. IoT_Error_t HAL_GetDeviceSN(_OU_ char deviceSN[IOT_DEVICE_SN_LEN + 1]);
  136. /**
  137. * @brief 获取设备密钥。从设备持久化存储(例如FLASH)中读取设备密钥。
  138. *
  139. * @param deviceSecret 存放DeviceSecret的字符串缓冲区
  140. * @return 返回SUCCESS, 表示获取成功,FAILURE表示获取失败
  141. */
  142. IoT_Error_t HAL_GetDeviceSecret(_OU_ char deviceSecret[IOT_DEVICE_SECRET_LEN + 1]);
  143. /**
  144. * @brief 设置产品序列号。将产品序列号烧写到设备持久化存储(例如FLASH)中,以备后续使用。
  145. *
  146. * @param pProductSN 指向待设置的产品序列号的指针
  147. * @return 返回SUCCESS, 表示设置成功,FAILURE表示设置失败
  148. */
  149. IoT_Error_t HAL_SetProductSN(_IN_ const char *pProductSN);
  150. /**
  151. * @brief 设置产品密钥。将产品密钥烧写到设备持久化存储(例如FLASH)中,以备后续使用。
  152. *
  153. * @param pProductSecret 指向待设置的产品密钥的指针
  154. * @return 返回SUCCESS, 表示设置成功,FAILURE表示设置失败
  155. */
  156. IoT_Error_t HAL_SetProductSecret(_IN_ const char *pProductSecret);
  157. /**
  158. * @brief 设置设备序列号。将设备序列号烧写到设备持久化存储(例如FLASH)中,以备后续使用。
  159. *
  160. * @param pDeviceSN 指向待设置的设备序列号的指针
  161. * @return 返回SUCCESS, 表示设置成功,FAILURE表示设置失败
  162. */
  163. IoT_Error_t HAL_SetDeviceSN(_IN_ const char *pDeviceSN);
  164. /**
  165. * @brief 设置设备密钥。将设备密钥烧写到设备持久化存储(例如FLASH)中,以备后续使用。
  166. *
  167. * @param pDeviceSecret 指向待设置的设备密钥的指针
  168. * @return 返回SUCCESS, 表示设置成功,FAILURE表示设置失败
  169. */
  170. IoT_Error_t HAL_SetDeviceSecret(_IN_ const char *pDeviceSecret);
  171. /**
  172. * 定义特定平台下的一个定时器结构体,需要在特定平台的代码中创建一个名为
  173. * HAL_Timer_Platform.h的头文件,在该头文件中定义Timer结构体。
  174. */
  175. typedef struct Timer Timer;
  176. /**
  177. * @brief 判断定时器时间是否已经过期
  178. *
  179. * @param timer 定时器结构体
  180. * @return 返回true, 表示定时器已过期
  181. */
  182. bool HAL_Timer_Expired(_IN_ Timer *timer);
  183. /**
  184. * @brief 根据timeout时间开启定时器计时, 单位: ms
  185. *
  186. * @param timer 定时器结构体
  187. * @param timeout_ms 超时时间, 单位:ms
  188. */
  189. void HAL_Timer_Countdown_ms(_IN_ Timer *timer, _IN_ uint32_t timeout_ms);
  190. /**
  191. * @brief 根据timeout时间开启定时器计时, 单位: s
  192. *
  193. * @param timer 定时器结构体
  194. * @param timeout 超时时间, 单位:s
  195. */
  196. void HAL_Timer_Countdown(_IN_ Timer *timer, _IN_ uint32_t timeout);
  197. /**
  198. * @brief 检查给定定时器剩余时间
  199. *
  200. * @param timer 定时器结构体
  201. * @return 定时器剩余时间, 单位: ms
  202. */
  203. uint32_t HAL_Timer_Remain_ms(_IN_ Timer *timer);
  204. /**
  205. * @brief 初始化定时器结构体
  206. *
  207. * @param timer 定时器结构体
  208. */
  209. void HAL_Timer_Init(_IN_ Timer *timer);
  210. /**
  211. * @brief 建立TLS连接
  212. *
  213. * @host 指定的TLS服务器网络地址
  214. * @port 指定的TLS服务器端口
  215. * @ca_crt 指向X.509证书的指针
  216. * @ca_crt_len 证书字节长度
  217. * @return 连接成功, 返回TLS连接句柄,连接失败,返回NULL
  218. */
  219. uintptr_t HAL_TLS_Connect(_IN_ const char *host, _IN_ uint16_t port, _IN_ uint16_t authmode, _IN_ const char *ca_crt,
  220. _IN_ size_t ca_crt_len);
  221. /**
  222. * @brief 断开TLS连接, 并释放相关对象资源
  223. *
  224. * @param pParams TLS连接参数
  225. * @return 若断开成功返回SUCCESS,否则返回FAILURE
  226. */
  227. int32_t HAL_TLS_Disconnect(_IN_ uintptr_t handle);
  228. /**
  229. * @brief 向指定的TLS连接写入数据。此接口为同步接口, 如果在超时时间内写入了参数len指定长度的数据则立即返回, 否则在超时时间到时返回
  230. *
  231. * @param handle TLS连接句柄
  232. * @param buf 指向数据发送缓冲区的指针
  233. * @param len 数据发送缓冲区的字节大小
  234. * @param timeout_ms 超时时间, 单位:ms
  235. * @return <0: TLS写入错误; =0: TLS写超时, 且没有写入任何数据; >0: TLS成功写入的字节数
  236. */
  237. int32_t HAL_TLS_Write(_IN_ uintptr_t handle, _IN_ unsigned char *buf, _IN_ size_t len, _IN_ uint32_t timeout_ms);
  238. /**
  239. * @brief 通过TLS连接读数据
  240. *
  241. * @param handle TLS连接句柄
  242. * @param buf 指向数据接收缓冲区的指针
  243. * @param len 数据接收缓冲区的字节大小
  244. * @param timeout_ms 超时时间, 单位:ms
  245. * @return <0: TLS读取错误; =0: TLS读超时, 且没有读取任何数据; >0: TLS成功读取的字节数
  246. */
  247. int32_t HAL_TLS_Read(_IN_ uintptr_t handle, _OU_ unsigned char *buf, _IN_ size_t len, _IN_ uint32_t timeout_ms);
  248. /**
  249. * @brief 建立TCP连接。根据指定的HOST地址, 服务器端口号建立TCP连接, 返回对应的连接句柄。
  250. *
  251. * @host 指定的TCP服务器网络地址
  252. * @port 指定的TCP服务器端口
  253. * @return 连接成功, 返回TCP连接句柄,连接失败,返回NULL
  254. */
  255. uintptr_t HAL_TCP_Connect(_IN_ const char *host, _IN_ uint16_t port);
  256. /**
  257. * @brief 断开TCP连接, 并释放相关对象资源。
  258. *
  259. * @param fd TCP连接句柄
  260. * @return 成功返回SUCCESS,失败返回FAILURE
  261. */
  262. int32_t HAL_TCP_Disconnect(_IN_ uintptr_t fd);
  263. /**
  264. * @brief 向指定的TCP连接写入数据。此接口为同步接口, 如果在超时时间内写入了参数len指定长度的数据则立即返回, 否则在超时时间到时返回。
  265. *
  266. * @param fd TCP连接句柄
  267. * @param buf 指向数据发送缓冲区的指针
  268. * @param len 数据发送缓冲区的字节大小
  269. * @param timeout_ms 超时时间,单位: ms
  270. * @return <0: TCP写入错误; =0: TCP写超时, 且没有写入任何数据; >0: TCP成功写入的字节数
  271. */
  272. int32_t HAL_TCP_Write(_IN_ uintptr_t fd, _IN_ unsigned char *buf, _IN_ size_t len, _IN_ uint32_t timeout_ms);
  273. /**
  274. * @brief 从指定的TCP连接读取数据。此接口为同步接口, 如果在超时时间内读取到参数len指定长度的数据则立即返回, 否则在超时时间到时返回。
  275. *
  276. * @param fd TCP连接句柄
  277. * @param buf 指向数据接收缓冲区的指针
  278. * @param len 数据接收缓冲区的字节大小
  279. * @param timeout_ms 超时时间,单位: ms
  280. * @return <0: TCP读取错误; =0: TCP读超时, 且没有读取任何数据; >0: TCP成功读取的字节数
  281. */
  282. int32_t HAL_TCP_Read(_IN_ uintptr_t fd, _OU_ unsigned char *buf, _IN_ size_t len, _IN_ uint32_t timeout_ms);
  283. /**
  284. * @brief 设置相应name
  285. *
  286. * @param handle 指向download_name的指针
  287. * @return 指向download_name的指针
  288. */
  289. void * HAL_Download_Name_Set(void * handle);
  290. /**
  291. * @brief 下载的准备工作
  292. *
  293. * @param name 文件名
  294. * @return 文件描述符
  295. */
  296. void * HAL_Download_Init(_IN_ void * name);
  297. /**
  298. * @brief 将长度为length的buffer_read的数据写入到FLASH中
  299. *
  300. * @param handle 文件描述符
  301. * @param total_length 未用到
  302. * @param buffer_read 数据的指针
  303. * @param length 数据的长度,单位为字节
  304. * @return
  305. */
  306. int HAL_Download_Write(_IN_ void * handle,_IN_ uint32_t total_length,_IN_ uint8_t *buffer_read,_IN_ uint32_t length);
  307. /**
  308. * @brief STM32F767 FLASH的information分区的下载标志置位成功
  309. *
  310. * @param handle 文件描述符
  311. * @return -1失败 0成功
  312. */
  313. int HAL_Download_End(_IN_ void * handle);
  314. #ifdef SUPPORT_AT_CMD
  315. /**
  316. * @brief 通讯模组初始化。
  317. *
  318. * @param 无
  319. * @return 无
  320. */
  321. void HAL_AT_Init();
  322. /**
  323. * @brief 向指定的通讯模组读AT命令执行结果。
  324. *
  325. * @param pNetwork 网络句柄
  326. * @param buf 指向数据接收缓冲区的指针
  327. * @param len 数据接收缓冲区的字节大小
  328. * @return <0: TCP读取错误; =0: TCP读超时, 且没有读取任何数据; >0: TCP成功读取的字节数
  329. */
  330. int HAL_AT_Read(_IN_ utils_network_pt pNetwork, _OU_ unsigned char *buffer, _IN_ size_t len);
  331. /**
  332. * @brief 向指定的通讯模组写AT命令。
  333. *
  334. * @param buf 指向数据发送缓冲区的指针
  335. * @param len 数据发送缓冲区的字节大小
  336. * @return <0: TCP写入错误; =0: TCP写超时, 且没有写入任何数据; >0: TCP成功写入的字节数
  337. */
  338. int HAL_AT_Write(_IN_ unsigned char *buffer, _IN_ size_t len);
  339. /**
  340. * @brief 断开TCP连接, 并释放相关对象资源。
  341. *
  342. * @param pNetwork 网络句柄
  343. * @return 成功返回SUCCESS,失败返回FAILURE
  344. */
  345. int HAL_AT_TCP_Disconnect(utils_network_pt pNetwork);
  346. /**
  347. * @brief 建立TCP连接。根据指定的HOST地址, 服务器端口号建立TCP连接, 返回对应的连接句柄。
  348. *
  349. * @param pNetwork 网络句柄
  350. * @param host 指定的TCP服务器网络地址
  351. * @param port 指定的TCP服务器端口
  352. * @return 连接成功, 返回TCP连接句柄,连接失败,返回NULL
  353. */
  354. int HAL_AT_TCP_Connect(_IN_ utils_network_pt pNetwork, _IN_ const char *host, _IN_ uint16_t port);
  355. /**
  356. * @brief 向指定的TCP连接写入数据。
  357. *
  358. * @param pNetwork 网络句柄
  359. * @param buf 指向数据发送缓冲区的指针
  360. * @param len 数据发送缓冲区的字节大小
  361. * @return <0: TCP写入错误; =0: TCP写超时, 且没有写入任何数据; >0: TCP成功写入的字节数
  362. */
  363. int HAL_AT_Write_Tcp(_IN_ utils_network_pt pNetwork, _IN_ unsigned char *buffer, _IN_ size_t len);
  364. /**
  365. * @brief 从指定的TCP连接读取数据。
  366. *
  367. * @param pNetwork 网络句柄
  368. * @param buf 指向数据接收缓冲区的指针
  369. * @param len 数据接收缓冲区的字节大小
  370. * @return <0: TCP读取错误; =0: TCP读超时, 且没有读取任何数据; >0: TCP成功读取的字节数
  371. */
  372. int HAL_AT_Read_Tcp(_IN_ utils_network_pt pNetwork, _IN_ unsigned char *buffer, _IN_ size_t len);
  373. #endif
  374. #if defined(__cplusplus)
  375. }
  376. #endif
  377. #endif /* C_SDK_UIOT_IMPORT_H_ */