appl.c 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <pthread.h>
  5. #include <sys/ioctl.h>
  6. #include <linux/if.h>
  7. #include <linux/serial.h>
  8. #include <syslog.h>
  9. #include <unistd.h>
  10. #include "mongoose.h"
  11. #include "can_frame.h"
  12. #include "appl.h"
  13. #include "modbus.h"
  14. #include "MQTTClient.h"
  15. #include "MQTTClientPersistence.h"
  16. #define EXPORT_PATH "/sys/class/gpio/export" // GPIO设备导出设备
  17. #define DIR_OUT "out"
  18. #define DIR_IN "in"
  19. char* VERSION = "3.1.1";
  20. struct appl_t APPL;
  21. struct mg_mgr mgr_mqtt1; // thingsboard
  22. struct mg_mgr mgr_mqtt2; // cloud
  23. struct mg_mgr mgr_mqtt3; // gate and trans meter
  24. int appl_cfg_save( void )
  25. {
  26. FILE* fp = NULL;
  27. int rc, i;
  28. fp = fopen("./cfg.bin","wb");
  29. if( fp == NULL){
  30. syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail", __func__);
  31. return -1;
  32. }else{
  33. rc = fwrite(APPL.Set.buf, sizeof(char), sizeof(APPL.Set.buf), fp);
  34. if( rc != sizeof(APPL.Set.buf)){
  35. syslog(LOG_INFO,"%s, fwrite ./cfg.bin Fail, rc:%d", __func__, rc);
  36. return -1;
  37. }else{
  38. return 0;
  39. }
  40. }
  41. }
  42. int appl_cfg_read( void )
  43. {
  44. FILE* fp = NULL;
  45. int rc, i;
  46. fp = fopen("./cfg.bin","rb");
  47. if( fp == NULL){
  48. syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail", __func__);
  49. return -1;
  50. }else{
  51. rc = fread(APPL.Set.buf, sizeof(char), sizeof(APPL.Set.buf), fp);
  52. if( rc != sizeof(APPL.Set.buf)){
  53. syslog(LOG_INFO,"%s, fread ./cfg.bin Fail, rc:%d", __func__, rc);
  54. return -1;
  55. }else{
  56. return 0;
  57. }
  58. }
  59. }
  60. void appl_cfg_set_err( void )
  61. {
  62. APPL.Set.s.bErr = 1;
  63. strcpy(APPL.Set.s.szState,"故障");
  64. }
  65. void appl_cfg_reset_err( void )
  66. {
  67. APPL.Set.s.bErr = 0;
  68. strcpy(APPL.Set.s.szState,"正常");
  69. }
  70. static char* appl_get_datetime_long( void )
  71. {
  72. time_t timep;
  73. struct tm *tsp;
  74. static char buf[128];
  75. time(&timep);
  76. // tsp = gmtime(&timep);
  77. tsp = localtime(&timep);
  78. sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", tsp->tm_year + 1900,
  79. tsp->tm_mon + 1,
  80. tsp->tm_mday,
  81. tsp->tm_hour,
  82. tsp->tm_min,
  83. (short)tsp->tm_sec);
  84. return buf;
  85. }
  86. static char* appl_get_datetime_short( void )
  87. {
  88. static char buf[128];
  89. time_t timep;
  90. struct tm *tsp;
  91. time(&timep);
  92. // tsp = gmtime(&timep);
  93. tsp = localtime(&timep);
  94. sprintf(buf, "%02d:%02d:%02d",
  95. tsp->tm_hour,
  96. tsp->tm_min,
  97. (short)tsp->tm_sec);
  98. return buf;
  99. }
  100. static void appl_get_datetime_num(int *y, int *m, int *d, int *h, int *min, int *s)
  101. {
  102. time_t timep;
  103. struct tm *tsp;
  104. time(&timep);
  105. // tsp = gmtime(&timep);
  106. tsp = localtime(&timep);
  107. *y = 1900 + tsp->tm_year;
  108. *m = 1 + tsp->tm_mon;
  109. *d = tsp->tm_mday;
  110. *h = tsp->tm_hour;
  111. *min = tsp->tm_min;
  112. *s = tsp->tm_sec;
  113. }
  114. char* appl_get_dtstr(void)
  115. {
  116. time_t timep;
  117. struct tm *tsp;
  118. static char buf[200];
  119. time(&timep);
  120. tsp = localtime(&timep);
  121. sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", tsp->tm_year + 1900,
  122. tsp->tm_mon + 1,
  123. tsp->tm_mday,
  124. tsp->tm_hour,
  125. tsp->tm_min,
  126. (short)tsp->tm_sec);
  127. return buf;
  128. }
  129. static void* thrd_485_1(void *param)
  130. {
  131. char buf[128];
  132. modbus_t* ctx = NULL;
  133. struct timeval t;
  134. int rc;
  135. unsigned short data[256];
  136. unsigned short start;
  137. unsigned short nbr;
  138. int chidx = 1;
  139. int i;
  140. struct chan485_t* ch = &APPL.chan485[chidx];
  141. struct Dtsd1352_t* m = NULL;
  142. int64_t startts;
  143. syslog(LOG_INFO,"%s ENTER", __func__);
  144. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  145. while(1){
  146. startts = mg_millis();
  147. switch( ch->state){
  148. case ST_485_INIT:
  149. ctx = modbus_new_rtu(ch->szdev, ch->baud, 'N', 8, 1);
  150. if (ctx == NULL){
  151. MG_INFO(("%s, modbus rtu new fail", __func__));
  152. appl_485_set_state(chidx, ST_485_ERR, ERR_485_INIT_FAIL);
  153. }else if (modbus_connect(ctx) == -1){
  154. MG_INFO(("%s, modbus rtu connect fail", __func__));
  155. modbus_free(ctx);
  156. ctx = NULL;
  157. appl_485_set_state(chidx, ST_485_ERR, ERR_485_INIT_FAIL);
  158. }else{
  159. // t.tv_sec = 0;
  160. // t.tv_usec = 500000; // 500ms
  161. // //modbus_set_response_timeout(ctx, &t);
  162. // modbus_set_response_timeout(ctx, 0, 500000);
  163. ch->reqcnt = 0;
  164. ch->failcnt = 0;
  165. appl_485_set_state(chidx, ST_485_RUN, ERR_485_NONE);
  166. }
  167. break;
  168. case ST_485_RUN:
  169. // Process Cmd
  170. if( ch->Cmd == CMD_485_RESET ){
  171. ch->Cmd = CMD_485_DONE;
  172. if (ctx != NULL){
  173. modbus_close(ctx);
  174. modbus_free(ctx);
  175. ctx = NULL;
  176. }
  177. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  178. break;
  179. }
  180. break;
  181. case ST_485_ERR:
  182. if(ch->Cmd == CMD_485_RESET){
  183. ch->Cmd = CMD_485_DONE;
  184. if (ctx != NULL){
  185. modbus_close(ctx);
  186. modbus_free(ctx);
  187. ctx = NULL;
  188. }
  189. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  190. }else{
  191. usleep(300000);
  192. }
  193. break;
  194. default:
  195. // never reach here
  196. break;
  197. }
  198. usleep(100000);
  199. ch->loopcnt += 1;
  200. ch->looptime = mg_millis() - startts;
  201. }
  202. syslog(LOG_INFO, "%s EXIT", __func__);
  203. }
  204. static void* thrd_485_2(void *param)
  205. {
  206. char buf[128];
  207. modbus_t* ctx = NULL;
  208. struct timeval t;
  209. int rc;
  210. unsigned short data[256];
  211. unsigned short start;
  212. unsigned short nbr;
  213. int chidx = 2;
  214. struct chan485_t* ch = &APPL.chan485[chidx];
  215. struct Dtsd1352_t* m = NULL;
  216. int step = 1;
  217. int i;
  218. int64_t startts;
  219. syslog(LOG_INFO, "%s ENTER", __func__);
  220. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  221. while(1){
  222. startts = mg_millis();
  223. switch( ch->state){
  224. case ST_485_INIT:
  225. ctx = modbus_new_rtu(ch->szdev, ch->baud, 'N', 8, 1);
  226. if (ctx == NULL){
  227. MG_INFO(("%s, modbus rtu new fail", __func__));
  228. appl_485_set_state(chidx, ST_485_ERR, ERR_485_INIT_FAIL);
  229. }else if (modbus_connect(ctx) == -1){
  230. MG_INFO(("%s, modbus rtu connect fail", __func__));
  231. modbus_free(ctx);
  232. ctx = NULL;
  233. appl_485_set_state(chidx, ST_485_ERR, ERR_485_INIT_FAIL);
  234. }else{
  235. t.tv_sec = 0;
  236. t.tv_usec = 500000;
  237. //modbus_set_response_timeout(ctx, &t);
  238. modbus_set_response_timeout(ctx, 0, 500000);
  239. ch->reqcnt = 0;
  240. ch->failcnt = 0;
  241. appl_485_set_state(chidx, ST_485_RUN, ERR_485_NONE);
  242. }
  243. break;
  244. case ST_485_RUN:
  245. // Process Cmd
  246. if( ch->Cmd == CMD_485_RESET ){
  247. ch->Cmd = CMD_485_DONE;
  248. if (ctx != NULL){
  249. modbus_close(ctx);
  250. modbus_free(ctx);
  251. ctx = NULL;
  252. }
  253. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  254. break;
  255. }
  256. for( i = 1; i <= 5; i++ ){
  257. m = &APPL.Dtsd1352[i];
  258. if( mg_millis() - m->LastUpdate > 5000 ){
  259. m->CommState = ST_COMM_ERR;
  260. strcpy(m->szCommState,"故障");
  261. }else{
  262. m->CommState = ST_COMM_NORM;
  263. strcpy(m->szCommState,"正常");
  264. }
  265. // Comm with DTSD1352
  266. // PART 1
  267. appl_chan485_lock(chidx);
  268. usleep(50000);
  269. modbus_set_slave(ctx, m->Adr);
  270. start = 0x0000;
  271. nbr = 32;
  272. rc = modbus_read_registers( ctx, start, nbr, data);
  273. appl_chan485_unlock(chidx);
  274. ch->reqcnt += 1;
  275. if(rc != nbr){
  276. ch->failcnt += 1;
  277. m->CommFailTotalCnt += 1;
  278. modbus_flush(ctx);
  279. }else{
  280. m->com_active_e = ((int32_t)(data[0x0000 - start] << 16 | data[0x0001 - start])) * m->PT * m->CT * 0.01;
  281. m->pos_active_e = ((int32_t)(data[0x000A - start] << 16 | data[0x000B - start])) * m->PT * m->CT * 0.01;
  282. m->neg_active_e = ((int32_t)(data[0x0014 - start] << 16 | data[0x0015 - start])) * m->PT * m->CT * 0.01;
  283. // PART 2
  284. appl_chan485_lock(chidx);
  285. usleep(50000);
  286. start = 0x0061;
  287. nbr = 23;
  288. rc = modbus_read_registers( ctx, start, nbr, data);
  289. appl_chan485_unlock(chidx);
  290. ch->reqcnt += 1;
  291. if(rc != nbr){
  292. ch->failcnt += 1;
  293. m->CommFailTotalCnt += 1;
  294. modbus_flush(ctx);
  295. }else{
  296. m->ua = data[0x0061 - start] * m->PT * 0.1;
  297. m->ub = data[0x0062 - start] * m->PT * 0.1;
  298. m->uc = data[0x0063 - start] * m->PT * 0.1;
  299. m->ia = data[0x0064 - start] * m->CT * 0.01;
  300. m->ib = data[0x0065 - start] * m->CT * 0.01;
  301. m->ic = data[0x0066 - start] * m->CT * 0.01;
  302. m->freq = data[0x0077 - start] * 0.01;
  303. // PART 3
  304. appl_chan485_lock(chidx);
  305. usleep(50000);
  306. start = 0x0078;
  307. nbr = 32;
  308. rc = modbus_read_registers( ctx, start, nbr, data);
  309. appl_chan485_unlock(chidx);
  310. ch->reqcnt += 1;
  311. if(rc != nbr){
  312. ch->failcnt += 1;
  313. m->CommFailTotalCnt += 1;
  314. modbus_flush(ctx);
  315. }else{
  316. m->PT = data[0x008D - start];
  317. m->CT = data[0x008E - start];
  318. // PART 4
  319. appl_chan485_lock(chidx);
  320. usleep(50000);
  321. start = 0x016A;
  322. nbr = 60;
  323. rc = modbus_read_registers( ctx, start, nbr, data);
  324. appl_chan485_unlock(chidx);
  325. ch->reqcnt += 1;
  326. if(rc != nbr){
  327. ch->failcnt += 1;
  328. m->CommFailTotalCnt += 1;
  329. modbus_flush(ctx);
  330. }else{
  331. m->com_active_p = ((int32_t)(data[0x016A - start] << 16 | data[0x016B - start])) * m->PT * m->CT * 0.001;
  332. m->com_ractive_p = ((int32_t)(data[0x0172 - start] << 16 | data[0x0173 - start])) * m->PT * m->CT * 0.001;
  333. m->pwr_factor = (short)data[0x017F - start] * 0.001;
  334. m->pos_active_dem = data[0x0198 - start];
  335. m->neg_active_dem = data[0x0199 - start];
  336. m->LastUpdate = mg_millis();
  337. strcpy(m->szLastUpdate, appl_get_dtstr());
  338. }
  339. }
  340. }
  341. }
  342. }
  343. break;
  344. case ST_485_ERR:
  345. if(ch->Cmd == CMD_485_RESET){
  346. ch->Cmd = CMD_485_DONE;
  347. if (ctx != NULL){
  348. modbus_close(ctx);
  349. modbus_free(ctx);
  350. ctx = NULL;
  351. }
  352. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  353. }else{
  354. usleep(300000);
  355. }
  356. break;
  357. default:
  358. // never reach here
  359. break;
  360. }
  361. usleep(100000);
  362. ch->loopcnt += 1;
  363. ch->looptime = mg_millis() - startts;
  364. }
  365. syslog(LOG_INFO, "%s EXIT", __func__);
  366. }
  367. static void* thrd_485_3(void *param)
  368. {
  369. char buf[128];
  370. modbus_t* ctx = NULL;
  371. struct timeval t;
  372. int rc;
  373. unsigned short data[256];
  374. unsigned short start;
  375. unsigned short nbr;
  376. int chidx = 3;
  377. int i;
  378. struct chan485_t* ch = &APPL.chan485[chidx];
  379. int64_t startts;
  380. struct Dtsd1352_t* m = NULL;
  381. syslog(LOG_INFO,"%s ENTER", __func__);
  382. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  383. while(1){
  384. startts = mg_millis();
  385. switch( ch->state){
  386. case ST_485_INIT:
  387. ctx = modbus_new_rtu(ch->szdev, ch->baud, 'N', 8, 1);
  388. if (ctx == NULL){
  389. MG_INFO(("%s, modbus rtu new fail", __func__));
  390. appl_485_set_state(chidx, ST_485_ERR, ERR_485_INIT_FAIL);
  391. }else if (modbus_connect(ctx) == -1){
  392. MG_INFO(("%s, modbus rtu connect fail", __func__));
  393. modbus_free(ctx);
  394. ctx = NULL;
  395. appl_485_set_state(chidx, ST_485_ERR, ERR_485_INIT_FAIL);
  396. }else{
  397. t.tv_sec = 0;
  398. t.tv_usec = 500000;
  399. //modbus_set_response_timeout(ctx, &t);
  400. modbus_set_response_timeout(ctx, 0, 500000);
  401. ch->reqcnt = 0;
  402. ch->failcnt = 0;
  403. appl_485_set_state(chidx, ST_485_RUN, ERR_485_NONE);
  404. }
  405. break;
  406. case ST_485_RUN:
  407. // Process Cmd
  408. if( ch->Cmd == CMD_485_RESET ){
  409. ch->Cmd = CMD_485_DONE;
  410. if (ctx != NULL){
  411. modbus_close(ctx);
  412. modbus_free(ctx);
  413. ctx = NULL;
  414. }
  415. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  416. break;
  417. }
  418. break;
  419. case ST_485_ERR:
  420. if(ch->Cmd == CMD_485_RESET){
  421. ch->Cmd = CMD_485_DONE;
  422. if (ctx != NULL){
  423. modbus_close(ctx);
  424. modbus_free(ctx);
  425. ctx = NULL;
  426. }
  427. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  428. }else{
  429. usleep(300000);
  430. }
  431. break;
  432. default:
  433. // never reach here
  434. break;
  435. }
  436. usleep(100000);
  437. ch->loopcnt += 1;
  438. ch->looptime = mg_millis() - startts;
  439. }
  440. syslog(LOG_INFO,"%s EXIT", __func__);
  441. }
  442. static void* thrd_485_4(void *param)
  443. {
  444. char buf[128];
  445. modbus_t* ctx = NULL;
  446. struct timeval t;
  447. int rc;
  448. unsigned short data[256];
  449. unsigned short start;
  450. unsigned short nbr;
  451. int chidx = 4;
  452. int i;
  453. struct chan485_t* ch = &APPL.chan485[chidx];
  454. int64_t startts;
  455. struct Dtsd1352_t* m = NULL;
  456. syslog(LOG_INFO,"%s ENTER", __func__);
  457. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  458. while(1){
  459. startts = mg_millis();
  460. switch( ch->state){
  461. case ST_485_INIT:
  462. ctx = modbus_new_rtu(ch->szdev, ch->baud, 'N', 8, 1);
  463. if (ctx == NULL){
  464. MG_INFO(("%s, modbus rtu new fail", __func__));
  465. appl_485_set_state(chidx, ST_485_ERR, ERR_485_INIT_FAIL);
  466. }else if (modbus_connect(ctx) == -1){
  467. MG_INFO(("%s, modbus rtu connect fail", __func__));
  468. modbus_free(ctx);
  469. ctx = NULL;
  470. appl_485_set_state(chidx, ST_485_ERR, ERR_485_INIT_FAIL);
  471. }else{
  472. t.tv_sec = 0;
  473. t.tv_usec = 500000;
  474. //modbus_set_response_timeout(ctx, &t);
  475. modbus_set_response_timeout(ctx, 0, 500000);
  476. ch->reqcnt = 0;
  477. ch->failcnt = 0;
  478. appl_485_set_state(chidx, ST_485_RUN, ERR_485_NONE);
  479. }
  480. break;
  481. case ST_485_RUN:
  482. // Process Cmd
  483. if( ch->Cmd == CMD_485_RESET ){
  484. ch->Cmd = CMD_485_DONE;
  485. if (ctx != NULL){
  486. modbus_close(ctx);
  487. modbus_free(ctx);
  488. ctx = NULL;
  489. }
  490. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  491. break;
  492. }
  493. break;
  494. case ST_485_ERR:
  495. if(ch->Cmd == CMD_485_RESET){
  496. ch->Cmd = CMD_485_DONE;
  497. if (ctx != NULL){
  498. modbus_close(ctx);
  499. modbus_free(ctx);
  500. ctx = NULL;
  501. }
  502. appl_485_set_state(chidx, ST_485_INIT, ERR_485_NONE);
  503. }else{
  504. usleep(300000);
  505. }
  506. break;
  507. default:
  508. // never reach here
  509. break;
  510. }
  511. usleep(100000);
  512. ch->loopcnt += 1;
  513. ch->looptime = mg_millis() - startts;
  514. }
  515. syslog(LOG_INFO,"%s EXIT", __func__);
  516. }
  517. void appl_chan485_lock(int idx)
  518. {
  519. //pthread_mutex_lock(&APPL.chan485[idx].mutex);
  520. }
  521. void appl_chan485_unlock(int idx)
  522. {
  523. //pthread_mutex_unlock(&APPL.chan485[idx].mutex);
  524. }
  525. void appl_485_set_state(int idx, int s, int e)
  526. {
  527. struct chan485_t* c = &APPL.chan485[idx];
  528. c->state = s;
  529. switch( c->state){
  530. case ST_485_INIT:
  531. strcpy(c->szstate,"初始化");
  532. break;
  533. case ST_485_RUN:
  534. strcpy(c->szstate,"运行");
  535. break;
  536. case ST_485_ERR:
  537. strcpy(c->szstate,"故障");
  538. break;
  539. default:
  540. strcpy(c->szstate,"未知");
  541. break;
  542. }
  543. c->err = e;
  544. switch (e)
  545. {
  546. case ERR_485_NONE:
  547. strcpy(c->szerr,"无");
  548. break;
  549. case ERR_485_INIT_FAIL:
  550. strcpy(c->szerr,"初始化失败");
  551. break;
  552. default:
  553. strcpy(c->szerr,"未知");
  554. break;
  555. }
  556. }
  557. int appl_chan485_get_state(int idx)
  558. {
  559. return APPL.chan485[idx].state;
  560. }
  561. void appl_can_set_state(int idx, int s, int e)
  562. {
  563. struct chancan_t* c = &APPL.chancan[idx];
  564. c->State = s;
  565. switch( c->State){
  566. case ST_CAN_INIT:
  567. strcpy(c->szState,"初始化");
  568. break;
  569. case ST_CHANCAN_RUN:
  570. strcpy(c->szState,"运行");
  571. break;
  572. case ST_CHANCAN_ERR:
  573. strcpy(c->szState,"故障");
  574. break;
  575. default:
  576. strcpy(c->szState,"未知");
  577. break;
  578. }
  579. c->Err = e;
  580. switch(e){
  581. case ERR_CAN_NONE:
  582. strcpy(c->szErr,"无");
  583. break;
  584. case ERR_CAN_INIT_FAIL:
  585. strcpy(c->szErr,"初始化失败");
  586. break;
  587. default:
  588. break;
  589. }
  590. }
  591. int appl_can_get_state(int idx)
  592. {
  593. return APPL.chancan[idx].State;
  594. }
  595. void appl_485_set_485mode( void ) {
  596. int fd;
  597. struct serial_rs485 rs485conf = {0};
  598. int ret;
  599. // 1# 485
  600. fd = open("/dev/ttymxc1", O_RDWR | O_NOCTTY);
  601. if (fd <= 0) {
  602. syslog(LOG_INFO,"%s, Open ttymxc1 Fail",__func__);
  603. }else{
  604. /* get configure from device */
  605. ret = ioctl(fd, TIOCGRS485, &rs485conf);
  606. if(ret < 0) {
  607. // failed
  608. syslog(LOG_INFO,"%s, ioctl ttymxc1 Fail",__func__);
  609. }
  610. /* set enable rs485 mode in configure */
  611. /* Enable RS485 mode: */
  612. rs485conf.flags |= SER_RS485_ENABLED;
  613. /* Set logical level for RTS pin equal to 1 when sending: */
  614. rs485conf.flags |= SER_RS485_RTS_ON_SEND;
  615. /* Set logical level for RTS pin equal to 0 after sending: */
  616. rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
  617. /* Set this flag if you want to receive data even whilst sending data */
  618. rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
  619. /* Set rts delay before send, if needed: */
  620. rs485conf.delay_rts_before_send = 0; // in miliseconds
  621. /* Set rts delay after send, if needed: */
  622. rs485conf.delay_rts_after_send = 0; // in miliseconds
  623. ret = ioctl(fd, TIOCSRS485, &rs485conf);
  624. if (ret < 0) {
  625. /* Error handling. See errno. */
  626. syslog(LOG_INFO,"%s, Set ttymxc1 485 Fail",__func__);
  627. }
  628. close(fd);
  629. }
  630. // 2# 485
  631. fd = open("/dev/ttymxc2", O_RDWR | O_NOCTTY);
  632. if (fd <= 0) {
  633. syslog(LOG_INFO,"%s, Open ttymxc2 Fail",__func__);
  634. }else{
  635. /* get configure from device */
  636. ret = ioctl(fd, TIOCGRS485, &rs485conf);
  637. if(ret < 0) {
  638. // failed
  639. syslog(LOG_INFO,"%s, ioctl ttymxc2 Fail",__func__);
  640. }
  641. /* set enable rs485 mode in configure */
  642. /* Enable RS485 mode: */
  643. rs485conf.flags |= SER_RS485_ENABLED;
  644. /* Set logical level for RTS pin equal to 1 when sending: */
  645. rs485conf.flags |= SER_RS485_RTS_ON_SEND;
  646. /* Set logical level for RTS pin equal to 0 after sending: */
  647. rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
  648. /* Set this flag if you want to receive data even whilst sending data */
  649. rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
  650. /* Set rts delay before send, if needed: */
  651. rs485conf.delay_rts_before_send = 0; // in miliseconds
  652. /* Set rts delay after send, if needed: */
  653. rs485conf.delay_rts_after_send = 0; // in miliseconds
  654. ret = ioctl(fd, TIOCSRS485, &rs485conf);
  655. if (ret < 0) {
  656. /* Error handling. See errno. */
  657. syslog(LOG_INFO,"%s, Set ttymxc2 485 Fail",__func__);
  658. }
  659. close(fd);
  660. }
  661. // 3# 485
  662. fd = open("/dev/ttymxc3", O_RDWR | O_NOCTTY);
  663. if (fd <= 0) {
  664. syslog(LOG_INFO,"%s, Open ttymxc3 Fail",__func__);
  665. }else{
  666. /* get configure from device */
  667. ret = ioctl(fd, TIOCGRS485, &rs485conf);
  668. if(ret < 0) {
  669. // failed
  670. syslog(LOG_INFO,"%s, ioctl ttymxc3 Fail",__func__);
  671. }
  672. /* set enable rs485 mode in configure */
  673. /* Enable RS485 mode: */
  674. rs485conf.flags |= SER_RS485_ENABLED;
  675. /* Set logical level for RTS pin equal to 1 when sending: */
  676. rs485conf.flags |= SER_RS485_RTS_ON_SEND;
  677. /* Set logical level for RTS pin equal to 0 after sending: */
  678. rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
  679. /* Set this flag if you want to receive data even whilst sending data */
  680. rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
  681. /* Set rts delay before send, if needed: */
  682. rs485conf.delay_rts_before_send = 0; // in miliseconds
  683. /* Set rts delay after send, if needed: */
  684. rs485conf.delay_rts_after_send = 0; // in miliseconds
  685. ret = ioctl(fd, TIOCSRS485, &rs485conf);
  686. if (ret < 0) {
  687. /* Error handling. See errno. */
  688. syslog(LOG_INFO,"%s, Set ttymxc3 485 Fail",__func__);
  689. }
  690. close(fd);
  691. }
  692. // 4# 485
  693. fd = open("/dev/ttymxc5", O_RDWR | O_NOCTTY);
  694. if (fd <= 0) {
  695. syslog(LOG_INFO,"%s, Open ttymxc5 Fail",__func__);
  696. }else{
  697. /* get configure from device */
  698. ret = ioctl(fd, TIOCGRS485, &rs485conf);
  699. if(ret < 0) {
  700. // failed
  701. syslog(LOG_INFO,"%s, ioctl ttymxc5 Fail",__func__);
  702. }
  703. /* set enable rs485 mode in configure */
  704. /* Enable RS485 mode: */
  705. rs485conf.flags |= SER_RS485_ENABLED;
  706. /* Set logical level for RTS pin equal to 1 when sending: */
  707. rs485conf.flags |= SER_RS485_RTS_ON_SEND;
  708. /* Set logical level for RTS pin equal to 0 after sending: */
  709. rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
  710. /* Set this flag if you want to receive data even whilst sending data */
  711. rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
  712. /* Set rts delay before send, if needed: */
  713. rs485conf.delay_rts_before_send = 0; // in miliseconds
  714. /* Set rts delay after send, if needed: */
  715. rs485conf.delay_rts_after_send = 0; // in miliseconds
  716. ret = ioctl(fd, TIOCSRS485, &rs485conf);
  717. if (ret < 0) {
  718. /* Error handling. See errno. */
  719. syslog(LOG_INFO,"%s, Set ttymxc5 485 Fail",__func__);
  720. }
  721. close(fd);
  722. }
  723. }
  724. static void fn_mqtt1(struct mg_connection *c, int ev, void *ev_data) {
  725. // struct chanmqtt_t* m = &APPL.chanmqtt[1];
  726. // if (ev == MG_EV_OPEN) {
  727. // MG_INFO(("%lu CREATED", c->id));
  728. // // c->is_hexdumping = 1;
  729. // } else if (ev == MG_EV_CONNECT) {
  730. // if (mg_url_is_ssl(m->szs_url)) {
  731. // struct mg_tls_opts opts = {.ca = mg_unpacked("/certs/ca.pem"),
  732. // .name = mg_url_host(m->szs_url)};
  733. // mg_tls_init(c, &opts);
  734. // }
  735. // } else if (ev == MG_EV_ERROR) {
  736. // // On error, log error message
  737. // MG_ERROR(("%lu ERROR %s", c->id, (char *) ev_data));
  738. // } else if (ev == MG_EV_MQTT_OPEN) {
  739. // m->bConnected = 1;
  740. // strcpy(m->szState,"正常");
  741. // // MQTT connect is successful
  742. // struct mg_str subt = mg_str(m->szs_sub_topic);
  743. // MG_INFO(("%lu CONNECTED to %s", c->id, m->szs_url));
  744. // struct mg_mqtt_opts sub_opts;
  745. // memset(&sub_opts, 0, sizeof(sub_opts));
  746. // sub_opts.topic = subt;
  747. // sub_opts.qos = m->s_qos;
  748. // mg_mqtt_sub(c, &sub_opts);
  749. // MG_INFO(("%lu SUBSCRIBED to %.*s", c->id, (int) subt.len, subt.ptr));
  750. // } else if (ev == MG_EV_MQTT_MSG) {
  751. // // When we get echo response, print it
  752. // struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
  753. // MG_INFO(("%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len,
  754. // mm->data.ptr, (int) mm->topic.len, mm->topic.ptr));
  755. // } else if (ev == MG_EV_CLOSE) {
  756. // MG_INFO(("%lu CLOSED", c->id));
  757. // m->s_conn = NULL; // Mark that we're closed
  758. // m->bConnected = 0;
  759. // strcpy(m->szState,"故障");
  760. // }
  761. }
  762. static void fn_mqtt2(struct mg_connection *c, int ev, void *ev_data) {
  763. struct chanmqtt_t* m = &APPL.chanmqtt[2];
  764. if (ev == MG_EV_OPEN) {
  765. syslog(LOG_INFO,"%lu CREATED", c->id);
  766. // c->is_hexdumping = 1;
  767. } else if (ev == MG_EV_CONNECT) {
  768. if (mg_url_is_ssl(m->szs_url)) {
  769. struct mg_tls_opts opts = {.ca = mg_unpacked("/certs/ca.pem"),
  770. .name = mg_url_host(m->szs_url)};
  771. mg_tls_init(c, &opts);
  772. }
  773. } else if (ev == MG_EV_ERROR) {
  774. // On error, log error message
  775. syslog(LOG_INFO,"%lu ERROR %s", c->id, (char *) ev_data);
  776. } else if (ev == MG_EV_MQTT_OPEN) {
  777. m->bConnected = 1;
  778. strcpy(m->szState,"正常");
  779. m->TotalReconn++;
  780. // MQTT connect is successful
  781. struct mg_str subt = mg_str(m->szs_sub_topic);
  782. syslog(LOG_INFO,"%lu CONNECTED to %s", c->id, m->szs_url);
  783. struct mg_mqtt_opts sub_opts;
  784. memset(&sub_opts, 0, sizeof(sub_opts));
  785. sub_opts.topic = subt;
  786. sub_opts.qos = m->s_qos;
  787. mg_mqtt_sub(c, &sub_opts);
  788. syslog(LOG_INFO,"%lu SUBSCRIBED to %.*s", c->id, (int) subt.len, subt.ptr);
  789. } else if (ev == MG_EV_MQTT_MSG) {
  790. // When we get echo response, print it
  791. struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
  792. syslog(LOG_INFO,"%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len,
  793. mm->data.ptr, (int) mm->topic.len, mm->topic.ptr);
  794. m->TotalRecv++;
  795. } else if (ev == MG_EV_CLOSE) {
  796. syslog(LOG_INFO,"%lu CLOSED", c->id);
  797. m->s_conn = NULL; // Mark that we're closed
  798. m->bConnected = 0;
  799. strcpy(m->szState,"故障");
  800. }
  801. }
  802. static void fn_mqtt3(struct mg_connection *c, int ev, void *ev_data) {
  803. struct chanmqtt_t* m = &APPL.chanmqtt[3];
  804. char buf[256];
  805. if (ev == MG_EV_OPEN) {
  806. syslog(LOG_INFO,"%s, %lu CREATED", __func__, c->id);
  807. // c->is_hexdumping = 1;
  808. } else if (ev == MG_EV_CONNECT) {
  809. if (mg_url_is_ssl(m->szs_url)) {
  810. struct mg_tls_opts opts = {.ca = mg_unpacked("/certs/ca.pem"),
  811. .name = mg_url_host(m->szs_url)};
  812. mg_tls_init(c, &opts);
  813. }
  814. } else if (ev == MG_EV_ERROR) {
  815. // On error, log error message
  816. syslog(LOG_INFO, "%s, %lu ERROR %s", __func__, c->id, (char *) ev_data);
  817. } else if (ev == MG_EV_MQTT_OPEN) {
  818. m->bConnected = 1;
  819. strcpy(m->szState,"正常");
  820. // MQTT connect is successful
  821. syslog(LOG_INFO,"%s, %lu CONNECTED to %s", __func__, c->id, m->szs_url);
  822. struct mg_str subt = mg_str(m->szs_sub_topic[0]);
  823. struct mg_mqtt_opts sub_opts;
  824. memset(&sub_opts, 0, sizeof(sub_opts));
  825. sub_opts.topic = subt;
  826. sub_opts.qos = m->s_qos;
  827. mg_mqtt_sub(c, &sub_opts);
  828. syslog(LOG_INFO,"%s, %lu SUBSCRIBED to %.*s", __func__, c->id, (int) subt.len, subt.ptr);
  829. // subt = mg_str(m->szs_sub_topic[1]);
  830. // memset(&sub_opts, 0, sizeof(sub_opts));
  831. // sub_opts.topic = subt;
  832. // sub_opts.qos = m->s_qos;
  833. // mg_mqtt_sub(c, &sub_opts);
  834. // syslog(LOG_INFO,"%s, %lu SUBSCRIBED to %.*s", __func__, c->id, (int) subt.len, subt.ptr);
  835. } else if (ev == MG_EV_MQTT_MSG) {
  836. // When we get echo response, print it
  837. struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
  838. //syslog(LOG_INFO,"%s, %lu RECEIVED %.*s <- %.*s", __func__, c->id, (int) mm->data.len,
  839. // mm->data.ptr, (int) mm->topic.len, mm->topic.ptr);
  840. struct mg_str json = mg_str(mm->data.ptr);
  841. double dval;
  842. bool ok;
  843. if( strcmp(mm->topic.ptr, m->szs_sub_topic[0]) == 0){ // gate meter
  844. syslog(LOG_INFO,"%s, Get Gate Meter Data", __func__);
  845. ok = mg_json_get_num(json,"$.m1_com_ap", &dval);
  846. if( ok ){
  847. // gm->com_active_p = dval;
  848. // gm->LastUpdate = mg_millis();
  849. // strcpy(gm->szLastUpdate, appl_get_datetime_long());
  850. }
  851. ok = mg_json_get_num(json,"$.m2_com_ap", &dval);
  852. if( ok ){
  853. // tm->com_active_p = dval;
  854. // tm->LastUpdate = mg_millis();
  855. // strcpy(tm->szLastUpdate, appl_get_datetime_long());
  856. }
  857. }
  858. } else if (ev == MG_EV_CLOSE) {
  859. syslog(LOG_INFO,"%s, %lu CLOSED", __func__, c->id);
  860. m->s_conn = NULL; // Mark that we're closed
  861. m->bConnected = 0;
  862. strcpy(m->szState,"故障");
  863. }
  864. }
  865. static void* thrd_mqtt_1(void* param){
  866. // struct chanmqtt_t* m = &APPL.chanmqtt[1];
  867. // struct Dtsd1352_t* meter = NULL;
  868. // struct mg_mqtt_opts opts = {.user = mg_str(m->szusrname),
  869. // .clean = true,
  870. // .qos = m->s_qos,
  871. // .topic = mg_str(m->szs_pub_topic),
  872. // .version = 4,
  873. // .message = mg_str("bye")};
  874. // struct mg_mqtt_opts pub_opts;
  875. // struct mg_str pubt = mg_str(m->szs_pub_topic);
  876. // char msg[2048];
  877. // char buf[2048];
  878. // int i;
  879. // mg_mgr_init(&mgr_mqtt1);
  880. // MG_INFO(("%s ENTER, idx:1", __func__));
  881. // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt1, m->szs_url, &opts, fn_mqtt1, NULL);
  882. // while(1){
  883. // mg_mgr_poll(&mgr_mqtt1, 50);
  884. // if(mg_millis() - m->LastUpload > 5000){
  885. // m->LastUpload = mg_millis();
  886. // if(m->bConnected){
  887. // for(i = 1; i <= 2; i++){
  888. // meter = &APPL.Dtsd1352[i];
  889. // if( meter->CommState == ST_COMM_NORM ){
  890. // memset(&pub_opts, 0, sizeof(pub_opts));
  891. // pub_opts.topic = pubt;
  892. // sprintf(buf,
  893. // "\"m%d_pf\":%.3f,\
  894. // \"m%d_com_ap\":%.1f,\"m%d_com_ae\":%.1f,\"m%d_pos_ae\":%.1f,\"m%d_neg_ae\":%.1f, \
  895. // \"m%d_ua\":%.1f,\"m%d_ub\":%.1f,\"m%d_uc\":%.1f, \
  896. // \"m%d_ia\":%.1f,\"m%d_ib\":%.1f,\"m%d_ic\":%.1f",
  897. // i, meter->pwr_factor,
  898. // i, meter->com_active_p,i, meter->com_active_e,i, meter->pos_active_e,i, meter->neg_active_e,
  899. // i, meter->ua,i, meter->ub,i, meter->uc,
  900. // i, meter->ia,i, meter->ib,i, meter->ic);
  901. // sprintf(msg,"{'ts':%lld,'values':{%s}}", (long long)time(NULL)*1000, buf);
  902. // pub_opts.message = mg_str(msg);
  903. // pub_opts.qos = m->s_qos, pub_opts.retain = false;
  904. // mg_mqtt_pub(m->s_conn, &pub_opts);
  905. // }
  906. // }
  907. // }
  908. // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt1, m->szs_url, &opts, fn_mqtt1, NULL);
  909. // }
  910. // }
  911. // MG_INFO(("%s EXIT, idx:1", __func__));
  912. }
  913. static void* thrd_mqtt_2(void* param){
  914. int i;
  915. struct Dtsd1352_t* me = NULL;
  916. struct chanmqtt_t* m = &APPL.chanmqtt[2];
  917. struct Settings_t* set = &APPL.Set.s;
  918. struct mg_mqtt_opts opts = {.user = mg_str(m->szusrname),
  919. .pass = mg_str(m->szpasswd),
  920. .client_id = mg_str(m->szclientid),
  921. .clean = true,
  922. .qos = m->s_qos,
  923. .topic = mg_str(m->szs_pub_topic),
  924. .version = 4};
  925. struct mg_mqtt_opts pub_opts;
  926. struct mg_str pubt = mg_str(m->szs_pub_topic);
  927. char msg[2048];
  928. char buf[2048];
  929. mg_mgr_init(&mgr_mqtt2);
  930. syslog(LOG_INFO,"%s ENTER idx:2", __func__);
  931. if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt2, m->szs_url, &opts, fn_mqtt2, NULL);
  932. while(1){
  933. mg_mgr_poll(&mgr_mqtt2, 50);
  934. // Process Cmd
  935. if( m->Cmd == CMD_MQTT_REGISTER ){
  936. m->Cmd = CMD_MQTT_DONE;
  937. // Register CtnMeter1
  938. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1}]}",
  939. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter1");
  940. pub_opts.message = mg_str(msg);
  941. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  942. pub_opts.topic = mg_str("register");
  943. mg_mqtt_pub(m->s_conn, &pub_opts);
  944. // Register CtnMeter2
  945. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1}]}",
  946. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter2");
  947. pub_opts.message = mg_str(msg);
  948. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  949. pub_opts.topic = mg_str("register");
  950. mg_mqtt_pub(m->s_conn, &pub_opts);
  951. // Register CtnMeter3
  952. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1}]}",
  953. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter3");
  954. pub_opts.message = mg_str(msg);
  955. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  956. pub_opts.topic = mg_str("register");
  957. mg_mqtt_pub(m->s_conn, &pub_opts);
  958. // Register CtnMeter4
  959. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1}]}",
  960. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter4");
  961. pub_opts.message = mg_str(msg);
  962. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  963. pub_opts.topic = mg_str("register");
  964. mg_mqtt_pub(m->s_conn, &pub_opts);
  965. // Register CtnMeter5
  966. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1}]}",
  967. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter5");
  968. pub_opts.message = mg_str(msg);
  969. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  970. pub_opts.topic = mg_str("register");
  971. mg_mqtt_pub(m->s_conn, &pub_opts);
  972. }
  973. if(mg_millis() - m->LastFastUpload > set->UploadHighSpeed){
  974. m->LastFastUpload = mg_millis();
  975. if(m->bConnected){
  976. // CtnMeter1
  977. me = &APPL.Dtsd1352[1];
  978. if(me->CommState == ST_COMM_NORM){
  979. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1,\
  980. \"pos_ae\":%.1f,\"neg_ae\":%.1f,\"com_ap\":%.1f,\"com_rap\":%.1f,\
  981. \"ua\":%.1f,\"ub\":%.1f,\"uc\":%.1f,\"ia\":%.1f,\"ib\":%.1f,\"ic\":%.1f,\
  982. \"gf\":%.1f,\"pf\":%.1f,\"pos_adem\":%.1f}]}",
  983. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter1",
  984. me->pos_active_e,me->neg_active_e,me->com_active_p,me->com_ractive_p,
  985. me->ua, me->ub, me->uc, me->ia, me->ib, me->ic,
  986. me->freq, me->pwr_factor, me->pos_active_dem);
  987. pub_opts.message = mg_str(msg);
  988. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  989. pub_opts.topic = mg_str(m->szs_pub_topic[1]);
  990. mg_mqtt_pub(m->s_conn, &pub_opts);
  991. m->TotalSend++;
  992. }
  993. // CtnMeter2
  994. me = &APPL.Dtsd1352[2];
  995. if(me->CommState == ST_COMM_NORM){
  996. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1,\
  997. \"pos_ae\":%.1f,\"neg_ae\":%.1f,\"com_ap\":%.1f,\"com_rap\":%.1f,\
  998. \"ua\":%.1f,\"ub\":%.1f,\"uc\":%.1f,\"ia\":%.1f,\"ib\":%.1f,\"ic\":%.1f,\
  999. \"gf\":%.1f,\"pf\":%.1f,\"pos_adem\":%.1f}]}",
  1000. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter2",
  1001. me->pos_active_e,me->neg_active_e,me->com_active_p,me->com_ractive_p,
  1002. me->ua, me->ub, me->uc, me->ia, me->ib, me->ic,
  1003. me->freq, me->pwr_factor, me->pos_active_dem);
  1004. pub_opts.message = mg_str(msg);
  1005. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  1006. pub_opts.topic = mg_str(m->szs_pub_topic[2]);
  1007. mg_mqtt_pub(m->s_conn, &pub_opts);
  1008. m->TotalSend++;
  1009. }
  1010. // CtnMeter3
  1011. me = &APPL.Dtsd1352[3];
  1012. if(me->CommState == ST_COMM_NORM){
  1013. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1,\
  1014. \"pos_ae\":%.1f,\"neg_ae\":%.1f,\"com_ap\":%.1f,\"com_rap\":%.1f,\
  1015. \"ua\":%.1f,\"ub\":%.1f,\"uc\":%.1f,\"ia\":%.1f,\"ib\":%.1f,\"ic\":%.1f,\
  1016. \"gf\":%.1f,\"pf\":%.1f,\"pos_adem\":%.1f}]}",
  1017. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter3",
  1018. me->pos_active_e,me->neg_active_e,me->com_active_p,me->com_ractive_p,
  1019. me->ua, me->ub, me->uc, me->ia, me->ib, me->ic,
  1020. me->freq, me->pwr_factor, me->pos_active_dem);
  1021. pub_opts.message = mg_str(msg);
  1022. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  1023. pub_opts.topic = mg_str(m->szs_pub_topic[3]);
  1024. mg_mqtt_pub(m->s_conn, &pub_opts);
  1025. m->TotalSend++;
  1026. }
  1027. // CtnMeter4
  1028. me = &APPL.Dtsd1352[4];
  1029. if(me->CommState == ST_COMM_NORM){
  1030. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1,\
  1031. \"pos_ae\":%.1f,\"neg_ae\":%.1f,\"com_ap\":%.1f,\"com_rap\":%.1f,\
  1032. \"ua\":%.1f,\"ub\":%.1f,\"uc\":%.1f,\"ia\":%.1f,\"ib\":%.1f,\"ic\":%.1f,\
  1033. \"gf\":%.1f,\"pf\":%.1f,\"pos_adem\":%.1f}]}",
  1034. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter4",
  1035. me->pos_active_e,me->neg_active_e,me->com_active_p,me->com_ractive_p,
  1036. me->ua, me->ub, me->uc, me->ia, me->ib, me->ic,
  1037. me->freq, me->pwr_factor, me->pos_active_dem);
  1038. pub_opts.message = mg_str(msg);
  1039. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  1040. pub_opts.topic = mg_str(m->szs_pub_topic[4]);
  1041. mg_mqtt_pub(m->s_conn, &pub_opts);
  1042. m->TotalSend++;
  1043. }
  1044. // CtnMeter5
  1045. me = &APPL.Dtsd1352[5];
  1046. if(me->CommState == ST_COMM_NORM){
  1047. sprintf(msg, "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":12,\"idx\":1,\
  1048. \"pos_ae\":%.1f,\"neg_ae\":%.1f,\"com_ap\":%.1f,\"com_rap\":%.1f,\
  1049. \"ua\":%.1f,\"ub\":%.1f,\"uc\":%.1f,\"ia\":%.1f,\"ib\":%.1f,\"ic\":%.1f,\
  1050. \"gf\":%.1f,\"pf\":%.1f,\"pos_adem\":%.1f}]}",
  1051. set->szCloudUserName, (long long)time(NULL)*1000, "CtnMeter5",
  1052. me->pos_active_e,me->neg_active_e,me->com_active_p,me->com_ractive_p,
  1053. me->ua, me->ub, me->uc, me->ia, me->ib, me->ic,
  1054. me->freq, me->pwr_factor, me->pos_active_dem);
  1055. pub_opts.message = mg_str(msg);
  1056. pub_opts.qos = m->s_qos, pub_opts.retain = false;
  1057. pub_opts.topic = mg_str(m->szs_pub_topic[5]);
  1058. mg_mqtt_pub(m->s_conn, &pub_opts);
  1059. m->TotalSend++;
  1060. }
  1061. }
  1062. }
  1063. if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt2, m->szs_url, &opts, fn_mqtt2, NULL);
  1064. }
  1065. syslog(LOG_INFO, "%s EXIT, idx:2", __func__);
  1066. }
  1067. // Get data from mosquitto server
  1068. static void* thrd_mqtt_3(void* param){
  1069. struct chanmqtt_t* m = &APPL.chanmqtt[3];
  1070. struct mg_mqtt_opts opts = {.user = mg_str(m->szusrname),
  1071. .clean = true,
  1072. .qos = m->s_qos,
  1073. .topic = mg_str(m->szs_pub_topic),
  1074. .version = 4,
  1075. .keepalive = 3,
  1076. .message = mg_str("bye")};
  1077. struct mg_mqtt_opts pub_opts;
  1078. struct mg_str pubt = mg_str(m->szs_pub_topic);
  1079. char msg[2048];
  1080. int64_t LastReconn = 0;
  1081. int64_t LastCommCheck = 0;
  1082. mg_mgr_init(&mgr_mqtt3);
  1083. syslog(LOG_INFO,"%s ENTER, idx:3", __func__);
  1084. if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt3, m->szs_url, &opts, fn_mqtt3, NULL);
  1085. while(1){
  1086. mg_mgr_poll(&mgr_mqtt3, 50);
  1087. if(mg_millis() - LastReconn > 5000){ // 5s
  1088. LastReconn = mg_millis();
  1089. if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt1, m->szs_url, &opts, fn_mqtt3, NULL);
  1090. }
  1091. if(mg_millis() - LastCommCheck > 1000){ // 1s
  1092. LastCommCheck = mg_millis();
  1093. }
  1094. }
  1095. syslog(LOG_INFO,"%s EXIT, idx:1", __func__);
  1096. }
  1097. static int mqtt4_connlost = 0;
  1098. static void fn_mqtt4_connlost(void *context, char *cause)
  1099. {
  1100. syslog(LOG_INFO, "%s, mqtt connection lost, cause: %s\n", __func__, cause);
  1101. mqtt4_connlost = 1;
  1102. }
  1103. static int fn_mqtt4_msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
  1104. {
  1105. struct chanmqtt_t* mq = &APPL.chanmqtt[4];
  1106. int64_t CurrIntv;
  1107. //syslog(LOG_INFO,"%s, Message arrived, topic:%s topic len:%d payload len:%d", __func__, topicName,topicLen, message->payloadlen);
  1108. struct mg_str json = mg_str(message->payload);
  1109. double dval;
  1110. bool ok;
  1111. if( strcmp(topicName, mq->szs_sub_topic[0]) == 0){
  1112. if(mq->LastRecv == 0){ // First Recv
  1113. mq->TotalRecv = 0;
  1114. mq->LastRecv = mg_millis();
  1115. mq->TotalIntv = 0;
  1116. }else{
  1117. mq->TotalRecv++;
  1118. CurrIntv = mg_millis() - mq->LastRecv;
  1119. mq->LastRecv = mg_millis();
  1120. if(CurrIntv > mq->MaxIntv){
  1121. mq->MaxIntv = CurrIntv;
  1122. }
  1123. mq->TotalIntv += CurrIntv;
  1124. mq->AvgIntv = mq->TotalIntv/mq->TotalRecv;
  1125. }
  1126. ok = mg_json_get_num(json,"$.m1_com_ap", &dval);
  1127. if( ok ){
  1128. // cm->com_active_p = dval;
  1129. // cm->LastUpdate = mg_millis();
  1130. // strcpy(cm->szLastUpdate, appl_get_datetime_long());
  1131. //syslog(LOG_INFO,"%s, Get Gate M1 Data", __func__);
  1132. }
  1133. ok = mg_json_get_num(json,"$.m2_com_ap", &dval);
  1134. if( ok ){
  1135. // pm->com_active_p = dval;
  1136. // pm->LastUpdate = mg_millis();
  1137. // strcpy(pm->szLastUpdate, appl_get_datetime_long());
  1138. //syslog(LOG_INFO,"%s, Get Gate M2 Data", __func__);
  1139. }
  1140. ok = mg_json_get_num(json,"$.m3_com_ap", &dval);
  1141. if( ok ){
  1142. // tm->com_active_p = dval;
  1143. // tm->LastUpdate = mg_millis();
  1144. // strcpy(tm->szLastUpdate, appl_get_datetime_long());
  1145. //syslog(LOG_INFO,"%s, Get Gate M2 Data", __func__);
  1146. }
  1147. ok = mg_json_get_num(json,"$.m4_com_ap", &dval);
  1148. if( ok ){
  1149. //gm->com_active_p = dval;
  1150. //gm->LastUpdate = mg_millis();
  1151. //strcpy(gm->szLastUpdate, appl_get_datetime_long());
  1152. //syslog(LOG_INFO,"%s, Get Gate M2 Data", __func__);
  1153. }
  1154. }
  1155. }
  1156. static void mqtt4_connect( void ){
  1157. int rc;
  1158. struct chanmqtt_t* m = &APPL.chanmqtt[4];
  1159. MQTTClient_deliveryToken token;
  1160. MQTTClient_connectOptions conn_opts;
  1161. MQTTClient cli;
  1162. MQTTClient_connectOptions tmpconn_opts = MQTTClient_connectOptions_initializer5;
  1163. conn_opts = tmpconn_opts;
  1164. MQTTClient_createOptions createOpts = MQTTClient_createOptions_initializer;
  1165. createOpts.MQTTVersion = MQTTVERSION_5;
  1166. if ((rc = MQTTClient_createWithOptions(&cli, m->szs_url, m->szclientid, MQTTCLIENT_PERSISTENCE_NONE, NULL, &createOpts)) != MQTTCLIENT_SUCCESS){
  1167. syslog(LOG_INFO,"%s, MQTTClient_createWithOptions fail, rc:%d msg:%s %s %s", __func__, rc, MQTTClient_strerror(rc));
  1168. }
  1169. conn_opts.keepAliveInterval = 8;
  1170. conn_opts.cleansession = 0;
  1171. conn_opts.username = m->szusrname;
  1172. conn_opts.password = m->szpasswd;
  1173. MQTTProperties props = MQTTProperties_initializer;
  1174. MQTTProperties willProps = MQTTProperties_initializer;
  1175. MQTTResponse response = MQTTResponse_initializer;
  1176. MQTTClient_setCallbacks(cli, NULL, fn_mqtt4_connlost, fn_mqtt4_msgarrvd, NULL);
  1177. response = MQTTClient_connect5(cli, &conn_opts, &props, &willProps);
  1178. if (response.reasonCode != MQTTCLIENT_SUCCESS){
  1179. syslog(LOG_INFO,"%s, MQTTClient_connect fail, rc:%d msg:%s", __func__, response.reasonCode, MQTTClient_strerror(response.reasonCode));
  1180. mqtt4_connlost = 1;
  1181. }else{
  1182. syslog(LOG_INFO,"%s, Connect Ok",__func__);
  1183. mqtt4_connlost = 0;
  1184. response = MQTTClient_subscribe5(cli, m->szs_sub_topic[0], m->s_qos, NULL, NULL);
  1185. if (response.reasonCode != MQTTCLIENT_SUCCESS && response.reasonCode != m->s_qos){
  1186. syslog(LOG_INFO,"%s, MQTTClient_subscribe fail, rc: %d msg: %s", __func__, response.reasonCode, MQTTClient_strerror(response.reasonCode));
  1187. }
  1188. }
  1189. MQTTResponse_free(response);
  1190. }
  1191. static void* thrd_mqtt4(void* param){
  1192. int ReconnChk = 0;
  1193. syslog(LOG_INFO,"%s, ++",__func__);
  1194. mqtt4_connect();
  1195. while(1){
  1196. if(++ReconnChk > 10){
  1197. ReconnChk = 0;
  1198. if(mqtt4_connlost == 1){
  1199. mqtt4_connect();
  1200. }
  1201. }
  1202. sleep(1);
  1203. }
  1204. syslog(LOG_INFO,"%s, --",__func__);
  1205. }
  1206. void appl_snap_set_err( void )
  1207. {
  1208. APPL.Snap.bErr = 1;
  1209. strcpy(APPL.Snap.szState,"故障");
  1210. }
  1211. void appl_snap_reset_err( void )
  1212. {
  1213. APPL.Snap.bErr = 0;
  1214. strcpy(APPL.Snap.szState,"正常");
  1215. }
  1216. static int appl_snap_day_diff(int year_start, int month_start, int day_start, int year_end, int month_end, int day_end){
  1217. int y2, m2, d2;
  1218. int y1, m1, d1;
  1219. m1 = (month_start + 9) % 12;
  1220. y1 = year_start - m1 / 10;
  1221. d1 = 365 * y1 + y1 / 4 - y1 / 100 + y1 / 400 + (m1 * 306 + 5) / 10 + (day_start - 1);
  1222. m2 = (month_end + 9) % 12;
  1223. y2 = year_end - m2 / 10;
  1224. d2 = 365 * y2 + y2 / 4 - y2 / 100 + y2 / 400 + (m2 * 306 + 5) / 10 + (day_end - 1);
  1225. return (d2 - d1);
  1226. }
  1227. int appl_snap_rmdir(const char *path) {
  1228. DIR *d = opendir(path);
  1229. size_t path_len = strlen(path);
  1230. int r = -1;
  1231. if (d) {
  1232. struct dirent *p;
  1233. r = 0;
  1234. while (!r && (p=readdir(d))) {
  1235. int r2 = -1;
  1236. char *buf;
  1237. size_t len;
  1238. /* Skip the names "." and ".." as we don't want to recurse on them. */
  1239. if (!strcmp(p->d_name, ".") || !strcmp(p->d_name, ".."))
  1240. continue;
  1241. len = path_len + strlen(p->d_name) + 2;
  1242. buf = malloc(len);
  1243. if (buf) {
  1244. struct stat statbuf;
  1245. snprintf(buf, len, "%s/%s", path, p->d_name);
  1246. if (!stat(buf, &statbuf)) {
  1247. if (S_ISDIR(statbuf.st_mode))
  1248. r2 = appl_snap_rmdir(buf);
  1249. else
  1250. r2 = unlink(buf);
  1251. }
  1252. free(buf);
  1253. }
  1254. r = r2;
  1255. }
  1256. closedir(d);
  1257. }
  1258. if (!r)
  1259. r = rmdir(path);
  1260. return r;
  1261. }
  1262. static void* thrd_snap(void* param){
  1263. struct Snap_t* s = &APPL.Snap;
  1264. struct Dtsd1352_t* me = NULL;
  1265. char buf[128];
  1266. char szfn[128];
  1267. int y, m, d, h, min, ss; // current
  1268. int yy, mm, dd;//dir
  1269. int diff_day;
  1270. int rc;
  1271. DIR* dir;
  1272. struct dirent *ptr;
  1273. char szyy[8];
  1274. char szmm[8];
  1275. char szdd[8];
  1276. int i;
  1277. sleep(5);
  1278. syslog(LOG_INFO, "%s, ++",__func__);
  1279. while(1){
  1280. usleep(300000);
  1281. if(s->bErr){
  1282. continue;
  1283. }
  1284. if (s->bStart == 0){
  1285. appl_get_datetime_num(&y, &m, &d, &h, &min, &ss);
  1286. sprintf(s->szcurrDatePath, "./snap/%04d-%02d-%02d", y, m, d);
  1287. if( access(s->szcurrDatePath, NULL) !=0 ){ // directory does not exists
  1288. //syslog(LOG_INFO,"%s, DatePath:%s does not exist",__func__, s->szcurrDatePath);
  1289. if(mkdir(s->szcurrDatePath, 0755) < 0){
  1290. s->bErr = 1;
  1291. //syslog(LOG_INFO,"%s, mkdir fail",__func__);
  1292. continue;
  1293. }
  1294. }
  1295. // Meter Snap Start
  1296. for( i = 1; i <= 5; i++ ){
  1297. sprintf(szfn, "%s/M%d_%04d-%02d-%02d %02d-%02d-%02d.csv",s->szcurrDatePath, i, y, m, d, h, min, ss);
  1298. s->f[i] = fopen(szfn, "w+");
  1299. if (s->f[i] == NULL){
  1300. s->bErr = 1;
  1301. continue;
  1302. }else{
  1303. rc = fprintf(s->f[i],"ts,com_ap,pos_adem,neg_adem,com_ae,pos_ae,neg_ae,pf,pt,ct,ua,ub,uc,ia,ib,ic,freq,CommState\n");
  1304. if(rc < 0){
  1305. s->bErr = 1;
  1306. continue;
  1307. }
  1308. }
  1309. }
  1310. s->LastSnap = 0;
  1311. s->bStart = 1;
  1312. }else{
  1313. if (mg_millis() - s->LastSnap > 5000){ /* snap every 5 seconds */
  1314. s->LastSnap = mg_millis();
  1315. appl_get_datetime_num(&y, &m, &d, &h, &min, &ss);
  1316. sprintf(buf, "./snap/%04d-%02d-%02d", y, m, d);
  1317. if (strcmp(buf, s->szcurrDatePath) != 0){ /* new date */
  1318. //syslog(LOG_INFO,"%s, New Date Detected : %s", __func__, buf);
  1319. if(s->fpcs != NULL){
  1320. fclose(s->fpcs);
  1321. s->fpcs = NULL;
  1322. }
  1323. // del outofdate dir
  1324. if ((dir = opendir("./snap")) == NULL){
  1325. s->bErr = 1;
  1326. continue;
  1327. }else{
  1328. while ((ptr = readdir(dir)) != NULL){
  1329. if (strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0){ /// current dir OR parrent dir
  1330. continue;
  1331. }else if (ptr->d_type == 8){ /// file
  1332. }
  1333. else if (ptr->d_type == 10){ /// link file
  1334. // printf("d_name:%s/%s\n",basePath,ptr->d_name);
  1335. }else if (ptr->d_type == 4){ /// dir
  1336. if(strlen(ptr->d_name) == 10 && ptr->d_name[4] == '-' && ptr->d_name[7] == '-'){ // target dir
  1337. //syslog(LOG_INFO,"%s, Target Dir:%s Detedted", __func__, ptr->d_name);
  1338. strncpy(szyy, ptr->d_name, 4);
  1339. strncpy(szmm, ptr->d_name + 5, 2);
  1340. strncpy(szdd, ptr->d_name + 8, 2);
  1341. yy = atoi(szyy);
  1342. mm = atoi(szmm);
  1343. dd = atoi(szdd);
  1344. diff_day = appl_snap_day_diff(yy, mm, dd, y, m, d);
  1345. if (diff_day > s->KeepDay){
  1346. sprintf(buf, "./snap/%s",ptr->d_name);
  1347. rc = appl_snap_rmdir(buf);
  1348. if( rc < 0 ){
  1349. syslog(LOG_INFO,"%s, Target Dir:%s Del Fail", __func__, ptr->d_name);
  1350. s->bErr = 1;
  1351. continue;
  1352. }else{
  1353. syslog(LOG_INFO,"%s, Target Dir:%s Del Ok", __func__, ptr->d_name);
  1354. }
  1355. }
  1356. }
  1357. }
  1358. }
  1359. closedir(dir);
  1360. }
  1361. s->bStart = 0; /* start again at next loop */
  1362. continue;
  1363. }else{
  1364. s->LastSnap = mg_millis();
  1365. strcpy(buf, appl_get_datetime_short());
  1366. // Meter Snap
  1367. for( i = 1; i <= 6; i++){
  1368. me = &APPL.Dtsd1352[i];
  1369. if(s->f[i] != NULL && me->CommState == ST_COMM_NORM){
  1370. fprintf(s->f[i],"\
  1371. %s,%.1f,%.1f,%.1f,\
  1372. %.1f,%.1f,%.1f,\
  1373. %.3f,%d,%d,\
  1374. %.1f,%.1f,%.1f,\
  1375. %.1f,%.1f,%.1f,\
  1376. %.1f,%.d\n",
  1377. /*1*/buf, me->com_active_p,me->pos_active_dem,me->neg_active_dem,
  1378. /*2*/me->com_active_e,me->pos_active_e,me->neg_active_e,
  1379. /*3*/me->pwr_factor, me->PT, me->CT,
  1380. /*4*/me->ua, me->ub, me->uc,
  1381. /*5*/me->ia, me->ib, me->ic,
  1382. /*6*/me->freq, me->CommState);
  1383. fflush(s->f[i]);
  1384. }
  1385. }
  1386. }
  1387. }
  1388. }
  1389. }
  1390. syslog(LOG_INFO, "%s, --",__func__);
  1391. }
  1392. void appl_start( void )
  1393. {
  1394. struct Settings_t* set = &APPL.Set.s;
  1395. struct chan485_t* ch = NULL;
  1396. struct chanmqtt_t* m = NULL;
  1397. struct Snap_t* snap = &APPL.Snap;
  1398. char buf[128];
  1399. char buf2[128];
  1400. int len;
  1401. int i;
  1402. pthread_t hthrd_485_1;
  1403. pthread_t hthrd_485_2;
  1404. pthread_t hthrd_485_3;
  1405. pthread_t hthrd_485_4;
  1406. pthread_t hthrd_can_1;
  1407. pthread_t hthrd_can_2;
  1408. pthread_t hthrd_dido;
  1409. pthread_t hthrd_ctl;
  1410. pthread_t hthrd_mqtt1;
  1411. pthread_t hthrd_mqtt2;
  1412. pthread_t hthrd_mqtt3;
  1413. pthread_t hthrd_mqtt4;
  1414. pthread_t hthrd_snap;
  1415. appl_485_set_485mode();
  1416. // Set
  1417. if(appl_cfg_read() != 0){
  1418. appl_cfg_set_err();
  1419. syslog(LOG_INFO,"%s, appl_cfg_read fail", __func__);
  1420. // Set Default
  1421. strcpy(set->szCloudUrl,"119.45.116.112:18883");
  1422. set->DataKeepDay = 700;
  1423. set->UploadHighSpeed = 1500;
  1424. set->UploadMediumSpeed = 60000;
  1425. set->UploadSlowSpeed = 180000;
  1426. // Load Default
  1427. snap->KeepDay = 30;
  1428. }else{
  1429. appl_cfg_reset_err();
  1430. // //1# MQTT thingsboard
  1431. // m = &APPL.chanmqtt[1];
  1432. // m->s_conn = NULL;
  1433. // strcpy(m->szs_url,"124.222.45.156:1883");
  1434. // strcpy(m->szs_pub_topic,"v1/devices/me/telemetry");
  1435. // strcpy(m->szs_sub_topic,"v1/devices/me/ctl");
  1436. // m->s_qos = 1;
  1437. // //测试设备
  1438. // //strcpy(m->szusrname,"gFCNk8oSxC6VlYXkhs3a");
  1439. // strcpy(m->szusrname,"DZHbY2HAGeATfRCfhlW7");
  1440. // m->bConnected = 0;
  1441. //2# MQTT Cloud
  1442. m = &APPL.chanmqtt[2];
  1443. m->s_conn = NULL;
  1444. strncpy(m->szs_url, set->szCloudUrl, sizeof(m->szs_url)-1);
  1445. strncpy(m->szusrname,set->szCloudUserName, sizeof(m->szusrname) - 1);
  1446. strncpy(m->szpasswd,set->szCloudPasswd, sizeof(m->szpasswd) - 1);
  1447. strncpy(m->szclientid,set->szClientId, sizeof(m->szclientid) - 1);
  1448. sprintf(m->szs_pub_topic[1],"sequential/%s/CtnMeter1",m->szusrname);
  1449. sprintf(m->szs_pub_topic[2],"sequential/%s/CtnMeter2",m->szusrname);
  1450. sprintf(m->szs_pub_topic[3],"sequential/%s/CtnMeter3",m->szusrname);
  1451. sprintf(m->szs_pub_topic[4],"sequential/%s/CtnMeter4",m->szusrname);
  1452. sprintf(m->szs_pub_topic[5],"sequential/%s/CtnMeter5",m->szusrname);
  1453. strcpy(m->szs_sub_topic,"control");
  1454. m->s_qos = 1;
  1455. m->bConnected = 0;
  1456. pthread_create(&hthrd_mqtt2, NULL, thrd_mqtt_2, NULL);
  1457. }
  1458. APPL.Dtsd1352[1].Adr = 1; // 1#储能电表
  1459. APPL.Dtsd1352[2].Adr = 2; // 2#储能电表
  1460. APPL.Dtsd1352[3].Adr = 3; // 3#储能电表
  1461. APPL.Dtsd1352[4].Adr = 4; // 4#储能电表
  1462. APPL.Dtsd1352[5].Adr = 5; // 5#储能电表
  1463. // CHAN 485 1
  1464. ch = &APPL.chan485[1];
  1465. strcpy(ch->szdev, "/dev/ttymxc1");
  1466. ch->baud = 9600;
  1467. ch->parity = 'N';
  1468. strcpy(ch->szinfo, "未使用");
  1469. // CHAN 485 2
  1470. ch = &APPL.chan485[2];
  1471. strcpy(ch->szdev, "/dev/ttymxc2");
  1472. ch->baud = 9600;
  1473. ch->parity = 'N';
  1474. strcpy(ch->szinfo, "1#~5#储能电表");
  1475. // CHAN 485 3
  1476. ch = &APPL.chan485[3];
  1477. strcpy(ch->szdev, "/dev/ttymxc3");
  1478. ch->baud = 9600;
  1479. ch->parity = 'N';
  1480. strcpy(ch->szinfo, "未使用");
  1481. // CHAN 485 4
  1482. ch = &APPL.chan485[4];
  1483. strcpy(ch->szdev, "/dev/ttymxc5");
  1484. ch->baud = 9600;
  1485. ch->parity = 'N';
  1486. strcpy(ch->szinfo, "未使用");
  1487. pthread_create(&hthrd_485_1, NULL, thrd_485_1, NULL);
  1488. pthread_create(&hthrd_485_2, NULL, thrd_485_2, NULL);
  1489. pthread_create(&hthrd_485_3, NULL, thrd_485_3, NULL);
  1490. pthread_create(&hthrd_485_4, NULL, thrd_485_4, NULL);
  1491. // Snap
  1492. appl_snap_reset_err();
  1493. snap->bStart = 0;
  1494. snap->KeepDay = set->DataKeepDay;
  1495. pthread_create(&hthrd_snap, NULL, thrd_snap, NULL);
  1496. }