appl.c 55 KB

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