core.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. #ifndef __MOZIT_CORE_H
  2. #define __MOZIT_CORE_H
  3. #include <stdint.h>
  4. #include <ctype.h>
  5. #include <assert.h>
  6. #include "../include/mysql.sdk.h"
  7. /******************************************************************
  8. ** Copyright (c) 2009 Wuhan Technology Co., Ltd .
  9. ** FileName: core.c
  10. ** Author: BigHead
  11. ** Mail: jsrenyw@icloud.com
  12. ** Editor: bighead
  13. ** Date: 2020-11-10 13:34
  14. ** Version: 2020-11-10
  15. ** File Description: 业务逻辑核心代码实现部分
  16. ******************************************************************/
  17. #include "../include/debug.h"
  18. #include "mqtta.h"
  19. #include "regfunc.h"
  20. #include "myqueue.h"
  21. #include <signal.h>
  22. #include "list.h"
  23. #include <sys/types.h>
  24. #include <sys/stat.h>
  25. #define EACH_PACK_SIZE 1024
  26. #define FILE_BYTES 1024*300
  27. #define UNUSED(x) (void)(x)
  28. #define NUM_THREADS 2
  29. ArrQueue *m_pque;//任务队列
  30. struct my_thread_info
  31. {
  32. int which;
  33. };
  34. typedef union{
  35. char c_char[4];
  36. int i_int;
  37. }char2int;
  38. typedef union{
  39. char c_char[2];
  40. short i_short;
  41. }char2short;
  42. /*************************远程升级***************************/
  43. typedef struct ota_info
  44. {
  45. char ota_mode; // ota 模式 0:差分 1:全量
  46. char old_file_name[48]; // 旧文件名
  47. uint32_t old_file_len; // 旧文件的长度
  48. uint32_t old_file_crc; // 旧文件crc32 校验值
  49. char new_file_name[48]; // 新文件名
  50. uint32_t new_file_len; // 新文件的长度
  51. uint32_t new_file_crc; // 新文件crc32 校验值
  52. uint8_t ota_state; // ota 状态
  53. uint32_t ota_file_len; // ota 文件的长度
  54. uint32_t ota_file_crc; // ota 文件的crc32校验值
  55. uint16_t ota_file_total_packets; // ota文件的总的包数
  56. uint16_t ota_file_packet_len; // ota文件每包的数据长度
  57. uint8_t buf[FILE_BYTES];//升级报文
  58. } ota_info;
  59. typedef struct upgrade_user_info
  60. {
  61. char mac[30]; //mac
  62. char ota_file_name[48]; //升级文件名
  63. } upgrade_user_info;
  64. /******************************************************************
  65. * Function Name: core_init
  66. * Arguments:
  67. * Return Value: void
  68. * Date: 2020-11-10
  69. * Editor: bighead
  70. * Description: 程序启动时刻,调用该初始化函数仅 一次,该函数不允许重复调用
  71. ******************************************************************/
  72. int core_init( void);
  73. /******************************************************************
  74. * Function Name: core_heart
  75. * Arguments:
  76. * Return Value: void
  77. * Date: 2020-11-10
  78. * Editor: bighead
  79. * Description: 每次主线程心跳调用, 约200ms一次, 可以调整频率在decode.c
  80. ******************************************************************/
  81. int core_heart( unsigned int nowtime);
  82. /******************************************************************
  83. * Function Name: core_heart_1s
  84. * Arguments:
  85. * Return Value: void
  86. * Date: 2020-11-10
  87. * Editor: bighead
  88. * Description: 每次主线程心跳调用, 约1s一次,不超过2s, 在core_heart心跳函数之后调用
  89. * 可以调整频率在decode.c
  90. ******************************************************************/
  91. int core_heart_1s( unsigned int nowtime);
  92. /******************************************************************
  93. * Function Name: db_init
  94. * Arguments:
  95. * Return Value: void
  96. * Date: 2020-11-10
  97. * Editor: bighead
  98. * Description: 程序启动时刻,调用该初始化函数多次,初始化不同mysql 连接
  99. ******************************************************************/
  100. int db_init(MYSQL *db);
  101. int core_do_test(void);
  102. int core_stats(void);
  103. /******************************************************************
  104. * Function Name: SendCmdFromDb
  105. * Arguments:
  106. * Return Value: void
  107. * Date: 2022-04-02
  108. * Editor: chw
  109. * Description: 扫描数据库发送指令
  110. ******************************************************************/
  111. int SendCmdFromDb(void);
  112. /******************************************************************
  113. * Function Name: TimeSyncBroadcast
  114. * Arguments:
  115. * Return Value: void
  116. * Date: 2022-04-02
  117. * Editor: chw
  118. * Description: 时间同步广播
  119. ******************************************************************/
  120. int TimeSyncBroadcast(void);
  121. /******************************************************************
  122. * Function Name: ByteToHexStr
  123. * Arguments:
  124. * Return Value: void
  125. * Date: 2022-04-02
  126. * Editor: chw
  127. * Description: 1.字节流转换为十六进制字符串
  128. ******************************************************************/
  129. void ByteToHexStr(const unsigned char* source, char* dest, int sourceLen);
  130. /******************************************************************
  131. * Function Name: Hex2Str
  132. * Arguments:
  133. * Return Value: void
  134. * Date: 2022-04-02
  135. * Editor: chw
  136. * Description: 2.字节流转换为十六进制字符串
  137. ******************************************************************/
  138. void Hex2Str( const char *sSrc, char *sDest, int nSrcLen );
  139. /******************************************************************
  140. * Function Name: HexStrToByte
  141. * Arguments:
  142. * Return Value: void
  143. * Date: 2022-04-02
  144. * Editor: chw
  145. * Description: 十六进制字符串转换为字节流
  146. ******************************************************************/
  147. void HexStrToByte(const char* source, unsigned char* dest, int sourceLen);
  148. /******************************************************************
  149. * Function Name: EndianSwap
  150. * Arguments:
  151. * Return Value: void
  152. * Date: 2022-04-02
  153. * Editor: chw
  154. * Description: 改变字节顺序
  155. ******************************************************************/
  156. void EndianSwap(unsigned char *pData, int startIndex, int length);
  157. /******************************************************************
  158. * Function Name: GetCurrentNYTable
  159. * Arguments:
  160. * Return Value: void
  161. * Date: 2022-04-02
  162. * Editor: chw
  163. * Description: 获取当前月份历史表
  164. ******************************************************************/
  165. char* GetCurrentNYTable(void);
  166. /******************************************************************
  167. * Function Name: GetCurrentTime
  168. * Arguments:
  169. * Return Value: void
  170. * Date: 2022-04-02
  171. * Editor: chw
  172. * Description: 获取系统时间年月日 时分秒
  173. ******************************************************************/
  174. char* GetCurrentTime(void);
  175. /******************************************************************
  176. * Function Name: IsRelayAlarmCode
  177. * Arguments:
  178. * Return Value: void
  179. * Date: 2022-04-02
  180. * Editor: chw
  181. * Description: 判断是否属于报警code
  182. ******************************************************************/
  183. int IsRelayAlarmCode(int relayCode);
  184. /******************************************************************
  185. * Function Name: RelayAlarm
  186. * Arguments:
  187. * Return Value: void
  188. * Date: 2022-04-02
  189. * Editor: chw
  190. * Description: 继电器报警
  191. ******************************************************************/
  192. int RelayAlarm(char* mac,char* subMac,int relayCode,MYSQL* _db);
  193. /******************************************************************
  194. * Function Name: find_char
  195. * Arguments:
  196. * Return Value: void
  197. * Date: 2022-04-02
  198. * Editor: chw
  199. * Description: 字符串中查找指定字符的个数
  200. ******************************************************************/
  201. int find_char(char str[], char substr[]);
  202. /******************************************************************
  203. * Function Name: find_string
  204. * Arguments:
  205. * Return Value: void
  206. * Date: 2022-04-02
  207. * Editor: chw
  208. * Description: 从主题中查找指定'/'分割的段
  209. ******************************************************************/
  210. char* find_string(char* topicName, int section);
  211. /******************************************************************
  212. * Function Name: sendtoqueue
  213. * Arguments:
  214. * Return Value: void
  215. * Date: 2022-04-02
  216. * Editor: chw
  217. * Description: 将任务放入队列
  218. ******************************************************************/
  219. void* sendtoqueue(ArrQueue *pQueue,char* stringSql);
  220. /******************************************************************
  221. * Function Name: getqueue
  222. * Arguments:
  223. * Return Value: void
  224. * Date: 2022-04-02
  225. * Editor: chw
  226. * Description: 将任务从队列中取出
  227. ******************************************************************/
  228. void* getqueue(void *data);
  229. /******************************************************************
  230. * Function Name: CreateDbHandThread
  231. * Arguments:
  232. * Return Value: void
  233. * Date: 2022-04-02
  234. * Editor: chw
  235. * Description: 创建任务线程处理数据库执行
  236. ******************************************************************/
  237. void CreateDbHandThread(void);
  238. /*************************远程升级*********************************************/
  239. /******************************************************************
  240. * Function Name: init_crc32_tab
  241. * Arguments:
  242. * Return Value: void
  243. * Date: 2022-04-02
  244. * Editor: chw
  245. * Description: 生成CRC查询表
  246. ******************************************************************/
  247. void init_crc32_tab(void);
  248. /******************************************************************
  249. * Function Name: get_crc32
  250. * Arguments:
  251. * Return Value: void
  252. * Date: 2022-04-02
  253. * Editor: chw
  254. * Description: 获得CRC
  255. ******************************************************************/
  256. uint32_t get_crc32(uint32_t crcinit, uint8_t *bs, uint32_t bssize);
  257. /******************************************************************
  258. * Function Name: 获取缓存中的crc32
  259. * Arguments:
  260. * Return Value: void
  261. * Date: 2022-04-29
  262. * Editor: chw
  263. * Description: 获取缓存中的crc32
  264. ******************************************************************/
  265. int32_t calc_crc32_from_buff(const char *buff, int len, uint32_t *uiCrcValue);
  266. /******************************************************************
  267. * Function Name: readfile_from_db
  268. * Arguments:
  269. * Return Value: void
  270. * Date: 2022-04-29
  271. * Editor: chw
  272. * Description: 从数据库读取升级文件
  273. ******************************************************************/
  274. unsigned char *readfile_from_db(const char *filename, MYSQL *_db,int *file_length_bytes);
  275. /******************************************************************
  276. * Function Name: GetFileNameByMac
  277. * Arguments:
  278. * Return Value: void
  279. * Date: 2022-04-02
  280. * Editor: chw
  281. * Description: 根据mac查询对应升级文件名
  282. ******************************************************************/
  283. char* GetFileNameByMac(list_node* user_list,char* mac);
  284. /******************************************************************
  285. * Function Name: UpgradeFileAddFromDB
  286. * Arguments:
  287. * Return Value: void
  288. * Date: 2022-04-02
  289. * Editor: chw
  290. * Description: 新增升级文件映射节点
  291. ******************************************************************/
  292. void UpgradeFileAddFromDB(list_node* f_list,char* filename,MYSQL *_db,int ota_mode);
  293. /******************************************************************
  294. * Function Name: GetOtaInfoByFileName
  295. * Arguments:
  296. * Return Value: void
  297. * Date: 2022-04-02
  298. * Editor: chw
  299. * Description: 根据文件名和包序号查询分包数据
  300. ******************************************************************/
  301. ota_info* GetOtaInfoByFileName(list_node* f_list,char* filename);
  302. /******************************************************************
  303. * Function Name: GetUpgradeFileFromDB
  304. * Arguments:
  305. * Return Value: void
  306. * Date: 2022-04-02
  307. * Editor: chw
  308. * Description: 数据库查询升级文件名
  309. ******************************************************************/
  310. void GetUpgradeFileFromDB(char *mac,MYSQL *_db,char* filename);
  311. /******************************************************************
  312. * Function Name: core_alarm_gateway
  313. * Arguments:
  314. * Return Value: void
  315. * Date: 2023-12-5
  316. * Editor: cc
  317. * Description: 扫描网关设备数据
  318. ******************************************************************/
  319. int CoreAlarmGateway(void);
  320. /******************************************************************
  321. * Function Name: core_alarm_gateway
  322. * Arguments:
  323. * Return Value: void
  324. * Date: 2023-12-8
  325. * Editor: cc
  326. * Description: 扫描节点设备数据
  327. ******************************************************************/
  328. int CoreAlarmNode(void);
  329. /******************************************************************
  330. * Function Name: ElectricAlarm
  331. * Arguments:
  332. * Return Value: void
  333. * Date: 2023-12-7
  334. * Editor: cc
  335. * Description: 电流数据告警判断
  336. ******************************************************************/
  337. int ElectricAlarm(char* mac,char* subMac,char* gatewayName,char* nodeName,int alarmCode,char* alarmStr,MYSQL* _db);
  338. /******************************************************************
  339. * @brief 比较两个时间字符串的大小
  340. *
  341. * @param time1 时间字符串1,格式为 "HH:MM"
  342. * @param time2 时间字符串2,格式为 "HH:MM"
  343. *
  344. * @return 返回值为整数:
  345. * -1 表示 time1 小于 time2
  346. * 0 表示 time1 等于 time2
  347. * 1 表示 time1 大于 time2
  348. * 0 也可能表示解析失败或转换失败
  349. *
  350. * @details 该函数将两个时间字符串解析为 struct tm 结构,并使用 mktime 函数将其转换为 time_t 类型,
  351. * 然后比较这两个时间,返回相应的比较结果。如果解析或转换失败,函数返回 0。
  352. ******************************************************************/
  353. int compareTimes(const char *time1, const char *time2);
  354. /**
  355. * @brief 比较两个时间的函数
  356. *
  357. * @param t1 第一个时间结构体
  358. * @param t2 第二个时间结构体
  359. *
  360. * @return 负数表示t1 < t2,正数表示t1 > t2,零表示t1 == t2
  361. *
  362. * @details 该函数将两个时间结构体t1和t2转换为秒数,然后比较这两个秒数以确定它们的相对顺序。
  363. * 函数返回一个整数,用于指示t1相对于t2的顺序。负数表示t1在t2之前,正数表示t1在t2之后,零表示它们相等。
  364. *
  365. * @note 该函数不会修改输入的时间结构体。
  366. */
  367. int compareModifiedTimes(struct tm t1, struct tm t2);
  368. /**
  369. * @brief 比较给定时间和系统当前时间的函数
  370. *
  371. * @param t1 给定的时间结构体
  372. *
  373. * @return 负数表示给定时间在系统当前时间之前,正数表示给定时间在系统当前时间之后,零表示它们相等
  374. *
  375. * @details 该函数将给定时间结构体t1转换为秒数,并获取系统当前时间转换为秒数,然后比较这两个秒数以确定它们的相对顺序。
  376. * 函数返回一个整数,用于指示给定时间相对于系统当前时间的顺序。负数表示给定时间在系统当前时间之前,正数表示
  377. * 给定时间在系统当前时间之后,零表示它们相等。
  378. *
  379. * @note 该函数不会修改输入的时间结构体。
  380. */
  381. int compareWithCurrentTime(struct tm t1);
  382. //更新时间和拉合闸的时间点比较
  383. int compareWithUpdateTime(const char *timeString,const char *time1,const char *time2,const char *time3,const char *time4);
  384. #ifdef UPGRADE_BY_FILE
  385. /******************************************************************
  386. * Function Name: calc_file_crc32
  387. * Arguments:
  388. * Return Value: void
  389. * Date: 2022-04-02
  390. * Editor: chw
  391. * Description: 获得文件CRC 现已从数据库读取,暂不用
  392. ******************************************************************/
  393. int32_t calc_file_crc32(const char *pFileName, uint32_t *uiCrcValue);
  394. /******************************************************************
  395. * Function Name: GetFileLength
  396. * Arguments:
  397. * Return Value: void
  398. * Date: 2022-04-02
  399. * Editor: chw
  400. * Description: 获取文件长度 现已从数据库读取,暂不用
  401. ******************************************************************/
  402. int GetFileLength(char* file_path);
  403. /******************************************************************
  404. * Function Name: read_myfile
  405. * Arguments:
  406. * Return Value: void
  407. * Date: 2022-04-02
  408. * Editor: chw
  409. * Description: 现已从数据库读取,暂不用
  410. ******************************************************************/
  411. //unsigned char *read_myfile(const char *path, int *file_size);
  412. /******************************************************************
  413. * Function Name: UpgradeUserAdd
  414. * Arguments:
  415. * Return Value: void
  416. * Date: 2022-04-02
  417. * Editor: chw
  418. * Description: 增加用户 现已从数据库读取,暂不用
  419. ******************************************************************/
  420. //void UpgradeUserAdd(list_node* u_list,char* mac,char* file_name);
  421. /******************************************************************
  422. * Function Name: UpgradeFileAdd
  423. * Arguments:
  424. * Return Value: void
  425. * Date: 2022-04-02
  426. * Editor: chw
  427. * Description: 新增升级文件映射节点 现已从数据库读取,暂不用
  428. ******************************************************************/
  429. //void UpgradeFileAdd(list_node* f_list,char* filename,int ota_mode);
  430. #endif
  431. #endif /* #ifndef __MOZITI_CORE_H */