gateway_collect.c 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627
  1. #include "gateway_collect.h"
  2. #include "../../User/includes.h"
  3. #include "../network_mgr/net_ctrl.h"
  4. #include "../dev_mgr/taxctrl/tax_ctrl.h"
  5. #include "../tax/tax.h"
  6. #include "../network/uplink.h"
  7. #include "../storage/AT24C128Opt.h"
  8. #include "../network/downlink.h"
  9. #include "../network_mgr/net_proc.h"
  10. #include "me3616.h"
  11. #include "../encode/encodeOpt.h"
  12. #include "../network_mgr/net_ctrl.h"
  13. #include "../network_mgr/sx1268/lora.h"
  14. extern ME3616 air;
  15. //void * lora_queue_mem_calloc_must(void);
  16. //int lora_queue_mem_free(void * p_msg);
  17. //void lora_queue_insert(char *p_msg, uint32_t msg_len);
  18. uint64_t g_checkDa[16][2][8] = {0};
  19. static uint32_t _seq_num[16] ={ 0};
  20. uint8_t log_buff[256] = {0};
  21. /*------------------------------------------------------------------
  22. * 网关向采集器下发数据 0x57指令
  23. * 参数:data:发送的数据
  24. * len: 发送的数据长度
  25. * tax:报税口编号
  26. * uart: 串口号
  27. * gun: 枪号
  28. * porttype:协议类型 1:明文 2:密文
  29. * seq: 流水号
  30. * id: 设备SN
  31. *------------------------------------------------------------------*/
  32. //void gateway_collect_cmd_set(uint8_t *data, uint8_t len, uint8_t uart, uint8_t prottype,uint32_t seq,uint32_t id,uint8_t gun)
  33. void gateway_collect_cmd_set(uint8_t *data, uint8_t len,uint8_t coll_index, uint8_t tax, uint8_t uart, uint8_t gun, uint8_t prottype,uint32_t seq,uint32_t id)
  34. {
  35. char *msg = NULL;
  36. uint8_t send_buf[128],send_size;
  37. uint16_t crc = 0;
  38. gateway_collect_com_t *p_msg;
  39. p_msg = (gateway_collect_com_t *)send_buf;
  40. memset(send_buf,0,sizeof(send_buf));
  41. p_msg->frame_header = 0xfefe;// 帧头
  42. p_msg->proto_ver = GATE_COLL_PROTOTYPE;
  43. p_msg->seq_no = seq;
  44. p_msg->type = GATE_COLL_TAX_QUERY;
  45. p_msg->secondType = 0;
  46. p_msg->len = len + GATE_COLL_CMD5767_LEN +2;
  47. p_msg->taxinfo.data.device_sn = id;
  48. p_msg->taxinfo.data.device_type = 0x0201; // 0x01为报税器
  49. p_msg->taxinfo.data.coll_no = coll_index;
  50. p_msg->taxinfo.data.tax_no = tax;
  51. p_msg->taxinfo.data.gun_msgid = gun;
  52. p_msg->taxinfo.data.prot_type = prottype;
  53. p_msg->taxinfo.data.status = 0x00;
  54. p_msg->taxinfo.data.dataLen = len;
  55. memcpy(p_msg->taxinfo.data.info, data, len);
  56. send_size = len + GATE_COLL_HEAD_LEN + GATE_COLL_CMD5767_LEN;
  57. crc = _crc16_get((uint8_t *)p_msg,send_size);
  58. p_msg->taxinfo.data.info[len] = crc&0xff;
  59. p_msg->taxinfo.data.info[len+1] = (crc>>8)&0xff;
  60. msg = (char *)lora_queue_mem_calloc_must();
  61. if(msg) {
  62. memcpy(msg, send_buf, send_size+2);
  63. lora_queue_insert((char *)msg, send_size+2);
  64. }
  65. else
  66. {
  67. lora_queue_mem_free(p_msg);
  68. }
  69. up_send_log_srcdata(send_buf,send_size+2);
  70. }
  71. /*--------------------------------------------------------------------------------
  72. * 网关向采集器发送 0x56指令
  73. * cmd :0x56指令
  74. * 0x56: 心跳指令
  75. * ------------------------------------------------------------------------------*/
  76. void gateway_collect_set_cmd0x56(uint8_t cmd,uint8_t curCollIndex,int8_t pIndex,uint32_t device_sn)
  77. {
  78. char *msg = NULL;
  79. //static uint32_t seq_num[16] ={ 0};
  80. uint8_t send_buf[128],send_size,_index = 0;
  81. uint16_t crc = 0;
  82. gateway_collect_com_t *p_msg;
  83. p_msg = (gateway_collect_com_t *)send_buf;
  84. memset(send_buf,0,sizeof(send_buf));
  85. p_msg->frame_header = 0xfefe;// 帧头
  86. if(curCollIndex>0) _index = curCollIndex-1;
  87. if(_seq_num[_index]>=0xFFFFFFFF) _seq_num[_index] = 0;
  88. p_msg->seq_no = _seq_num[_index]++;
  89. p_msg->proto_ver = GATE_COLL_PROTOTYPE;
  90. p_msg->secondType = 0;
  91. p_msg->type = GATE_COLL_HEART_QUERY;
  92. p_msg->len = GATE_COLL_CMD56_LEN + 2;
  93. send_size = GATE_COLL_HEAD_LEN + GATE_COLL_CMD56_LEN;
  94. p_msg->taxinfo.comdata.device_sn = device_sn;
  95. p_msg->taxinfo.comdata.coll_no = curCollIndex;
  96. p_msg->taxinfo.coll56da.devSn = device_sn;
  97. p_msg->taxinfo.coll56da.collIndex = curCollIndex;
  98. p_msg->taxinfo.coll56da.pIndex = pIndex;
  99. p_msg->taxinfo.coll56da.reserve1 = 0x00;
  100. p_msg->taxinfo.coll56da.reserve2 = 0x00;
  101. crc = _crc16_get((uint8_t *)p_msg,send_size);
  102. p_msg->taxinfo.coll56da.info[0] = crc&0xff;
  103. p_msg->taxinfo.coll56da.info[1] = (crc>>8)&0xff;
  104. msg = (char *)lora_queue_mem_calloc_must();
  105. if(msg) {
  106. memcpy(msg, send_buf, send_size+2);
  107. lora_queue_insert((char *)msg, send_size+2);
  108. }
  109. else
  110. {
  111. lora_queue_mem_free(p_msg);
  112. }
  113. up_send_log_srcdata(send_buf,send_size+2);
  114. }
  115. /*--------------------------------------------------------------------------------
  116. * 网关向采集器发送 0x58指令
  117. * cmd :0x58指令
  118. * 0x58: 固件信息上传指令
  119. * ------------------------------------------------------------------------------*/
  120. void gateway_collect_set_cmd0x58(uint8_t cmd,uint8_t curCollIndex,uint32_t device_sn)
  121. {
  122. char *msg = NULL;
  123. //static uint32_t seq_num[16] ={ 0};
  124. uint8_t send_buf[128],send_size,_index = 0;
  125. uint16_t crc = 0;
  126. gateway_collect_com_t *p_msg = NULL;
  127. p_msg = (gateway_collect_com_t *)send_buf;
  128. memset(send_buf,0,sizeof(send_buf));
  129. p_msg->frame_header = 0xfefe;// 帧头
  130. if(curCollIndex>0) _index = curCollIndex-1;
  131. if(_seq_num[_index]>=0xFFFFFFFF) _seq_num[_index] = 0;
  132. p_msg->seq_no = _seq_num[_index]++;
  133. p_msg->proto_ver = GATE_COLL_PROTOTYPE;
  134. p_msg->secondType = 0;
  135. p_msg->type = GATE_COLL_FIRMMSG_QUERY;
  136. p_msg->len = GATE_COLL_CMD58_LEN + 2;
  137. send_size = GATE_COLL_HEAD_LEN + GATE_COLL_CMD58_LEN;
  138. p_msg->taxinfo.comdata.device_sn = device_sn;
  139. p_msg->taxinfo.comdata.coll_no = curCollIndex;
  140. crc = _crc16_get((uint8_t *)p_msg,send_size);
  141. p_msg->taxinfo.comdata.info[0] = crc&0xff;
  142. p_msg->taxinfo.comdata.info[1] = (crc>>8)&0xff;
  143. msg = (char *)lora_queue_mem_calloc_must();
  144. if(msg) {
  145. memcpy(msg, send_buf, send_size+2);
  146. lora_queue_insert((char *)msg, send_size+2);
  147. }
  148. else
  149. {
  150. lora_queue_mem_free(p_msg);
  151. }
  152. if(cmd==0x56)
  153. up_send_log_srcdata(send_buf,send_size+2);
  154. }
  155. /*--------------------------------------------------------------------------------
  156. * 网关向采集器发送 0x59
  157. * cmd :0x59 指令
  158. * 通知采集器设备重新启动
  159. * ------------------------------------------------------------------------------*/
  160. void gateway_collect_set_cmd0x59(uint8_t curCollIndex,uint32_t device_sn)
  161. {
  162. char *msg = NULL;
  163. //static uint32_t seq_num[16] ={ 0};
  164. uint8_t send_buf[128],send_size,_index=0;
  165. uint16_t crc = 0;
  166. gateway_collect_com_t *p_msg;
  167. p_msg = (gateway_collect_com_t *)send_buf;
  168. memset(send_buf,0,sizeof(send_buf));
  169. p_msg->frame_header = 0xfefe;// 帧头
  170. if(curCollIndex>0) _index = curCollIndex-1;
  171. if(_seq_num[_index]>=0xFFFFFFFF) _seq_num[_index] = 0;
  172. p_msg->seq_no = _seq_num[_index]++;
  173. p_msg->proto_ver = GATE_COLL_PROTOTYPE;
  174. p_msg->secondType = 0;
  175. p_msg->type = COLL_GATE_RESTART_QUERY;
  176. p_msg->len = GATE_COLL_CMD59_LEN + 2;
  177. send_size = GATE_COLL_HEAD_LEN + GATE_COLL_CMD59_LEN;
  178. p_msg->taxinfo.comdata.device_sn = device_sn;
  179. p_msg->taxinfo.comdata.coll_no = curCollIndex;
  180. crc = _crc16_get((uint8_t *)p_msg,send_size);
  181. p_msg->taxinfo.comdata.info[0] = crc&0xff;
  182. p_msg->taxinfo.comdata.info[1] = (crc>>8)&0xff;
  183. msg = (char *)lora_queue_mem_calloc_must();
  184. if(msg) {
  185. memcpy(msg, send_buf, send_size+2);
  186. lora_queue_insert((char *)msg, send_size+2);
  187. }
  188. else
  189. {
  190. lora_queue_mem_free(p_msg);
  191. }
  192. }
  193. /*--------------------------------------------------------------------------------
  194. * 网关向采集器发送 0x5D
  195. * cmd :0x5D 指令
  196. * 通知采集器设备重新启动
  197. * ------------------------------------------------------------------------------*/
  198. void gateway_collect_set_cmd0x5D(uint8_t curCollIndex,uint32_t device_sn,uint16_t targettype,uint8_t cmd)
  199. {
  200. char *msg = NULL;
  201. //static uint32_t seq_num[16] ={ 0};
  202. uint8_t send_buf[128],send_size,_index =0;
  203. uint16_t crc = 0;
  204. gateway_collect_com_t *p_msg;
  205. p_msg = (gateway_collect_com_t *)send_buf;
  206. memset(send_buf,0,sizeof(send_buf));
  207. p_msg->frame_header = 0xfefe;// 帧头
  208. if(curCollIndex>0) _index = curCollIndex-1;
  209. if(_seq_num[_index]>=0xFFFFFFFF) _seq_num[_index] = 0;
  210. p_msg->seq_no = _seq_num[_index]++;
  211. p_msg->proto_ver = GATE_COLL_PROTOTYPE;
  212. p_msg->secondType = 0;
  213. p_msg->type = COLL_GATE_RESTART_5D;
  214. p_msg->len = GATE_COLL_CMD5D_LEN + 2;
  215. send_size = GATE_COLL_HEAD_LEN + GATE_COLL_CMD5D_LEN;
  216. p_msg->taxinfo.da5D.device_sn = device_sn;
  217. p_msg->taxinfo.da5D.coll_no = curCollIndex;
  218. p_msg->taxinfo.da5D.targettype = targettype;
  219. p_msg->taxinfo.da5D.cmd = cmd;
  220. p_msg->taxinfo.da5D.reserve = 0;
  221. crc = _crc16_get((uint8_t *)p_msg,send_size);
  222. p_msg->taxinfo.da5D.info[0] = crc&0xff;
  223. p_msg->taxinfo.da5D.info[1] = (crc>>8)&0xff;
  224. msg = (char *)lora_queue_mem_calloc_must();
  225. if(msg) {
  226. memcpy(msg, send_buf, send_size+2);
  227. lora_queue_insert((char *)msg, send_size+2);
  228. }
  229. else
  230. {
  231. lora_queue_mem_free(p_msg);
  232. }
  233. }
  234. /*--------------------------------------------------------------------------------
  235. * 网关向采集器发送 0x5B
  236. * cmd :0x5B 指令
  237. * 通知采集器设备切换信道
  238. * ------------------------------------------------------------------------------*/
  239. void gateway_collect_set_cmd0x5B(uint8_t curCollIndex,uint32_t device_sn,uint8_t index,uint8_t bpaEnable)
  240. {
  241. char *msg = NULL;
  242. //static uint32_t seq_num[16] ={ 0};
  243. uint8_t send_buf[128],send_size,_index=0;
  244. uint16_t crc = 0;
  245. gateway_collect_com_t *p_msg;
  246. p_msg = (gateway_collect_com_t *)send_buf;
  247. memset(send_buf,0,sizeof(send_buf));
  248. p_msg->frame_header = 0xfefe;// 帧头
  249. if(curCollIndex>0) _index = curCollIndex -1;
  250. if(_seq_num[_index]>=0xFFFFFFFF) _seq_num[_index] = 0;
  251. p_msg->seq_no = _seq_num[_index]++;
  252. p_msg->proto_ver = GATE_COLL_PROTOTYPE;
  253. p_msg->secondType = 0;
  254. p_msg->type = COLL_GATE_CHANGE_LORAPA;
  255. p_msg->len = GATE_COLL_CMD5B_LEN + 2;
  256. send_size = GATE_COLL_HEAD_LEN + GATE_COLL_CMD5B_LEN;
  257. p_msg->taxinfo.taxLora.device_sn = device_sn;
  258. p_msg->taxinfo.taxLora.coll_no = curCollIndex;
  259. p_msg->taxinfo.taxLora.paEnable = bpaEnable;
  260. p_msg->taxinfo.taxLora.loraPaindex = index;
  261. p_msg->taxinfo.taxLora.freq = 0;
  262. p_msg->taxinfo.taxLora.power = 0;
  263. p_msg->taxinfo.taxLora.bandwidth = 0;
  264. p_msg->taxinfo.taxLora.spreadingfactor = 0;
  265. p_msg->taxinfo.taxLora.codingrate = 0;
  266. p_msg->taxinfo.taxLora.preambleLen = 0;
  267. crc = _crc16_get((uint8_t *)p_msg,send_size);
  268. p_msg->taxinfo.taxLora.info[0] = crc&0xff;
  269. p_msg->taxinfo.taxLora.info[1] = (crc>>8)&0xff;
  270. msg = (char *)lora_queue_mem_calloc_must();
  271. if(msg) {
  272. memcpy(msg, send_buf, send_size+2);
  273. lora_queue_insert((char *)msg, send_size+2);
  274. }
  275. else
  276. {
  277. lora_queue_mem_free(p_msg);
  278. }
  279. }
  280. /*------------------------------------------------------------------
  281. * 网关向采集器下发数据 0x5C指令
  282. * 参数:data:发送的数据
  283. * len: 发送的数据长度
  284. * tax:报税口编号
  285. * gun: 枪号
  286. * seq: 流水号
  287. * id: 设备SN
  288. *------------------------------------------------------------------*/
  289. void gateway_collect_set_cmd0x5C(uint8_t *data, uint8_t len,uint8_t coll_index, uint8_t tax, uint8_t gun,uint32_t seq,uint32_t id)
  290. {
  291. char *msg = NULL;
  292. uint8_t send_buf[128],send_size;
  293. uint16_t crc = 0;
  294. gateway_collect_com_t *p_msg;
  295. p_msg = (gateway_collect_com_t *)send_buf;
  296. memset(send_buf,0,sizeof(send_buf));
  297. p_msg->frame_header = 0xfefe;// 帧头
  298. p_msg->proto_ver = GATE_COLL_PROTOTYPE;
  299. p_msg->seq_no = seq;
  300. p_msg->type = GATE_COLL_ENCODER_QUERY;
  301. p_msg->secondType = 0;
  302. p_msg->len = len + GATE_COLL_CMD5C_LEN +2;
  303. p_msg->taxinfo.encoderda.device_sn = id;
  304. p_msg->taxinfo.encoderda.device_type = 0x0501; // 0x0501为编码器数据
  305. p_msg->taxinfo.encoderda.coll_no = coll_index;
  306. p_msg->taxinfo.encoderda.tax_no = tax;
  307. p_msg->taxinfo.encoderda.gun_msgid = gun;
  308. p_msg->taxinfo.encoderda.prot_type = 0;
  309. p_msg->taxinfo.encoderda.status = 0x00;
  310. p_msg->taxinfo.encoderda.dataLen = len;
  311. memcpy(p_msg->taxinfo.data.info, data, len);
  312. send_size = len + GATE_COLL_HEAD_LEN + GATE_COLL_CMD5C_LEN;
  313. crc = _crc16_get((uint8_t *)p_msg,send_size);
  314. p_msg->taxinfo.data.info[len] = crc&0xff;
  315. p_msg->taxinfo.data.info[len+1] = (crc>>8)&0xff;
  316. // data_dump("5C send:", (uint8_t *)send_buf, send_size+2);
  317. msg = (char *)lora_queue_mem_calloc_must();
  318. if(msg) {
  319. memcpy(msg, send_buf, send_size+2);
  320. lora_queue_insert((char *)msg, send_size+2);
  321. }
  322. else
  323. {
  324. lora_queue_mem_free(p_msg);
  325. }
  326. up_send_log_srcdata(send_buf,send_size+2);
  327. }
  328. /*----------------------------------------------------------------------------------
  329. * 透传指令 0x01 --- 0x1052
  330. * ---------------------------------------------------------------------------------*/
  331. void gateway_collect_cmd_0x01_0x1052(uint8_t *data, uint16_t size)
  332. {
  333. char *msg = NULL;
  334. uint8_t send_buf[128];
  335. gateway_collect_com_t *p_msg;
  336. p_msg = (gateway_collect_com_t *)send_buf;
  337. msg = (char *)lora_queue_mem_calloc_must();
  338. if(msg) {
  339. memcpy(msg, data, size);
  340. lora_queue_insert((char *)msg, size);
  341. //data_dump("send 0x01-0x1052:",data,size);
  342. //printf("send 0x01-0x1052:\r\n");
  343. }
  344. else
  345. {
  346. lora_queue_mem_free(p_msg);
  347. }
  348. }
  349. /*----------------------------------------------------------------------------------
  350. * 组成编码器与抬枪信号正反序的数据
  351. * ---------------------------------------------------------------------------------*/
  352. void create_0x01_0x1053(uint8_t *outdata,uint16_t *len,uint16_t rcvType,uint32_t rcvSn,uint16_t targetType,uint16_t targetSn,uint8_t optType, uint8_t cmdType,uint16_t optval)
  353. {
  354. sys1053_2053 *msg = NULL;
  355. uint16_t crc = 0;
  356. uint8_t send_size = 0;
  357. gateway_collect_com_t *p_msg;
  358. p_msg = (gateway_collect_com_t*)outdata;
  359. p_msg->frame_header = 0xfefe;// 帧头
  360. p_msg->proto_ver = GATE_COLL_PROTOTYPE;
  361. p_msg->seq_no = 0;
  362. p_msg->type = 0x01;
  363. p_msg->secondType = 0x1053;
  364. p_msg->len = sizeof(sys1053_2053) +2;
  365. msg = (sys1053_2053*)(outdata+12);
  366. msg->firstLevelType = DEVICE_GATEWAY;
  367. msg->firstLevelSn = downlink_config.gateway_id;
  368. msg->rcvDevType = rcvType;
  369. msg->rcvDevSn = rcvSn;
  370. msg->targetDevType = targetType;
  371. msg->targetDevSn = targetSn;
  372. msg->reserve = 0;
  373. msg->optType = optType;
  374. msg->cmdType = cmdType;
  375. msg->cmdVal = optval;
  376. msg->reserve01 = 0x00;
  377. send_size = sizeof(sys1053_2053);
  378. crc = _crc16_get((uint8_t *)p_msg,send_size+GATE_COLL_HEAD_LEN);
  379. p_msg->taxinfo.info[send_size] = crc&0xff;
  380. p_msg->taxinfo.info[send_size+1] = (crc>>8)&0xff;
  381. *len = GATE_COLL_HEAD_LEN + send_size + 2;
  382. return;
  383. }
  384. /*----------------------------------------------------------------------------------
  385. * 设置编码器与抬枪信号正反序 0x01 --- 0x1053
  386. * type: 0: 需要组数据 1: 服务器下发的,不用组数据,可直接下发
  387. * ---------------------------------------------------------------------------------*/
  388. void gateway_collect_cmd_0x01_0x1053(uint8_t *data, uint16_t size)
  389. {
  390. char *msg = NULL;
  391. uint8_t send_buf[128];
  392. gateway_collect_com_t *p_msg;
  393. memset(send_buf,0,sizeof(send_buf));
  394. p_msg = (gateway_collect_com_t *)send_buf;
  395. msg = (char *)lora_queue_mem_calloc_must();
  396. if(msg) {
  397. memcpy(msg, data, size);
  398. lora_queue_insert((char *)msg, size);
  399. data_dump("send 0x01-0x1053:",data,size);
  400. //printf("send 0x01-0x1052:\r\n");
  401. }
  402. else
  403. {
  404. lora_queue_mem_free(p_msg);
  405. }
  406. }
  407. static uint16_t _crc_get_gw(uint8_t *data, uint8_t size)
  408. {
  409. uint8_t i, crc = 0;
  410. for(i = 0;i < size;i++){
  411. crc ^=data[i];
  412. }
  413. return crc;
  414. }
  415. /*网关向报税口下发的数据协议*/
  416. int tax_cmd_set(uint8_t cmd, uint8_t *parm, uint8_t size, void *puser)
  417. {
  418. int send_len;//ret = -1,
  419. uint8_t send_buf[64], *p_crc, *fparm;//crc,
  420. tTaxCommFrame_t *p_tax_tx = (tTaxCommFrame_t *)send_buf;
  421. memset(send_buf, 0, sizeof(send_buf));
  422. p_crc = &send_buf[sizeof(tTaxCommFrame_t) + size];
  423. p_tax_tx->fhead = 0xbb;
  424. p_tax_tx->flen = 3+size; //长度码为命令码、帧号、参数和校验码的字节数之和
  425. p_tax_tx->findex = 0xff; //帧号标识本帧的特征信息,帧号OFFH表示单帧命令;
  426. p_tax_tx->fcmd = cmd;
  427. fparm = &send_buf[sizeof(tTaxCommFrame_t)];
  428. memcpy(fparm, parm, size);
  429. //caculate crc val;
  430. *p_crc = _crc_get_gw(&p_tax_tx->findex, p_tax_tx->flen-1);//校验码为帧号、命令码和参数逐字节的逻辑和
  431. //send and rcv;
  432. // data_dump("tax send", (uint8_t *)p_tax_tx, p_tax_tx->flen + 2);
  433. // uart_msg_send(uart, (char *)p_tax_tx, p_tax_tx->flen + 2);
  434. send_len = p_tax_tx->flen + 2;
  435. memcpy(puser,p_tax_tx,send_len);
  436. return send_len;
  437. }
  438. /*-----------------------------------------------------------------------------------
  439. * 处理0x8C 指令
  440. * ---------------------------------------------------------------------------------*/
  441. int tax_cmd_set_0x8C(uint8_t cmd,uint8_t *parm, uint8_t size, void *puser)
  442. {
  443. int send_len;
  444. uint8_t send_buf[64], *p_crc, *fparm;
  445. tTaxCommFrame_t *p_tax_tx = (tTaxCommFrame_t*)send_buf;
  446. memset(send_buf,0,sizeof(send_buf));
  447. p_crc = &send_buf[sizeof(tTaxCommFrame_t)+size];
  448. p_tax_tx->fhead = 0xbb;
  449. p_tax_tx->flen = 3 + size;
  450. p_tax_tx->fcmd = cmd;
  451. p_tax_tx->findex = 0xFF;
  452. fparm = &send_buf[sizeof(tTaxCommFrame_t)];
  453. memcpy(fparm, parm, size);
  454. *p_crc = _crc_get_gw(&p_tax_tx->findex, p_tax_tx->flen-1);//校验码为帧号、命令码和参数逐字节的逻辑和
  455. data_dump("tax send", (uint8_t *)p_tax_tx, p_tax_tx->flen + 2);
  456. send_len = p_tax_tx->flen + 2;
  457. memcpy(puser,p_tax_tx,send_len);
  458. return send_len;
  459. }
  460. static uint16_t _crc_get1(uint8_t *data, uint8_t size)
  461. {
  462. uint8_t i, crc = 0;
  463. for(i = 0;i < size;i++){
  464. crc ^=data[i];
  465. }
  466. return crc;
  467. }
  468. extern int tax_0x83_anaylse(void *puser, uint8_t *data, uint8_t data_len);
  469. extern int tax_0x86_anaylse(void *puser, uint8_t *data, uint8_t data_len);
  470. extern int tax_0x89_anaylse(void *puser, uint8_t *data, uint8_t data_len);
  471. //明文接收数据处理
  472. int tax_rcv_analyze(uint8_t *data,void *puser)
  473. {
  474. int ret = 1;//, rcv_size = 0;
  475. uint8_t *p_crc, crc, *fparm;//,hbit = 0;
  476. tTaxCommFrame_t *p_tax_rx;
  477. p_tax_rx = (tTaxCommFrame_t *)data;
  478. crc = _crc_get1(&p_tax_rx->findex, p_tax_rx->flen-1);
  479. p_crc = &data[p_tax_rx->flen + 1];
  480. if((p_tax_rx->fhead == 0xBB)&&(crc == *p_crc)) {
  481. if((p_tax_rx->findex != 0xFF) ){ // 帧号
  482. if((p_tax_rx->findex&0x80) != 0x80) return ret;
  483. }
  484. if(p_tax_rx->flen<8) return ret; // 长度小于8个,为帧格式错误
  485. fparm = &data[sizeof(tTaxCommFrame_t)];
  486. switch(p_tax_rx->fcmd)
  487. {
  488. case 0x83:
  489. tax_0x83_anaylse(puser,fparm,p_tax_rx->flen-3);
  490. ret = 0x83;
  491. return ret;
  492. // break;
  493. case 0x86:
  494. if(data[4] == 0x00) return ret;
  495. tax_0x86_anaylse(puser,fparm,p_tax_rx->flen-3);
  496. ret = 0x86;
  497. return ret;
  498. // break;
  499. case 0x89:
  500. if(data[4] == 0x00) return ret;
  501. tax_0x89_anaylse(puser,fparm,p_tax_rx->flen-3);
  502. ret = 0x89;
  503. return ret;
  504. // break;
  505. }
  506. }
  507. return ret;
  508. }
  509. /////////////////////////////////////////////////////////////////
  510. //密文数据
  511. //extern uint16_t _crc16_get(uint8_t *_buff,uint32_t _len);
  512. extern int _ytsf_data_code(uint8_t *buff, uint8_t *len);
  513. extern int _ytsf_data_decode(uint8_t *buff, uint8_t *len);
  514. //密文发送数据参数部分
  515. int ytsf_cmd_set(uint8_t port, uint8_t cmd, uint8_t *parm, uint8_t size, void * puser)
  516. {/* 帧头(1)+帧长度(1)+帧号(1)+端口号(1)+命令码(1)+参数[n]+CRC校验码[2] */
  517. // int ret = -1;
  518. uint8_t send_buf[128], send_size, *fparm;
  519. uint16_t *p_crc;//, crc;
  520. tYTSFCommFrame_t *p_tax_tx = (tYTSFCommFrame_t *)send_buf;
  521. memset(send_buf, 0, sizeof(send_buf));
  522. p_crc = (uint16_t *)&send_buf[sizeof(tYTSFCommFrame_t) + size];
  523. p_tax_tx->fhead = 0xbb;
  524. p_tax_tx->flen = 5+size; //长度码为命令码、帧号、参数和校验码的字节数之和
  525. p_tax_tx->findex = 0x81; //帧号标识本帧的特征信息,帧号OFFH表示单帧命令;
  526. p_tax_tx->fport = port;
  527. p_tax_tx->fcmd = cmd;
  528. fparm = &send_buf[sizeof(tYTSFCommFrame_t)];
  529. memcpy(fparm, parm, size);
  530. //printf("======================port = %d\r\n",port);
  531. //caculate crc val;
  532. *p_crc = _crc16_get(&p_tax_tx->fhead, p_tax_tx->flen);//校验码为帧号、命令码和参数逐字节的逻辑和
  533. *p_crc = htons(*p_crc);
  534. send_size = p_tax_tx->flen + 2;
  535. _ytsf_data_code(send_buf, &send_size); /* 编码发送 */
  536. memcpy(puser,p_tax_tx,send_size);
  537. return send_size;
  538. }
  539. //密文下发数据
  540. int ytsf_send_cmd(uint8_t cmd, uint8_t info_type, uint8_t node, uint8_t port, uint8_t gun)
  541. {
  542. int ret = -1;
  543. uint8_t para[16] = {0};
  544. uint8_t send_buf[64],send_len,taxType;
  545. int uart=0,gun_num=0,tax = 0;
  546. uint32_t seq_num = 0,id = 0;
  547. seq_num = nodeConf.taxconf[node].port[port].gun[gun].seq_no;
  548. // uart = nodeConf.taxconf[node].port[port].uart;
  549. gun_num = downlink_config.collect_conf[node].tax_conf[port].gunid[gun];
  550. tax = downlink_config.collect_conf[node].tax_conf[port].tax_id;
  551. // id = nodeConf.taxconf[node].device_id;
  552. id = downlink_config.collect_conf[node].collect_no;
  553. taxType = nodeConf.taxconf[node].port[port].taxType;
  554. g_logCfigDa.curportno = tax;
  555. g_logCfigDa.curgunno = gun_num;
  556. switch(cmd)
  557. {
  558. case 0xA1:
  559. if(info_type == 0x11)//读当次加油信息
  560. {
  561. para[0] = 0x11;
  562. para[1] = gun_num-1;
  563. memset(&para[2], 0, 4);
  564. // memcpy(&para[6], gateway_read.collect_read[node].tax_read[port].monitor_serino, 5);
  565. memcpy(&para[6], downlink_config.collect_conf[node].tax_conf[port].monitor_serino, 5);
  566. send_len = ytsf_cmd_set(port,0xA1,para,11,send_buf);
  567. //gateway_collect_cmd_set(send_buf,send_len,uart,CIPHERTEXT,seq_num,id,gun);
  568. gateway_collect_cmd_set(send_buf,send_len,node,tax,uart,gun_num,taxType,seq_num,id);
  569. }
  570. else if(info_type == 0x14)//读总累计
  571. {
  572. para[0] = 0x14;
  573. para[1] = gun_num-1;
  574. memset(&para[2], 0, 4);
  575. //memcpy(&para[6], gateway_read.collect_read[node].tax_read[port].monitor_serino, 5);
  576. memcpy(&para[6], downlink_config.collect_conf[node].tax_conf[port].monitor_serino, 5);
  577. send_len = ytsf_cmd_set(port,0xA1,para,11,send_buf);
  578. //gateway_collect_cmd_set(send_buf,send_len,uart,CIPHERTEXT,seq_num,id,gun);
  579. gateway_collect_cmd_set(send_buf,send_len,node,tax,uart,gun_num,taxType,seq_num,id);
  580. }
  581. break;
  582. case 0xA2:
  583. if(info_type == 0x00) //读监控序列号
  584. {
  585. para[0] = 0;
  586. para[1] = 0;
  587. memset(para+2,0,6);
  588. send_len = ytsf_cmd_set(port,0xA2,para,8,send_buf);
  589. //gateway_collect_cmd_set(send_buf,send_len,uart,CIPHERTEXT,seq_num,id,gun);
  590. gateway_collect_cmd_set(send_buf,send_len,node,tax,uart,gun_num,taxType,seq_num,id);
  591. }
  592. break;
  593. }
  594. return ret;
  595. }
  596. extern int ytsf_0xa2_0x00_anaylse(void *puser, uint8_t *data, uint8_t data_len);
  597. extern int ytsf_0xa1_0x11_anaylse(void *puser, uint8_t *data, uint8_t data_len);
  598. extern int ytsf_0xa1_0x14_anaylse(void *puser, uint8_t *data, uint8_t data_len);
  599. /*----------------------------------------------------------------------
  600. * 密文接收数据处理
  601. * result:读取结果
  602. * 0x00:执行错误 0x01: 执行成功 0x02:数据模块忙,稍息再试 0x03:监控微处理器忙,稍后再试
  603. * 0x04:监控微处理器通讯超时,超时时间设定为10S
  604. * 0x05:查询的纪录不存在
  605. * 0x10: 监控微处理器序列号不存在
  606. * 0x11: 密文数据解密错误
  607. */
  608. int ytsf_rcv_analyze(uint8_t *data,uint8_t len,void *puser, uint8_t *port)
  609. {
  610. int ret = 1;
  611. uint8_t *fparm;
  612. uint16_t *p_crc, crc;
  613. uint8_t result = 0x01;
  614. tYTSFCommFrame_t *p_tax_rx = (tYTSFCommFrame_t *)data;
  615. _ytsf_data_decode(data, &len); /* 接收解码 */
  616. crc = _crc16_get(&p_tax_rx->fhead, p_tax_rx->flen);
  617. p_crc = (uint16_t *)&data[p_tax_rx->flen];
  618. *p_crc = ntohs(*p_crc);
  619. if(p_tax_rx->fhead == 0xBB && crc == *p_crc)
  620. {
  621. result = *(data+7); // 读取结果
  622. if(result != 0x01 ) return result;
  623. *port = p_tax_rx->fport;
  624. fparm = &data[sizeof(tYTSFCommFrame_t)];
  625. switch(p_tax_rx->fcmd)
  626. {
  627. case 0xA1:
  628. if(*fparm == 0x11)
  629. {
  630. ret = ytsf_0xa1_0x11_anaylse(puser, fparm, p_tax_rx->flen-5);
  631. if(ret == 0) ret = YTSF_0XA1_0X11;
  632. else ret = 0;
  633. }
  634. else if(*fparm == 0x14)
  635. {
  636. ret = ytsf_0xa1_0x14_anaylse(puser, fparm, p_tax_rx->flen-5);
  637. if(ret == 0) ret = YTSF_0XA1_0X14;
  638. else ret = 0;
  639. }
  640. break;
  641. case 0xA2:
  642. if(*fparm == 0x00)
  643. {
  644. ytsf_0xa2_0x00_anaylse(puser, fparm, p_tax_rx->flen-5);
  645. ret = YTSF_0XA2_0X00;
  646. }
  647. break;
  648. }
  649. }
  650. return ret;
  651. }
  652. /*-----------------------------------------------------------------------------
  653. * 错误日志上报
  654. * -----------------------------------------------------------------------------*/
  655. void up_send_log_err(uint16_t sendcmd, uint8_t type,uint8_t node,uint8_t port,uint8_t gun,uint32_t id,uint8_t cmd,uint8_t err)
  656. {
  657. //uint8_t send_buf[128] = {0};
  658. uint8_t send_len;
  659. // if((err&LOG_COLL_XSP_ERR) != LOG_COLL_XSP_ERR){
  660. if(timeout_isOut(&g_logCfigDa.time) == 1) return;
  661. // }
  662. memset(log_buff,0,256);
  663. uplink_tax_log_da(log_buff,&send_len,type,node,port,gun,id,cmd,err);
  664. tax_net_send_log(log_buff,send_len);
  665. return;
  666. }
  667. uint8_t *hex_to_ascii(uint8_t *str, uint32_t len)
  668. {
  669. // uint8_t *hex_buf = str;
  670. // for (int i = 0; i < len; i++)
  671. // {
  672. // sprintf(&data[i * 2], "%02X", hex_buf[i]);
  673. // }
  674. // return (uint8_t *)data;
  675. return 0;
  676. }
  677. /*-----------------------------------------------------------------------------
  678. * 错误日志上报 (原始数据)
  679. * -----------------------------------------------------------------------------*/
  680. void up_send_log_srcdata(uint8_t *data,uint16_t len)
  681. {
  682. //uint8_t send_buf[256] = {0};
  683. uint8_t i=0;
  684. uint16_t temlen = 0,send_len;
  685. if(g_logCfigDa.bEnable == 0) return;
  686. if(timeout_isOut(&g_logCfigDa.time2) == 1) return;
  687. memset(log_buff,0,256);
  688. sprintf((char*)log_buff,"|%01d|%02x|%02x|",nodeConf.nodeIndex,g_logCfigDa.curportno<<4|g_logCfigDa.curgunno,g_curSendCmd); //采集器索引 报税号枪号 指令
  689. temlen = strlen((char*)log_buff);
  690. if(data[0] == 0xFE) {
  691. for(i=0;i<len;i++){
  692. sprintf((char*)(&log_buff[temlen+i*2]),"%02x",data[i]);
  693. }
  694. send_len = temlen +(len)*2;
  695. }
  696. else {
  697. memcpy(&log_buff[temlen],data,len);
  698. send_len = temlen + len;
  699. }
  700. // printf("curgun = %d, curport = %d, cindex= %d statu = %x\r\n",g_logCfigDa.curgunno,g_logCfigDa.curportno,g_logCfigDa.collIndex,g_logCfigDa.status);
  701. switch (g_logCfigDa.status){
  702. case 0x80:
  703. tax_net_send_log(log_buff,send_len);
  704. break;
  705. case 0x81: // 指定的采集器
  706. if(g_logCfigDa.collIndex == nodeConf.nodeIndex)
  707. tax_net_send_log(log_buff,send_len);
  708. break;
  709. case 0x83: // 指定到某个采集器的某个报税口
  710. if(g_logCfigDa.collIndex == nodeConf.nodeIndex){
  711. if(g_logCfigDa.curportno == g_logCfigDa.taxInddex)
  712. tax_net_send_log(log_buff,send_len);
  713. }
  714. break;
  715. case 0x87: // 指定到某个采集器的某个报税口的某个枪
  716. if(g_logCfigDa.collIndex == nodeConf.nodeIndex && g_logCfigDa.curportno == g_logCfigDa.taxInddex){
  717. if(g_logCfigDa.gunIndex == g_logCfigDa.curgunno)
  718. tax_net_send_log(log_buff,send_len);
  719. }
  720. break;
  721. }
  722. return;
  723. }
  724. /////////////////////////////////////////////////////////////////
  725. /*解析采集器的数据信息 0x67指令*/
  726. ////////////////////////////////////////////////////////////////////////////////
  727. int collect_rcv_analyze0x67(uint8_t *data, uint8_t len)
  728. {
  729. int ret = 1,tempret = 0;
  730. uint8_t send_buf[128],send_len;
  731. uint8_t taxType = 0;
  732. uint16_t fcrc, crc;
  733. uint8_t gun_buf[128];
  734. uint8_t node=0,port=0,gun=0;
  735. uint8_t port_temp = 0;
  736. int lorastatus;
  737. // int i=0;
  738. uint32_t sn = 0,seqno=0;
  739. uint64_t tempDa = 0xFFFFFFFFFFFFFFFF;
  740. gun_info_t *p_gun = NULL;
  741. tax_info_t *p_tax = NULL;
  742. gateway_collect_com_t *p_tax_tx = (gateway_collect_com_t *)data;//Lora接收数据
  743. memset(send_buf,0,sizeof(send_buf));
  744. up_send_log_srcdata(data,len-2);
  745. crc = _crc16_get((uint8_t*)data,p_tax_tx->len+GATE_COLL_HEAD_LEN-2);// len-2);
  746. fcrc = data[p_tax_tx->len+GATE_COLL_HEAD_LEN-1];
  747. fcrc = (fcrc<<8)|data[p_tax_tx->len+GATE_COLL_HEAD_LEN-2];
  748. if(p_tax_tx->frame_header!=0xfefe) { goto GATEWAY_COLLECT_END;} //数据头不对则返回
  749. node = read_collect_index(p_tax_tx->taxinfo.data.device_sn);
  750. if((node == 0xFF) || (node>=downlink_config.collect_num)) {goto GATEWAY_COLLECT_END;}
  751. g_loraCollMsg.lora_rcvCount++;
  752. g_loraCollMsg.info[node].rcvNum++;
  753. // printf("接收 loraRecv= %d,采集(%d)接收:%d\r\n",g_loraCollMsg.lora_rcvCount,node,g_loraCollMsg.info[node].rcvNum);
  754. lorastatus = (int)*(data+p_tax_tx->len+GATE_COLL_HEAD_LEN+1);
  755. lorastatus = (lorastatus<<8) | ((int)*(data+p_tax_tx->len+GATE_COLL_HEAD_LEN));
  756. g_runData.collrunMsg[node].lorastatus =lorastatus;
  757. g_runData.collrunMsg[node].checkNum = 0;
  758. if(fcrc != crc ){
  759. printf("cmd0x67: crc error\r\n");
  760. up_send_log_err(GATEWAY_UP_LOG_CMD2001,LOG_TAX_DA,node,0,0,p_tax_tx->taxinfo.data.device_sn,g_curSendCmd,LOG_CRC);
  761. goto GATEWAY_COLLECT_END;
  762. } //校验位不对则返回
  763. if(p_tax_tx->taxinfo.data.device_type == 0x02){ // 处理显示屏的数据
  764. up_send_log_err(GATEWAY_UP_LOG_CMD2001,LOG_TAX_DA,node,0,0,p_tax_tx->taxinfo.data.device_sn,g_curSendCmd,LOG_XSP);
  765. goto GATEWAY_COLLECT_END;
  766. }
  767. port = read_tax_index(node,p_tax_tx->taxinfo.data.tax_no); //查询报税口编号
  768. if(port == 0xFF) {
  769. up_send_log_err(GATEWAY_UP_LOG_CMD2001,LOG_TAX_DA,node,p_tax_tx->taxinfo.data.tax_no,0,p_tax_tx->taxinfo.data.device_sn,g_curSendCmd,LOG_NOTAXID);
  770. goto GATEWAY_COLLECT_END;
  771. }
  772. gun = read_gun_index(node,port,p_tax_tx->taxinfo.data.gun_msgid);
  773. if(gun == 0xFF) {
  774. up_send_log_err(GATEWAY_UP_LOG_CMD2001,LOG_TAX_DA,node,p_tax_tx->taxinfo.data.tax_no,p_tax_tx->taxinfo.data.gun_msgid,p_tax_tx->taxinfo.data.device_sn,g_curSendCmd,LOG_NOGUNID);
  775. goto GATEWAY_COLLECT_END;
  776. }
  777. downlink_config.collect_conf[node].collect_status = COLL_STATUS_ONLINE; // 采集器在线状态
  778. sn = downlink_config.collect_conf[node].collect_no;
  779. seqno = nodeConf.taxconf[node].port[port].gun[gun].seq_no;
  780. //prot_type = downlink_config.collect_conf[node].tax_type;
  781. taxType = nodeConf.taxconf[node].port[port].taxType;
  782. if(p_tax_tx->taxinfo.data.status==2){
  783. printf("recv : sn = %010d, coll=%d, port=%d, gun=%d, cmd = 0x%02x, seqNo = %010d, taxType = 0x%02x\n",sn,node,port,gun,0x02,seqno,taxType);
  784. downlink_config.collect_conf[node].tax_conf[port].status = 0;
  785. up_send_log_err(GATEWAY_UP_LOG_CMD2001,LOG_TAX_DA,node,p_tax_tx->taxinfo.data.tax_no,p_tax_tx->taxinfo.data.gun_msgid,p_tax_tx->taxinfo.data.device_sn,g_curSendCmd,LOG_COLL_TIMOUT);
  786. if(nodeConf.taxconf[node].port[port].gun[gun].gLpState == TAX_GUN_LP_STATE_86){
  787. nodeConf.taxconf[node].port[port].gun[gun].gLpState = TAX_GUN_LP_STATE_CH;
  788. }
  789. goto GATEWAY_COLLECT_END;
  790. }
  791. else if(p_tax_tx->taxinfo.data.status==3){ //重新去读取83指令
  792. printf("recv : sn = %010d, coll=%d, port=%d, gun=%d, cmd = 0x%02x, seqNo = %010d, taxType = 0x%02x\n",sn,node,port,gun,0x03,seqno,taxType);
  793. up_send_log_err(GATEWAY_UP_LOG_CMD2001,LOG_TAX_DA,node,p_tax_tx->taxinfo.data.tax_no,p_tax_tx->taxinfo.data.gun_msgid,p_tax_tx->taxinfo.data.device_sn,g_curSendCmd,LOG_COLL_ENCPYST);
  794. nodeConf.taxconf[node].port[port].taxType &= 0xF0;
  795. goto GATEWAY_COLLECT_END;
  796. }
  797. else if(p_tax_tx->taxinfo.data.status == 0x06) { // 采集器判断的加油机忙
  798. printf("recv : sn = %010d, coll=%d, port=%d, gun=%d, cmd = 0x%02x, seqNo = %010d, taxType = 0x%02x\n",sn,node,port,gun,0x06,seqno,taxType);
  799. up_send_log_err(GATEWAY_UP_LOG_CMD2001,LOG_TAX_DA,node,p_tax_tx->taxinfo.data.tax_no,p_tax_tx->taxinfo.data.gun_msgid,p_tax_tx->taxinfo.data.device_sn,g_curSendCmd,LOG_COLL_BUSY);
  800. if(nodeConf.taxconf[node].port[port].gun[gun].gLpState == TAX_GUN_LP_STATE_86){
  801. nodeConf.taxconf[node].port[port].gun[gun].gLpState = TAX_GUN_LP_STATE_CH;
  802. }
  803. goto GATEWAY_COLLECT_END;
  804. }
  805. //prot_type = p_tax_tx->taxinfo.data.prot_type;
  806. downlink_config.collect_conf[node].tax_conf[port].status = 1; // 报税口在线
  807. if(((taxType&PLAINTEXT) == PLAINTEXT)) {///明文
  808. ret = tax_rcv_analyze((uint8_t *)p_tax_tx->taxinfo.data.info,gun_buf);//解析Lora接收的税控口数据部分
  809. if(ret == 0x86 || ret == 0x89)
  810. {
  811. printf("recv : sn = %010d, coll=%d, port=%d, gun=%d, cmd = 0x%02x, seqNo = %010d, taxType = 0x%02x\n",sn,node,port,gun,ret,seqno,taxType);
  812. if(ret == 0x89){
  813. memset(&rcv_data_temp,0,sizeof(rcv_data_temp_t));
  814. }
  815. p_gun = (gun_info_t *)gun_buf;
  816. if(rcv_data_temp.rcv_no == 0)//接收的第一组数据
  817. {
  818. rcv_data_temp.prev_collect = node;
  819. rcv_data_temp.prev_tax = port;
  820. rcv_data_temp.prev_gun = gun;
  821. rcv_data_temp.rcv_no = 1;
  822. rcv_data_temp.prev_seq = p_tax_tx->seq_no;
  823. if(ret == 0x86)
  824. {
  825. rcv_data_temp.unit_price = p_gun->last_unit_price;
  826. rcv_data_temp.oil_volume = p_gun->last_oil_volume;
  827. rcv_data_temp.price = p_gun->last_price;
  828. rcv_data_temp.time_day = p_gun->time_day;
  829. rcv_data_temp.time_hour = p_gun->time_hour;
  830. rcv_data_temp.time_minute = p_gun->time_minute;
  831. }
  832. else if(ret == 0x89)
  833. {
  834. rcv_data_temp.total_oil_volume = p_gun->total_oil_volume;
  835. rcv_data_temp.total_price = p_gun->total_price;
  836. }
  837. // printf("ming wen - step1\r\n");
  838. }
  839. else //接收的第二组数据
  840. {
  841. if(rcv_data_temp.prev_collect == node && rcv_data_temp.prev_tax == port && \
  842. rcv_data_temp.prev_gun == gun && rcv_data_temp.prev_seq == p_tax_tx->seq_no) //采集器、报税口、枪号、流水号全部相同,认为是同一组数据
  843. {
  844. // printf("ming wen - step2\r\n");
  845. rcv_data_temp.rcv_no = 0;
  846. if(ret == 0x86)
  847. {
  848. rcv_data_temp.unit_price = p_gun->last_unit_price;
  849. rcv_data_temp.oil_volume = p_gun->last_oil_volume;
  850. rcv_data_temp.price = p_gun->last_price;
  851. rcv_data_temp.time_day = p_gun->time_day;
  852. rcv_data_temp.time_hour = p_gun->time_hour;
  853. rcv_data_temp.time_minute = p_gun->time_minute;
  854. }
  855. else if(ret == 0x89)
  856. {
  857. rcv_data_temp.total_oil_volume = p_gun->total_oil_volume;
  858. rcv_data_temp.total_price = p_gun->total_price;
  859. }
  860. tempDa = rcv_data_temp.unit_price+rcv_data_temp.oil_volume+rcv_data_temp.price+rcv_data_temp.total_oil_volume + rcv_data_temp.total_price;
  861. if((downlink_config.bInstallFinish==INSTALL_5A) ||((g_checkDa[node][port][gun]^tempDa) != 0) ){ // 去掉重复数据,重复的数据不上报服务器
  862. g_checkDa[node][port][gun]=tempDa;
  863. uplink_tax_comb(send_buf,&send_len,node,port,gun,p_tax_tx->seq_no);//向服务器上传数据的参数部分
  864. rcv_data_temp.unit_price = 0;
  865. rcv_data_temp.oil_volume = 0;
  866. rcv_data_temp.price = 0;
  867. rcv_data_temp.total_oil_volume = 0;
  868. rcv_data_temp.total_price = 0;
  869. tax_net_send(send_buf,send_len,FIRST_TYPE_DATA,COLL_TAX_DA_CMD_UP); //向服务器上传数据的完整数据,并通过mqtt发送
  870. g_runData.daStatus[node][port][gun] = 0;
  871. }
  872. else { // 重复数据2分钟上传一次
  873. if(g_runData.daStatus[node][port][gun]>=TAX_REPEAD_DATA){
  874. uplink_tax_comb(send_buf,&send_len,node,port,gun,p_tax_tx->seq_no);//向服务器上传数据的参数部分
  875. rcv_data_temp.unit_price = 0;
  876. rcv_data_temp.oil_volume = 0;
  877. rcv_data_temp.price = 0;
  878. rcv_data_temp.total_oil_volume = 0;
  879. rcv_data_temp.total_price = 0;
  880. tax_net_send(send_buf,send_len,FIRST_TYPE_DATA,COLL_TAX_DA_CMD_UP); //向服务器上传数据的完整数据,并通过mqtt发送
  881. g_runData.daStatus[node][port][gun] = 0;
  882. // printf("明文 :重复数据2分钟 node = %d, port = %d, gun = %d\r\n",node,port,gun);
  883. }
  884. }
  885. }
  886. else//采集器、报税口、枪号、流水号不全部相同,认为是下一组数据的第一组
  887. {
  888. rcv_data_temp.prev_collect = node;
  889. rcv_data_temp.prev_tax = port;
  890. rcv_data_temp.prev_gun = gun;
  891. rcv_data_temp.rcv_no = 1;
  892. rcv_data_temp.prev_seq = p_tax_tx->seq_no;
  893. if(ret == 0x86)
  894. {
  895. rcv_data_temp.unit_price = p_gun->last_unit_price;
  896. rcv_data_temp.oil_volume = p_gun->last_oil_volume;
  897. rcv_data_temp.price = p_gun->last_price;
  898. rcv_data_temp.time_day = p_gun->time_day;
  899. rcv_data_temp.time_hour = p_gun->time_hour;
  900. rcv_data_temp.time_minute = p_gun->time_minute;
  901. }
  902. else if(ret == 0x89)
  903. {
  904. rcv_data_temp.total_oil_volume = p_gun->total_oil_volume;
  905. rcv_data_temp.total_price = p_gun->total_price;
  906. }
  907. }
  908. }
  909. }
  910. else if(ret == 0x83)
  911. {
  912. printf("lora rcv 0x83\r\n");
  913. p_tax = (tax_info_t *)gun_buf;
  914. // gateway_read.collect_read[node].tax_read[port].alrd_sn = 1;
  915. // memcpy(gateway_read.collect_read[node].tax_read[port].monitor_serino,p_tax->monitor_serino,16);
  916. downlink_config.collect_conf[node].tax_num = 2;
  917. downlink_config.collect_conf[node].tax_conf[port].alrd_sn = 1;
  918. nodeConf.taxconf[node].port[port].alrd_sn = 1;
  919. if(p_tax->gun_num>8){
  920. printf("read gun num = %d\r\n",p_tax->gun_num);
  921. p_tax->gun_num = 8;
  922. }
  923. downlink_config.collect_conf[node].tax_conf[port].gun_num =p_tax->gun_num ; //枪的个数
  924. downlink_config.collect_conf[node].tax_conf[port].factory =p_tax->factory ; // 厂家信息
  925. downlink_config.collect_conf[node].tax_conf[port].status = 1; // 报税器口状态
  926. memcpy(downlink_config.collect_conf[node].tax_conf[port].monitor_serino,p_tax->monitor_serino,16); //序列号
  927. uplink_tax_systemcmd_0x2011(send_buf,&send_len,node,port,gun);
  928. tax_net_send(send_buf,send_len,FIRST_TYPE_SYST,COLL_UP_SYS_CMD2011);
  929. g_checkGun[node].gunSta.status[port] = pow(2,p_tax->gun_num)-1;
  930. fram_write_collect_msg();
  931. nodeConf.taxconf[node].port[port].gun[gun].gLpState = TAX_GUN_LP_STATE_89;
  932. printf("rcv----0x83:coll = %d port=%d gunNUM=%d, factory=%d\r\n",node, port, p_tax->gun_num, p_tax->factory);
  933. }
  934. else {
  935. printf("明文数据错误\r\n");
  936. memset(&rcv_data_temp,0,sizeof(rcv_data_temp_t));
  937. if(nodeConf.taxconf[node].port[port].gun[gun].gLpState == TAX_GUN_LP_STATE_86){
  938. nodeConf.taxconf[node].port[port].gun[gun].gLpState = TAX_GUN_LP_STATE_CH;
  939. }
  940. }
  941. }
  942. else if(((taxType&CIPHERTEXT) == CIPHERTEXT) && ((taxType&0xF0)== 0x00)) { //密文
  943. ret = ytsf_rcv_analyze((uint8_t *)p_tax_tx->taxinfo.data.info,p_tax_tx->len-GATE_COLL_CMD5767_LEN,gun_buf,(uint8_t *)&port_temp);
  944. port = port_temp;
  945. if(ret == YTSF_0XA1_0X11 || ret == YTSF_0XA1_0X14)
  946. {
  947. tempret = ((ret==YTSF_0XA1_0X14) ? 0x89 : 0x86);
  948. printf("recv : sn = %010d, coll=%d, port=%d, gun=%d, cmd = 0x%02x, seqNo = %010d, taxType = 0x%02x\n",sn,node,port,gun,tempret,seqno,taxType);
  949. if(ret == YTSF_0XA1_0X14){
  950. memset(&rcv_data_temp,0,sizeof(rcv_data_temp_t));
  951. }
  952. p_gun = (gun_info_t *)gun_buf;
  953. if(rcv_data_temp.rcv_no == 0)//接收的第一组数据
  954. {
  955. rcv_data_temp.prev_collect = node;
  956. rcv_data_temp.prev_tax = port;
  957. rcv_data_temp.prev_gun = gun;
  958. rcv_data_temp.rcv_no = 1;
  959. rcv_data_temp.prev_seq = p_tax_tx->seq_no;
  960. if(ret == YTSF_0XA1_0X11)
  961. {
  962. rcv_data_temp.unit_price = p_gun->last_unit_price;
  963. rcv_data_temp.oil_volume = p_gun->last_oil_volume;
  964. rcv_data_temp.price = p_gun->last_price;
  965. rcv_data_temp.time_day = p_gun->time_day;
  966. rcv_data_temp.time_hour = p_gun->time_hour;
  967. rcv_data_temp.time_minute = p_gun->time_minute;
  968. }
  969. else if(ret == YTSF_0XA1_0X14)
  970. {
  971. rcv_data_temp.total_oil_volume = p_gun->total_oil_volume;
  972. rcv_data_temp.total_price = p_gun->total_price;
  973. }
  974. // printf("\r\nmi wen - step1\r\n");
  975. }
  976. else //接收的第二组数据
  977. {
  978. if(rcv_data_temp.prev_collect == node && rcv_data_temp.prev_tax == port && \
  979. rcv_data_temp.prev_gun == gun && rcv_data_temp.prev_seq == p_tax_tx->seq_no) //采集器、报税口、枪号、流水号全部相同,认为是同一组数据
  980. {
  981. // printf("\r\n mi wen - step2\r\n");
  982. rcv_data_temp.rcv_no = 0;
  983. if(ret == YTSF_0XA1_0X11)
  984. {
  985. rcv_data_temp.unit_price = p_gun->last_unit_price;
  986. rcv_data_temp.oil_volume = p_gun->last_oil_volume;
  987. rcv_data_temp.price = p_gun->last_price;
  988. rcv_data_temp.time_day = p_gun->time_day;
  989. rcv_data_temp.time_hour = p_gun->time_hour;
  990. rcv_data_temp.time_minute = p_gun->time_minute;
  991. }
  992. else if(ret == YTSF_0XA1_0X14)
  993. {
  994. rcv_data_temp.total_oil_volume = p_gun->total_oil_volume;
  995. rcv_data_temp.total_price = p_gun->total_price;
  996. }
  997. tempDa = rcv_data_temp.unit_price+rcv_data_temp.oil_volume+rcv_data_temp.price+\
  998. rcv_data_temp.total_oil_volume + rcv_data_temp.total_price;
  999. if((downlink_config.bInstallFinish==INSTALL_5A) ||((g_checkDa[node][port][gun]^tempDa) != 0) ){ //重复的数据不上报服务器
  1000. g_checkDa[node][port][gun]=tempDa;
  1001. uplink_tax_comb(send_buf,&send_len,node,port,gun,p_tax_tx->seq_no);//向服务器上传数据的参数部分
  1002. rcv_data_temp.unit_price = 0;
  1003. rcv_data_temp.oil_volume = 0;
  1004. rcv_data_temp.price = 0;
  1005. rcv_data_temp.total_oil_volume = 0;
  1006. rcv_data_temp.total_price = 0;
  1007. tax_net_send(send_buf,send_len,FIRST_TYPE_DATA,COLL_TAX_DA_CMD_UP); //向服务器上传数据的完整数据,并通过mqtt发送
  1008. g_runData.daStatus[node][port][gun] = 0;
  1009. }
  1010. else { // 重复数据2分钟上传一次
  1011. if(g_runData.daStatus[node][port][gun]>=TAX_REPEAD_DATA){
  1012. uplink_tax_comb(send_buf,&send_len,node,port,gun,p_tax_tx->seq_no);//向服务器上传数据的参数部分
  1013. rcv_data_temp.unit_price = 0;
  1014. rcv_data_temp.oil_volume = 0;
  1015. rcv_data_temp.price = 0;
  1016. rcv_data_temp.total_oil_volume = 0;
  1017. rcv_data_temp.total_price = 0;
  1018. tax_net_send(send_buf,send_len,FIRST_TYPE_DATA,COLL_TAX_DA_CMD_UP); //向服务器上传数据的完整数据,并通过mqtt发送
  1019. g_runData.daStatus[node][port][gun] = 0;
  1020. // printf("密文 :重复数据2分钟 node = %d, port = %d, gun = %d\r\n",node,port,gun);
  1021. }
  1022. }
  1023. }
  1024. else//采集器、报税口、枪号、流水号不全部相同,认为是下一组数据的第一组
  1025. {
  1026. rcv_data_temp.prev_collect = node;
  1027. rcv_data_temp.prev_tax = port;
  1028. rcv_data_temp.prev_gun = gun;
  1029. rcv_data_temp.rcv_no = 1;
  1030. rcv_data_temp.prev_seq = p_tax_tx->seq_no;
  1031. if(ret == YTSF_0XA1_0X11)
  1032. {
  1033. rcv_data_temp.unit_price = p_gun->last_unit_price;
  1034. rcv_data_temp.oil_volume = p_gun->last_oil_volume;
  1035. rcv_data_temp.price = p_gun->last_price;
  1036. rcv_data_temp.time_day = p_gun->time_day;
  1037. rcv_data_temp.time_hour = p_gun->time_hour;
  1038. rcv_data_temp.time_minute = p_gun->time_minute;
  1039. }
  1040. else if(ret == YTSF_0XA1_0X14)
  1041. {
  1042. rcv_data_temp.total_oil_volume = p_gun->total_oil_volume;
  1043. rcv_data_temp.total_price = p_gun->total_price;
  1044. }
  1045. }
  1046. }
  1047. }
  1048. else if(ret == YTSF_0XA2_0X00)
  1049. {
  1050. p_tax = (tax_info_t *)gun_buf;
  1051. downlink_config.collect_conf[node].tax_num = 2;
  1052. downlink_config.collect_conf[node].tax_conf[port].alrd_sn = 1;
  1053. nodeConf.taxconf[node].port[port].alrd_sn = 1;
  1054. if(p_tax->gun_num>8){
  1055. printf("read gun num = %d\r\n",p_tax->gun_num);
  1056. p_tax->gun_num = 8;
  1057. }
  1058. downlink_config.collect_conf[node].tax_conf[port].gun_num =p_tax->gun_num ; //枪的个数
  1059. downlink_config.collect_conf[node].tax_conf[port].factory =p_tax->factory ; // 厂家信息
  1060. downlink_config.collect_conf[node].tax_conf[port].status = 1; // 报税器口状态
  1061. memcpy(downlink_config.collect_conf[node].tax_conf[port].monitor_serino,p_tax->monitor_serino,16); //序列号
  1062. uplink_tax_systemcmd_0x2011(send_buf,&send_len,node,port,gun);
  1063. tax_net_send(send_buf,send_len,FIRST_TYPE_SYST,COLL_UP_SYS_CMD2011);
  1064. fram_write_collect_msg();
  1065. nodeConf.taxconf[node].port[port].gun[gun].gLpState = TAX_GUN_LP_STATE_89;
  1066. printf("rcv------0x83:coll = %d port=%d gunNUM=%d, factory=%d\r\n", node, port,p_tax->gun_num,p_tax->factory );
  1067. }
  1068. else { // 密文数据返回错误
  1069. printf("\r\n 密文数据返回错误 错误代码: 0x%x\r\n",ret);
  1070. up_send_log_err(GATEWAY_UP_LOG_CMD2001,LOG_TAX_DA,node,p_tax_tx->taxinfo.data.tax_no,p_tax_tx->taxinfo.data.gun_msgid,p_tax_tx->taxinfo.data.device_sn,g_curSendCmd,ret);
  1071. port = read_tax_index(node,p_tax_tx->taxinfo.data.tax_no); //查询报税口编号
  1072. if(port != 0xFF) {
  1073. // printf("node=%d, port = %d, gun = %d,glpstate = %d\r\n",node,port,gun,nodeConf.taxconf[node].port[port].gun[gun].gLpState);
  1074. if(nodeConf.taxconf[node].port[port].gun[gun].gLpState == TAX_GUN_LP_STATE_86){
  1075. nodeConf.taxconf[node].port[port].gun[gun].gLpState = TAX_GUN_LP_STATE_CH;
  1076. }
  1077. if(g_runData.daStatus[node][port][gun]>=TAX_REPEAD_DATA) {
  1078. uplink_tax_comb_2002(send_buf,&send_len,node,port,gun,ret);//向服务器上传数据的参数部分
  1079. tax_net_send(send_buf,send_len,FIRST_TYPE_DATA,COLL_TAX_DAER_CMD_UP); //向服务器上传数据的完整数据,并通过mqtt发送
  1080. g_runData.daStatus[node][port][gun] = 0;
  1081. }
  1082. }
  1083. memset(&rcv_data_temp,0,sizeof(rcv_data_temp_t));
  1084. }
  1085. }
  1086. else if(((taxType&CIPHERTEXT) == CIPHERTEXT) && ((taxType&0x80)== 0x80)) { //密文指令解析8C
  1087. ret = tax_rcv_analyze_0x8C((uint8_t*)(p_tax_tx->taxinfo.data.info+10),gun_buf,&send_len); // 前10个字节是税控序列号
  1088. printf("recv : sn = %010d, coll=%d, port=%d, gun=%d, cmd = 0x%02x, seqNo = %010d, taxType = 0x%02x\n",sn,node,port,gun,ret,seqno,taxType);
  1089. if((ret == 0x11) ||( ret == 0x14) || (ret == 0x91) || (ret == 0x94)){
  1090. memcpy(g_tax8Cda.monitor_serino,p_tax_tx->taxinfo.data.info,10);
  1091. if((ret == 0x11) || (ret == 0x91)) {
  1092. if(rcv_data_temp.rcv_no == 1){
  1093. if(rcv_data_temp.prev_collect == node && rcv_data_temp.prev_tax == port && \
  1094. rcv_data_temp.prev_gun == gun && rcv_data_temp.prev_seq == p_tax_tx->seq_no) {
  1095. tempDa = ((g_tax8Cda.timer86<<16) |(g_tax8Cda.crc86<<8) | (g_tax8Cda.crc89));
  1096. if((downlink_config.bInstallFinish==INSTALL_5A) || (tempDa != g_checkDa[node][port][gun])){
  1097. memcpy(g_tax8Cda.data11,gun_buf,send_len);
  1098. g_tax8Cda.data11len = send_len;
  1099. //printf("timer = %x, crc86= %x, crc89 = %x\n",g_tax8Cda.timer86,g_tax8Cda.crc86,g_tax8Cda.crc89);
  1100. uplink_data_cmd_0x2071(send_buf,&send_len,p_tax_tx->seq_no,node,port,gun,&g_tax8Cda);
  1101. tax_net_send(send_buf,send_len,FIRST_TYPE_DATA,NET_UP_DATA_CMD2071);
  1102. data_dump("上传数据到服务器",send_buf,send_len);
  1103. g_checkDa[node][port][gun] = tempDa;
  1104. g_runData.daStatus[node][port][gun] = 0;
  1105. }
  1106. else {
  1107. if(g_runData.daStatus[node][port][gun]>=TAX_REPEAD_DATA){
  1108. memcpy(g_tax8Cda.data11,gun_buf,send_len);
  1109. g_tax8Cda.data11len = send_len;
  1110. //printf("timer = %x, crc86= %x, crc89 = %x\n",g_tax8Cda.timer86,g_tax8Cda.crc86,g_tax8Cda.crc89);
  1111. uplink_data_cmd_0x2071(send_buf,&send_len,p_tax_tx->seq_no,node,port,gun,&g_tax8Cda);
  1112. tax_net_send(send_buf,send_len,FIRST_TYPE_DATA,NET_UP_DATA_CMD2071);
  1113. data_dump("重覆数据上传到服务器",send_buf,send_len);
  1114. g_checkDa[node][port][gun] = tempDa;
  1115. g_runData.daStatus[node][port][gun] = 0;
  1116. }
  1117. }
  1118. }
  1119. else {
  1120. printf("不是同一组数据\n");
  1121. }
  1122. rcv_data_temp.rcv_no = 0;
  1123. memset((char*)&g_tax8Cda,0,sizeof(rcv_data_0x8C_t));
  1124. }
  1125. }
  1126. else if((ret == 0x14) || (ret == 0x94)) {
  1127. rcv_data_temp.prev_collect = node;
  1128. rcv_data_temp.prev_tax = port;
  1129. rcv_data_temp.prev_gun = gun;
  1130. rcv_data_temp.rcv_no = 1;
  1131. rcv_data_temp.prev_seq = p_tax_tx->seq_no;
  1132. memcpy(g_tax8Cda.data14,gun_buf,send_len);
  1133. g_tax8Cda.data14len = send_len;
  1134. }
  1135. }
  1136. else if((ret == 0x70) || (ret == 0xF0) ){
  1137. if(ret == 0x70) {
  1138. //printf("cccc ret = %x\n",ret);
  1139. p_tax = (tax_info_t *)gun_buf;
  1140. downlink_config.collect_conf[node].tax_num = 2;
  1141. downlink_config.collect_conf[node].tax_conf[port].alrd_sn = 1;
  1142. nodeConf.taxconf[node].port[port].alrd_sn = 1;
  1143. if(p_tax->gun_num>8){
  1144. printf("read gun num = %d\r\n",p_tax->gun_num);
  1145. p_tax->gun_num = 8;
  1146. }
  1147. downlink_config.collect_conf[node].tax_conf[port].gun_num =p_tax->gun_num ; //枪的个数
  1148. downlink_config.collect_conf[node].tax_conf[port].factory =p_tax->factory ; // 厂家信息
  1149. downlink_config.collect_conf[node].tax_conf[port].status = 1; // 报税器口状态
  1150. memcpy(downlink_config.collect_conf[node].tax_conf[port].monitor_serino,p_tax->monitor_serino,16); //序列号
  1151. uplink_tax_systemcmd_0x2011(send_buf,&send_len,node,port,gun);
  1152. tax_net_send(send_buf,send_len,FIRST_TYPE_SYST,COLL_UP_SYS_CMD2011);
  1153. g_checkGun[node].gunSta.status[port] = pow(2,p_tax->gun_num)-1;
  1154. fram_write_collect_msg();
  1155. nodeConf.taxconf[node].port[port].gun[gun].gLpState = TAX_GUN_LP_STATE_89;
  1156. printf("rcv----0x83:coll = %d port=%d gunNUM=%d, factory=%d\r\n",node, port, p_tax->gun_num, p_tax->factory);
  1157. }
  1158. }
  1159. }
  1160. timeout_start(&g_taxDataTime);
  1161. GATEWAY_COLLECT_END:
  1162. timeout_stop(&g_taxSendTime);
  1163. return 0;
  1164. }
  1165. /*--------------------------------------------------------------
  1166. * 解析采集器通过lora发的过的指令0x66指令
  1167. * 心跳包指令
  1168. * 只有当是拓盛密文时,才会主动下发心跳包,
  1169. *
  1170. * -------------------------------------------------------------*/
  1171. int collect_rcv_analyze0x66(uint8_t *data, uint8_t len)
  1172. {
  1173. // uint8_t idIndex = 0;
  1174. uint16_t p_crc = 0;
  1175. uint8_t factory;
  1176. uint16_t crc;
  1177. uint8_t send_buff[160];
  1178. uint8_t sendlen = 0;
  1179. uint8_t node = 0;
  1180. int lorastatus = 0;
  1181. gateway_collect_com_t *p_tax_tx = (gateway_collect_com_t *)data;//Lora接收数据
  1182. crc = _crc16_get((uint8_t*)data,p_tax_tx->len+GATE_COLL_HEAD_LEN -2 );// len-2);
  1183. p_crc = data[p_tax_tx->len+GATE_COLL_HEAD_LEN-1];
  1184. p_crc = (p_crc<<8)|data[p_tax_tx->len+GATE_COLL_HEAD_LEN-2];
  1185. up_send_log_srcdata(data,len-2);
  1186. if(p_tax_tx->frame_header!=0xfefe) {goto GATEWAY_COLL_0x66;} //数据头不对则返回
  1187. if(g_runData.bchangelora == 1) {
  1188. node = p_tax_tx->taxinfo.comdata.coll_no-1;
  1189. g_loraCollMsg.info[node].loraindex = g_runData.nextlorIndex;
  1190. printf("SN:%d 成功\r\n",g_loraCollMsg.info[node].coll_sn);
  1191. uplink_update_systemcmd_0x2017(send_buff,&sendlen,p_tax_tx->taxinfo.comdata.device_sn,1,g_runData.nextlorIndex);
  1192. tax_net_send(send_buff,sendlen,FIRST_TYPE_SYST,COLL_UP_SYS_CMD2017);
  1193. }
  1194. else {
  1195. node = read_collect_index(p_tax_tx->taxinfo.comdata.device_sn);
  1196. if((node == 0xFF) || (node>=downlink_config.collect_num)) {goto GATEWAY_COLL_0x66;}
  1197. g_loraCollMsg.lora_rcvCount++;
  1198. g_loraCollMsg.info[node].rcvNum++;
  1199. // printf("接收 loraRecv= %d,采集(%d)接收:%d\r\n",g_loraCollMsg.lora_rcvCount,node,g_loraCollMsg.info[node].rcvNum);
  1200. lorastatus = (int)*(data+p_tax_tx->len+GATE_COLL_HEAD_LEN+1);
  1201. lorastatus = (lorastatus<<8) | ((int)*(data+p_tax_tx->len+GATE_COLL_HEAD_LEN));
  1202. g_runData.collrunMsg[node].lorastatus = lorastatus;
  1203. if(p_crc != crc ){
  1204. printf("cmd0x66: crc error\r\n");
  1205. goto GATEWAY_COLL_0x66;
  1206. } //校验位不对则返回
  1207. g_runData.collrunMsg[node].checkNum = 0;
  1208. factory = p_tax_tx->taxinfo.taxEnStatus.factory;
  1209. if((factory&0x80) == 0x80) {
  1210. nodeConf.taxconf[node].port[0].taxType = factory&0xF3;
  1211. nodeConf.taxconf[node].port[1].taxType = ((factory&0xF0)|((factory>>2)&0x03));
  1212. }
  1213. else {
  1214. nodeConf.taxconf[node].port[0].taxType = factory;
  1215. nodeConf.taxconf[node].port[1].taxType = factory;
  1216. }
  1217. downlink_config.collect_conf[node].collect_status = 1;
  1218. downlink_config.collect_conf[node].tax_type = factory;
  1219. if(factory !=0 )downlink_config.collect_conf[node].coll_send_num = 0;
  1220. printf("rcv cmd 0x66 coll = %d, tax_type = %02x ,port1Type = %02x, port2Type = %02x\n",node,factory,nodeConf.taxconf[node].port[0].taxType,nodeConf.taxconf[node].port[1].taxType);
  1221. }
  1222. if(g_logCfigDa.bEnable)
  1223. timeout_start(&g_taxDataTime);
  1224. GATEWAY_COLL_0x66:
  1225. timeout_stop(&g_taxSendTime);
  1226. return 0;
  1227. }
  1228. /*--------------------------------------------------------------
  1229. * 解析采集器通过lora发的过的指令0x58指令
  1230. * 固件包指令
  1231. * 收到固件包信息后,要向服务器上传
  1232. * -------------------------------------------------------------*/
  1233. int collect_rcv_analyze0x68(uint8_t *data, uint8_t len)
  1234. {
  1235. uint8_t flag = 0;//i=0,idIndex = 0,
  1236. uint16_t p_crc = 0;
  1237. uint16_t crc;
  1238. uint8_t index = 0;
  1239. uint8_t send_buff[160];
  1240. uint8_t sendlen = 0;//,num;
  1241. int lorastatus = 0;
  1242. static uint8_t collNum = 0;
  1243. CollMsg *collMsg = NULL;
  1244. gateway_collect_com_t *p_tax_tx = (gateway_collect_com_t *)data;//Lora接收数据
  1245. crc = _crc16_get((uint8_t*)data,p_tax_tx->len+GATE_COLL_HEAD_LEN-2);// len-2);
  1246. p_crc = data[p_tax_tx->len+GATE_COLL_HEAD_LEN-1];
  1247. p_crc = (p_crc<<8)|data[p_tax_tx->len+GATE_COLL_HEAD_LEN-2];
  1248. //data_dump("aaaaa:", (uint8_t *)data, len);
  1249. if(p_tax_tx->frame_header!=0xfefe) {goto GATEWAY_COLL_0x68;} //数据头不对则返回
  1250. if(p_crc != crc ){printf("cmd0x68: crc error\r\n"); goto GATEWAY_COLL_0x68;} //校验位不对则返回
  1251. index = read_collect_index(p_tax_tx->taxinfo.firmMsg.device_sn);
  1252. if((index == 0xFF) || (index >=downlink_config.collect_num)) goto GATEWAY_COLL_0x68;
  1253. g_loraCollMsg.lora_rcvCount++;
  1254. g_loraCollMsg.info[index].rcvNum++;
  1255. // printf("接收 loraRecv= %d,采集(%d)接收:%d\r\n",g_loraCollMsg.lora_rcvCount,index,g_loraCollMsg.info[index].rcvNum);
  1256. lorastatus = (int)*(data+p_tax_tx->len+GATE_COLL_HEAD_LEN+1);
  1257. lorastatus = (lorastatus<<8) | ((int)*(data+p_tax_tx->len+GATE_COLL_HEAD_LEN));
  1258. g_runData.collrunMsg[index].lorastatus = lorastatus;
  1259. downlink_config.collect_conf[index].collect_status = COLL_STATUS_ONLINE; // 采集器在线状态
  1260. collMsg = &(g_firmwareMsg.collMsg[index]);
  1261. // collMsg->device_sn = p_tax_tx->taxinfo.firmMsg.device_sn; // 采集器的SN号; //
  1262. if(g_runData.bServerRead58==0){
  1263. if(collMsg->bootloaderVr!=p_tax_tx->taxinfo.firmMsg.bootloaderVr) flag = 1;
  1264. else if(collMsg->appVr!=p_tax_tx->taxinfo.firmMsg.appVr) flag = 1;
  1265. else if(collMsg->resetNum!=p_tax_tx->taxinfo.firmMsg.resetNum) flag = 1;
  1266. else if(collMsg->resetType!= p_tax_tx->taxinfo.firmMsg.resetType) flag = 1;
  1267. else if(collMsg->updateStatus!=p_tax_tx->taxinfo.firmMsg.updateStatus) flag = 1;
  1268. else if(collMsg->voltage != p_tax_tx->taxinfo.firmMsg.voltage) flag = 1;
  1269. else if(collMsg->temperature != p_tax_tx->taxinfo.firmMsg.temperature) flag = 0;
  1270. else flag = 0;
  1271. }
  1272. else {
  1273. flag = 1;
  1274. g_runData.bServerRead58 = 0;
  1275. }
  1276. collMsg->bootloaderVr = p_tax_tx->taxinfo.firmMsg.bootloaderVr; // bootloader版本
  1277. collMsg->appVr = p_tax_tx->taxinfo.firmMsg.appVr; // app版本号
  1278. collMsg->resetNum = p_tax_tx->taxinfo.firmMsg.resetNum; // 复位次数
  1279. collMsg->resetType = p_tax_tx->taxinfo.firmMsg.resetType; // 最后一次复位类型
  1280. collMsg->runTime = p_tax_tx->taxinfo.firmMsg.runTime; //运行时长
  1281. collMsg->voltage = p_tax_tx->taxinfo.firmMsg.voltage; // 电压
  1282. collMsg->temperature = p_tax_tx->taxinfo.firmMsg.temperature; // 温度
  1283. collMsg->updateStatus = p_tax_tx->taxinfo.firmMsg.updateStatus;// 升级状态码
  1284. memcpy(collMsg->uuid,p_tax_tx->taxinfo.firmMsg.uuid,12); // 芯片ID号
  1285. if(flag==1){
  1286. memset(send_buff,0,sizeof(send_buff));
  1287. uplink_tax_statusmcmd_0x2001(send_buff,&sendlen,DEVICE_COLLECT,index);
  1288. tax_net_send(send_buff,sendlen,FIRST_TYPE_STATUS,COLL_UP_STATUS_CMD2001);
  1289. printf("rcv 68: sn = %10u, status = %d\r\n",collMsg->device_sn, collMsg->updateStatus);
  1290. printf("rcv cmd analyze finish 0x68\r\n");
  1291. }
  1292. else {
  1293. printf("rcv 0x68 same last\r\n");
  1294. }
  1295. if(g_runData.bsendUpdateStatus==2){
  1296. up_to_send_server_update_status(DEVICE_COLLECT,collMsg->device_sn,g_runData.task_no,collMsg->updateStatus);
  1297. collNum++;
  1298. if(collNum>=(downlink_config.collect_num)){
  1299. g_runData.bsendUpdateStatus = 0;
  1300. collNum = 0;
  1301. }
  1302. }
  1303. GATEWAY_COLL_0x68:
  1304. timeout_stop(&g_taxSendTime);
  1305. return 0;
  1306. }
  1307. /*----------------------------------------------------------------------------------
  1308. * 解析编码器的数据
  1309. * ---------------------------------------------------------------------------------*/
  1310. int collect_rcv_analyze0x6C(uint8_t *data, uint8_t len)
  1311. {
  1312. uint8_t send_buf[128],sendlen=0;
  1313. uint16_t fcrc, crc;
  1314. //uint8_t rcv_buf[64],rcvlen=0;
  1315. uint32_t sn = 0;
  1316. uint8_t portNo = 0,gunNo = 0;
  1317. uint8_t node=0,port=0;//,enindex = 0;
  1318. int lorastatus;
  1319. // encoderDa_00 *msg = NULL;
  1320. uint8_t bnewCode = 0; // 是否为新记录
  1321. enMsgDa *msg = NULL;
  1322. gateway_collect_com_t *p_tax_tx = (gateway_collect_com_t *)data;//Lora接收数据
  1323. memset(send_buf,0,sizeof(send_buf));
  1324. up_send_log_srcdata(data,len-2);
  1325. crc = _crc16_get((uint8_t*)data,p_tax_tx->len+GATE_COLL_HEAD_LEN-2);// len-2);
  1326. fcrc = data[p_tax_tx->len+GATE_COLL_HEAD_LEN-1];
  1327. fcrc = (fcrc<<8)|data[p_tax_tx->len+GATE_COLL_HEAD_LEN-2];
  1328. if(p_tax_tx->frame_header!=0xfefe) { goto GATEWAY_COLL_0x6C;} //数据头不对则返回
  1329. node = read_collect_index(p_tax_tx->taxinfo.encoderda.device_sn);
  1330. if( (0xFF == node) || (node>=downlink_config.collect_num)) {
  1331. printf("coll index error coll = %d,sn = %010u\r\n",node,p_tax_tx->taxinfo.encoderda.device_sn);
  1332. goto GATEWAY_COLL_0x6C;
  1333. }
  1334. g_loraCollMsg.lora_rcvCount++;
  1335. g_loraCollMsg.info[node].rcvNum++;
  1336. lorastatus = (int)*(data+p_tax_tx->len+GATE_COLL_HEAD_LEN+1);
  1337. lorastatus = (lorastatus<<8) | ((int)*(data+p_tax_tx->len+GATE_COLL_HEAD_LEN));
  1338. g_runData.collrunMsg[node].lorastatus =lorastatus;
  1339. g_runData.collrunMsg[node].checkNum = 0;
  1340. if(fcrc != crc ){//校验位不对则返回
  1341. printf("cmd0x6C: crc error\r\n");
  1342. goto GATEWAY_COLL_0x6C;
  1343. }
  1344. if(p_tax_tx->taxinfo.encoderda.device_type != 0x0501){ // 处理编译器的数据
  1345. goto GATEWAY_COLL_0x6C;
  1346. }
  1347. port = read_tax_index(node,p_tax_tx->taxinfo.encoderda.tax_no); //查询报税口编号
  1348. if(port == 0xFF) {goto GATEWAY_COLL_0x6C;}
  1349. if(p_tax_tx->taxinfo.encoderda.status==2){
  1350. printf("recv 0x6C : sn = %010d, targetType = 0x%04x timeout_noreturn\r\n",p_tax_tx->taxinfo.encoderda.device_sn,p_tax_tx->taxinfo.encoderda.device_type);
  1351. goto GATEWAY_COLL_0x6C;
  1352. }
  1353. else if(p_tax_tx->taxinfo.encoderda.status == 4) {
  1354. printf("recv 0x6C : sn = %010d, error = %d\r\n",p_tax_tx->taxinfo.encoderda.device_sn,4);
  1355. goto GATEWAY_COLL_0x6C;
  1356. }
  1357. else if(p_tax_tx->taxinfo.encoderda.status == 5) {
  1358. printf("recv 0x6C : sn = %010d, error = %d\r\n",p_tax_tx->taxinfo.encoderda.device_sn,5);
  1359. goto GATEWAY_COLL_0x6C;
  1360. }
  1361. sn = p_tax_tx->taxinfo.encoderda.device_sn;
  1362. portNo = p_tax_tx->taxinfo.encoderda.tax_no;
  1363. gunNo = p_tax_tx->taxinfo.encoderda.gun_msgid;
  1364. // msg = (encoderDa_00*)p_tax_tx->taxinfo.encoderda.info;
  1365. bnewCode = p_tax_tx->taxinfo.encoderda.info[3];// 有无新记录
  1366. if((downlink_config.bInstallFinish==INSTALL_5A) || (bnewCode != 0)){
  1367. memset(send_buf,0,sizeof(send_buf));
  1368. uplink_encoder_data0x2051(send_buf,&sendlen,node,portNo,gunNo,p_tax_tx->taxinfo.encoderda.dataLen, (uint8_t*)p_tax_tx->taxinfo.encoderda.info);
  1369. tax_net_send(send_buf,sendlen,FIRST_TYPE_DATA,COLL_ENCODER_DA_CMD_UP);
  1370. printf(" send 0x6c data to server \r\n");
  1371. }
  1372. printf("recv 0x6C : sn = %010u, coll=%d, port=%d, bNewcode=%d,gunstatus01=%d, gunstatus02=%d \r\n",\
  1373. sn,node,portNo,bnewCode,p_tax_tx->taxinfo.encoderda.info[1],p_tax_tx->taxinfo.encoderda.info[2] );
  1374. node = nodeConf.nodeIndex;
  1375. port = nodeConf.taxconf[node].portIndex;
  1376. msg = &(nodeConf.taxconf[node].port[port].enMsg[g_encodeOpt.curIndex]);
  1377. if(portNo==1){ // 报税口1
  1378. if((msg->da.gunstatus&p_tax_tx->taxinfo.encoderda.info[1])==0){ //抬挂枪状态 1:抬枪状态,代表加油 0:挂枪状态,代表未加油
  1379. nodeConf.taxconf[node].port[port].portRead += 1;
  1380. }
  1381. else nodeConf.taxconf[node].port[port].portRead = 0;
  1382. // printf("11,node = %d,port= %d,portread = %d\r\n",node,port,nodeConf.taxconf[node].port[port].portRead);
  1383. }
  1384. else if(portNo == 2) { // 报税口2
  1385. if((msg->da.gunstatus&p_tax_tx->taxinfo.encoderda.info[2])==0){ //抬挂枪状态
  1386. nodeConf.taxconf[node].port[port].portRead += 1;
  1387. }
  1388. else
  1389. nodeConf.taxconf[node].port[port].portRead = 0;
  1390. // printf("22,node = %d,port= %d,portread = %d\r\n",node,port,nodeConf.taxconf[node].port[port].portRead);
  1391. }
  1392. if(g_logCfigDa.bEnable)
  1393. timeout_start(&g_taxDataTime);
  1394. GATEWAY_COLL_0x6C:
  1395. timeout_stop(&g_taxSendTime);
  1396. return 0;
  1397. }
  1398. /*---------------------------------------------------------------------
  1399. * 透传指令 0x01----0x2052,2053
  1400. * -------------------------------------------------------------------*/
  1401. int collect_rcv_analyze0x01_0x2052(uint16_t cmd,uint8_t *data, uint8_t len)
  1402. {
  1403. printf("收到指令:0x01---0x%04x\n",cmd);
  1404. tax_net_send_0x01_0x1052(data,len);
  1405. timeout_stop(&g_taxSendTime);
  1406. return 0;
  1407. }
  1408. /*-----------------------------------
  1409. * 向服务器发送网关的信息
  1410. * ----------------------------------*/
  1411. void gateway_net_send_gatewayMsg(void)
  1412. {
  1413. uint8_t sendBuff[160];
  1414. uint8_t sendLen = 0;
  1415. static uint8_t bfirstPowerup = 0;
  1416. if((bfirstPowerup == 0) || (g_runData.bsendgatewayfirmMsg ==1) && (air.State.MQTT_State==1)){
  1417. uplink_tax_statusmcmd_0x2001(sendBuff,&sendLen,DEVICE_GATEWAY,0);
  1418. tax_net_send(sendBuff,sendLen,FIRST_TYPE_STATUS,COLL_UP_STATUS_CMD2001);
  1419. bfirstPowerup = 1;
  1420. g_runData.bsendgatewayfirmMsg = 0;
  1421. printf("send gateway msg to server\r\n");
  1422. }
  1423. return;
  1424. }