downlink.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087
  1. #include "downlink.h"
  2. #include "uplink.h"
  3. #include "device.h"
  4. #include "gateway.h"
  5. #include "../network_mgr/net_proc.h"
  6. #include "../tax/tax.h"
  7. #include "../../User/includes.h"
  8. #include "../storage/AT24c128.h"
  9. #include "../gateway_collect/gateway_collect.h"
  10. #include "../dev_mgr/taxctrl/tax_ctrl.h"
  11. #include "../globalDef.h"
  12. #include "../storage/AT24C128Opt.h"
  13. #include "../network_mgr/net_ctrl.h"
  14. #include "nettimer.h"
  15. #include "../network_mgr/sx1268/lora.h"
  16. #include "me3616.h"
  17. #include "../encode/encodeOpt.h"
  18. #include "../toolkit/CH455G.h"
  19. extern ME3616 air;
  20. downlink_config_t downlink_config;
  21. void downlink_init(void)
  22. {
  23. int ret;
  24. int i,j;
  25. // uint32_t flag = 0;
  26. uint8_t taxCount = 0;
  27. memset(&downlink_config.collect_conf,0,sizeof(downlink_config.collect_conf));
  28. memset(&rcv_data_temp,0,sizeof(rcv_data_temp));
  29. sprintf(g_upLinkTopic,"%s%04x/%010u",(char*)MQTT_UPLINK_TOPIC,GATEWAY_DEVICE_TYPE, g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn);
  30. sprintf(g_logupLinkTopic,"%s%04x/%010u",(char*)MQTT_LOGUPLINK_TOPIC,GATEWAY_DEVICE_TYPE, g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn);
  31. fram_read_config_msg();
  32. printf("config_flag:%d,gateway_id:%010u,collect_num:%d\n",downlink_config.config_flag,downlink_config.gateway_id,downlink_config.collect_num);
  33. if(downlink_config.config_flag == CONFIG_WRITE)
  34. {
  35. fram_read_collect_msg();
  36. if((g_encoderDa.bhaveEncoder == 1) && (g_encodeOpt.benable==1)){
  37. fram_read_encoder_configMsg();
  38. fram_read_encoder_msg();
  39. }
  40. ret = gateway_collect_init();
  41. encoder_printf();
  42. if(ret)
  43. {
  44. downlink_config.config_flag = 0;
  45. }
  46. if(downlink_config.collect_num == 0xFF) downlink_config.collect_num = 0;
  47. for(i=0;i<downlink_config.collect_num;i++){ // 初始化采集器的SN号
  48. g_firmwareMsg.collMsg[i].device_sn = downlink_config.collect_conf[i].collect_no;
  49. downlink_config.collect_conf[i].coll_send_num = 0;
  50. downlink_config.collect_conf[i].collect_status = 0;
  51. g_readCmd83.checknum[i][0] = 0;
  52. g_readCmd83.checknum[i][1] = 0;
  53. for(j=0;j<2;j++){
  54. if(downlink_config.collect_conf[i].tax_conf[j].status) taxCount++;
  55. }
  56. set_led_status(i,1);
  57. printf("coll_%02d = %010u\r\n",i,downlink_config.collect_conf[i].collect_no);
  58. }
  59. init_gun_status();
  60. g_runData.firstReadNum = downlink_config.collect_num*taxCount*4;
  61. g_ledStatus.collNum = g_ledStatus.led16.status;
  62. g_runData.bfirstSend0x56 = 1;
  63. g_runData.timeSendStatus = 3;
  64. g_runData.bUpdate = 0;
  65. g_readCmd83.nodeCur = 0;
  66. g_readCmd83.portCur = 0;
  67. g_readCmd83.stauts[0] = 0;
  68. g_readCmd83.stauts[1] = 0;
  69. g_readCmd56.nodeCur = 0;
  70. g_runData.collerr = 0;
  71. init_queue(&g_cmdInfo83);
  72. init_comm_queue();
  73. }
  74. }
  75. static void downlink_config_init(uint8_t step,uint8_t flag,uint8_t configNo)
  76. {
  77. int i=0,j=0;
  78. if(step == CONFIG_STEP_01) {
  79. downlink_config.config_flag = CONFIG_WRITE;
  80. g_runData.bReadData = 0;
  81. g_runData.bfirstSend0x56 = 0;
  82. g_runData.bfirstRead0x83 = 0;
  83. g_runData.bRead0x58 = 0;
  84. g_runData.read1053Num = 0;
  85. g_runData.ballowRead58 = 0;
  86. g_runData.bsendUpdateStatus = 0;
  87. g_readCmd58.nodeCur = 0;
  88. g_readCmd58.stauts[0] = 0;
  89. g_runData.collstatus = 0x0000;
  90. g_readCmd83.stauts[0] = 0;
  91. g_readCmd83.stauts[1] = 0;
  92. g_readCmd83.nodeCur = 0;
  93. g_readCmd83.portCur = 0;
  94. for(i=0;i<16;i++){
  95. for(j=0;j<2;j++) g_readCmd83.checknum[i][j] = 0;
  96. g_runData.collrunMsg[i].checkNum = 0;
  97. }
  98. g_firmwareMsg.gatewayMsg.configmsg.time_interval = 0;
  99. g_firmwareMsg.gatewayMsg.configmsg.configNo = configNo;
  100. g_firmwareMsg.gatewayMsg.configmsg.coll_num = downlink_config.collect_num;
  101. g_firmwareMsg.gatewayMsg.configmsg.bInitMsg.bInit.bConfig_qei = g_encoderDa.bhaveEncoder;
  102. fram_init_collect_msg();
  103. fram_write_config_msg(flag);
  104. fram_write_collect_msg();
  105. gateway_collect_init();
  106. downlink_config.config_flag = flag&0x0F;
  107. g_runData.timeSendStatus = 3;
  108. g_runData.bUpdate = 0;
  109. // g_runData.bfirstReadTax = 0;
  110. init_queue(&g_cmdInfo83);
  111. init_comm_queue();
  112. init_gun_status();
  113. g_runData.bfirstSend0x56 = 1;
  114. }
  115. // downlink_config.config_xsp = (flag>>4)&0x0F;
  116. }
  117. #if(0)
  118. int downlink_gateway_para(uint8_t *data, uint16_t len)
  119. {
  120. int ret=-1;
  121. int i,j,k;
  122. downlinkSysCmd0x1011 *p_msg = NULL;
  123. uint16_t flag = 0x01;
  124. // uint8_t flag1 = 0;
  125. // uint8_t *tempdata;
  126. // tempdata = data+5;
  127. p_msg = (downlinkSysCmd0x1011 *)data;
  128. return 0;
  129. if(p_msg->configNo == g_firmwareMsg.gatewayMsg.configmsg.configNo) {
  130. printf("\r\n the same config, not init\r\n");
  131. return 0;
  132. }
  133. printf("\r\n 0x1011 recv config = %d, eppromconfig = %d\r\n",p_msg->configNo,g_firmwareMsg.gatewayMsg.configmsg.configNo);
  134. memset(&downlink_config,0,sizeof(downlink_config));
  135. downlink_config.gateway_id = p_msg->gateway_id;
  136. downlink_config.collect_num = p_msg->collect_num;
  137. g_firmwareMsg.gatewayMsg.configmsg.coll_num = p_msg->collect_num;
  138. if(p_msg->collect_num > COLLECT_MAX_NUM) //采集器个数大于最大值,数据错误,直接返回
  139. return ret;
  140. for(i=0;i<p_msg->collect_num;i++){
  141. downlink_config.collect_conf[i].collect_no = p_msg->cfigMsg[i].collectSn;
  142. g_firmwareMsg.collMsg[i].device_sn = p_msg->cfigMsg[i].collectSn;
  143. downlink_config.collect_conf[i].collect_status = 0;
  144. downlink_config.collect_conf[i].tax_num = 2;
  145. for(j=0;j<2;j++){
  146. downlink_config.collect_conf[i].tax_conf[j].tax_id = j+1;
  147. downlink_config.collect_conf[i].tax_conf[j].gun_num = 0;
  148. downlink_config.collect_conf[i].tax_conf[j].encryption = p_msg->cfigMsg[i].comEncrypt[j];
  149. for(k=0;k<8;k++){
  150. downlink_config.collect_conf[i].tax_conf[j].gunid[k] = k+1;
  151. }
  152. }
  153. }
  154. downlink_config.config_flag = CONFIG_WRITE;
  155. g_runData.bfirstSend0x56 = 1;
  156. g_runData.bfirstRead0x83 = 0;
  157. g_runData.bRead0x58 = 0;
  158. g_runData.bsendUpdateStatus = 0;
  159. g_readCmd58.nodeCur = 0;
  160. g_readCmd58.stauts[0] = 0;
  161. g_runData.bReadData = 0;
  162. g_runData.collstatus = 0x0000;
  163. g_readCmd83.stauts[0] = 0;
  164. g_readCmd83.stauts[1] = 0;
  165. g_readCmd83.nodeCur = 0;
  166. g_readCmd83.portCur = 0;
  167. for(i=0;i<16;i++){
  168. for(j=0;j<2;j++) g_readCmd83.checknum[i][j] = 0;
  169. g_runData.collrunMsg[i].checkNum = 0;
  170. }
  171. g_firmwareMsg.gatewayMsg.configmsg.time_interval = 2;
  172. g_firmwareMsg.gatewayMsg.configmsg.configNo = p_msg->configNo;
  173. fram_init_collect_msg();
  174. fram_write_config_msg(flag);
  175. fram_write_collect_msg();
  176. downlink_config.config_flag = flag;
  177. g_runData.timeSendStatus = 3;
  178. g_runData.bUpdate = 0;
  179. init_queue(&g_cmdInfo83);
  180. NVIC_SystemReset();//复位
  181. return 0;
  182. }
  183. #endif
  184. /*--------------------------------------------------------------
  185. * 刷新税控序列号0x1012
  186. * --------------------------------------------------------------*/
  187. void downlink_analyze_system_cmd0x1012(uint8_t *data,uint16_t size)
  188. {
  189. uint8_t index = 0;
  190. uint8_t num = 0;
  191. downlinkSysCmd0x1012 *p_msg = NULL;
  192. p_msg = (downlinkSysCmd0x1012*)data;
  193. if(p_msg->gateway_sn != downlink_config.gateway_id){ // 不是发给本网关的消息
  194. return ;
  195. }
  196. num = downlink_config.collect_num;
  197. index = read_collect_index(p_msg->coll_sn); //根据采集器的SN号,查找采集器的编号
  198. if(index >= downlink_config.collect_num) return;
  199. g_runData.bfirstRead0x83 = 1;
  200. g_readCmd83.nodeCur = index;
  201. g_readCmd83.portCur = p_msg->tax_no-1;
  202. // downlink_config.collect_conf[index].tax_conf[p_msg->tax_no-1].alrd_sn = 0;
  203. nodeConf.taxconf[index].port[p_msg->tax_no-1].alrd_sn = 0;
  204. g_readCmd83.stauts[0] = (uint16_t)(pow(2,num)-1);
  205. g_readCmd83.stauts[1] = g_readCmd83.stauts[0];
  206. g_readCmd83.stauts[0] = (g_readCmd83.stauts[0] & (~(0x01<<index)));
  207. g_readCmd83.stauts[1] = (g_readCmd83.stauts[1] & (~(0x01<<index)));
  208. }
  209. /*--------------------------------------------------------------
  210. * 设备重新启动 0x1021
  211. * --------------------------------------------------------------*/
  212. void downlink_analyze_system_cmd0x1021(uint8_t *data,uint16_t size)
  213. {
  214. downlinkSysCmd0x1021 *p_msg = NULL;
  215. p_msg = (downlinkSysCmd0x1021*)data;
  216. switch(p_msg->targetType){
  217. case 0x0101: // 网关
  218. if(p_msg->sn != downlink_config.gateway_id) break;
  219. NVIC_SystemReset();//复位//设备重新启动
  220. break;
  221. case 0x0201: case 0x0202:// 采集器
  222. gateway_collect_set_cmd0x59(0,p_msg->sn);
  223. g_runData.bfirstSend0x56 = 1;
  224. break;
  225. case 0x0301: // 液位仪采集器
  226. break;
  227. case 0x0401: // 显示器
  228. break;
  229. case 0x0601: // 加密模块
  230. gateway_collect_set_cmd0x5D(0,p_msg->sn,0x0601,0x01);
  231. g_runData.bfirstSend0x56 = 1;
  232. break;
  233. }
  234. }
  235. /*--------------------------------------------------------------
  236. * 时间轮询
  237. * -------------------------------------------------------------*/
  238. void downlink_analyze_system_cmd0x1013(uint8_t *data)
  239. {
  240. downlinkSysCmd0x1013 *p_msg = NULL;
  241. p_msg = (downlinkSysCmd0x1013*)data;
  242. if((p_msg->gateway_sn == downlink_config.gateway_id) || ( p_msg->gateway_sn==0xFFFFFFFF) ){
  243. timeout_setValue(&g_timeOut,p_msg->time_interval*1000);
  244. g_firmwareMsg.gatewayMsg.configmsg.time_interval = p_msg->time_interval;
  245. fram_write_config_msg(2);
  246. g_runData.bInstallFinish = 0xA5;
  247. }
  248. }
  249. /*--------------------------------------------------------------
  250. * lora 信道参数切换
  251. * -------------------------------------------------------------*/
  252. void downlink_analyze_system_cmd0x1016(uint8_t *data, uint16_t size)
  253. {
  254. downlinkSysCmd0x1016 *p_msg = NULL;
  255. uint32_t sn = 0 ;
  256. uint8_t i = 0;
  257. g_loraCollMsg.collNum = data[4];
  258. data[4] = 0;
  259. sn = *((uint32_t*)data);
  260. if(sn != downlink_config.gateway_id) return;
  261. for(i=0;i<g_loraCollMsg.collNum;i++){
  262. g_loraCollMsg.info[i].coll_sn = *((uint32_t*)(data+5+i*4));
  263. g_loraCollMsg.info[i].loraindex = 5;
  264. }
  265. p_msg = (downlinkSysCmd0x1016*)(data + i*4+5);
  266. g_runData.nextlorIndex = p_msg->loraIndex;
  267. g_runData.bchangelora = 1;
  268. g_loraCollMsg.step = 1;
  269. }
  270. /*--------------------------------------------------------------
  271. * lora 信道参数读取
  272. * -------------------------------------------------------------*/
  273. void downlink_analyze_system_cmd0x1017(uint8_t *data, uint16_t size)
  274. {
  275. uint8_t sendBuff[160];
  276. uint8_t sendLen = 0;
  277. downlinkSysCmd0x1017 *p_msg = NULL;
  278. p_msg = (downlinkSysCmd0x1017*)data;
  279. if(p_msg->gateway_sn != downlink_config.gateway_id) return;
  280. uplink_update_systemcmd_0x2017(sendBuff,&sendLen,0xFFFFFFFF,1,g_runData.curloraIndex);
  281. tax_net_send(sendBuff,sendLen,FIRST_TYPE_STATUS,COLL_UP_SYS_CMD2017);
  282. }
  283. /*--------------------------------------------------------------
  284. * 手动读取税控序列号 0x1018
  285. * -------------------------------------------------------------*/
  286. void downlink_analyze_system_cmd0x1018(uint8_t *data, uint16_t size)
  287. {
  288. uint8_t num = 0, i=0;
  289. downlinkSysCmd0x1018 *p_msg = NULL;
  290. p_msg = (downlinkSysCmd0x1018*)data;
  291. printf("rcv 1018 cmd pa = %d\r\n",p_msg->prara);
  292. printf("msgSN = %010u , id = %010u\r\n",p_msg->gateway_sn,downlink_config.gateway_id);
  293. if(p_msg->gateway_sn != downlink_config.gateway_id) return;
  294. printf("sn right\r\n");
  295. if(p_msg->prara==1){
  296. g_readCmd83.nodeCur = 0;
  297. g_readCmd83.portCur = 0;
  298. num = downlink_config.collect_num;
  299. for(i = 0; i<num; i++) {
  300. // downlink_config.collect_conf[i].tax_conf[0].alrd_sn = 0;
  301. // downlink_config.collect_conf[i].tax_conf[1].alrd_sn = 0;
  302. nodeConf.taxconf[i].port[0].alrd_sn = 0;
  303. nodeConf.taxconf[i].port[1].alrd_sn = 0;
  304. }
  305. g_readCmd83.stauts[0] = 0;
  306. g_readCmd83.stauts[1] = 0;
  307. g_runData.bfirstRead0x83 = 1;
  308. }
  309. else {
  310. printf("param = 2\r\n");
  311. en_queue_cmd83(&g_cmdInfo83,p_msg->coll_sn,p_msg->prara,p_msg->taxNo,1);
  312. g_cmdInfo83.bread83 = 1;
  313. }
  314. }
  315. /*--------------------------------------------------------------
  316. * 解析网络下发的 系统类(0x01)的 0x1002指令 连接器版本同步
  317. * -------------------------------------------------------------*/
  318. void downlink_analyze_system_cmd0x1002(uint8_t *data,uint16_t size)
  319. {
  320. uint32_t sn = 0;
  321. sn = *((uint32_t*)data);
  322. if(sn != downlink_config.gateway_id) return;
  323. gateway_send_update_collect_up_collect(&sys_net,data+4,size-4-2); // data+4因为 前面4个字节为SN,后面的数据可以直接传
  324. }
  325. /*--------------------------------------------------------------
  326. * 解析网络下发的 系统类(0x01)的 0x1003指令 切换mqtt服务器
  327. * -------------------------------------------------------------*/
  328. void downlink_analyze_system_cmd0x1003(uint8_t *data,uint16_t size)
  329. {
  330. uint8_t len = 0;
  331. downlinkSysCmd0x1003 *msg = NULL;
  332. msg = (downlinkSysCmd0x1003*)data;
  333. if(msg->gateway_sn != downlink_config.gateway_id) return;
  334. // if(msg->targettype != GATEWAY_DEVICE_TYPE) return;
  335. memset(&(g_mqttRunDa.mqttMsg),0,sizeof(MqttIdPort));
  336. memcpy(g_mqttRunDa.mqttMsg.ip,msg->str,msg->iplen);
  337. len = msg->iplen;
  338. memcpy(g_mqttRunDa.mqttMsg.port,msg->str+len,msg->portlen);
  339. len += msg->portlen;
  340. memcpy(g_mqttRunDa.mqttMsg.admin,msg->str+len,msg->userlen);
  341. len += msg->userlen;
  342. memcpy(g_mqttRunDa.mqttMsg.password,msg->str+len,msg->pwdlen);
  343. g_mqttRunDa.mqttIdlen = msg->iplen;
  344. g_mqttRunDa.mqttPortlen = msg->portlen;
  345. g_mqttRunDa.mqttUserlen = msg->userlen;
  346. g_mqttRunDa.mqttPwdlen = msg->pwdlen;
  347. close_tcp_mqtt();
  348. g_mqttRunDa.bChangeMqtt = 1;
  349. air.State.MQTT_State= 0;
  350. g_data4G.flag = 0;
  351. timeout_stop(&g_usmTimeOut);
  352. //g_mqttRunDa.bChangeSuc = 0;
  353. g_mqttRunDa.connectNum = 0;
  354. g_runData.cregStatus = 0;
  355. }
  356. /*--------------------------------------------------------------
  357. * 1019 配置的第一步
  358. * 确定采集器的个数以及SN ,(即确定采集器的路由表)
  359. * -------------------------------------------------------------*/
  360. int init_collect_table(void *data,uint8_t step)
  361. {
  362. int ret=-1;
  363. int i,j,k;
  364. downlink0x1019_01 *p_msg = NULL;
  365. uint16_t flag = 0x01;
  366. p_msg = (downlink0x1019_01 *)data;
  367. // printf("\r\n 0x1011 recv config = %d, eppromconfig = %d\r\n",p_msg->configNo,g_firmwareMsg.gatewayMsg.configmsg.configNo);
  368. g_runData.bReadData = 0;
  369. downlink_config.collect_num = p_msg->collect_num;
  370. g_firmwareMsg.gatewayMsg.configmsg.coll_num = p_msg->collect_num;
  371. g_encoderDa.bhaveEncoder = p_msg->bencoder;
  372. if(p_msg->collect_num > COLLECT_MAX_NUM) //采集器个数大于最大值,数据错误,直接返回
  373. return ret;
  374. for(i=0;i<p_msg->collect_num;i++){
  375. downlink_config.collect_conf[i].collect_no = p_msg->cfigMsg[i].collectSn;
  376. g_firmwareMsg.collMsg[i].device_sn = p_msg->cfigMsg[i].collectSn;
  377. downlink_config.collect_conf[i].collect_status = 0;
  378. downlink_config.collect_conf[i].tax_num = 2;
  379. for(j=0;j<2;j++){
  380. downlink_config.collect_conf[i].tax_conf[j].tax_id = j+1;
  381. downlink_config.collect_conf[i].tax_conf[j].gun_num = 0;
  382. downlink_config.collect_conf[i].tax_conf[j].encryption = p_msg->cfigMsg[i].comEncrypt[j];
  383. for(k=0;k<8;k++){
  384. downlink_config.collect_conf[i].tax_conf[j].gunid[k] = k+1;
  385. }
  386. }
  387. }
  388. downlink_config_init(1,flag,step);
  389. // g_xspDa.xspcfig.configStep = step;
  390. return 0;
  391. }
  392. /* 更新编码器的表 */
  393. static void update_encoder_table_step_04(uint8_t *index,uint8_t *data,uint8_t step)
  394. {
  395. volatile uint8_t i=0,j=0;
  396. // int ret = -1;
  397. // uint8_t priceid = 0;
  398. downlink0x1019_04 *p_msg = NULL;
  399. p_msg = (downlink0x1019_04*)data;
  400. printf("groutno = %d",p_msg->groupNo);
  401. if(step == CONFIG_STEP_04){ //
  402. for(i=0;i<p_msg->groupNo;i++){
  403. g_encodeOpt.tableDa[*index].da.dcollId = p_msg->da[i].daColl;
  404. g_encodeOpt.tableDa[*index].da.dportId = p_msg->da[i].daPort;
  405. g_encodeOpt.tableDa[*index].da.dgunId = p_msg->da[i].daGun;
  406. g_encodeOpt.tableDa[*index].da.bcollId = p_msg->da[i].busColl;
  407. g_encodeOpt.tableDa[*index].da.bportId = p_msg->da[i].busPort;
  408. g_encodeOpt.tableDa[*index].da.bgunId = p_msg->da[i].busGun;
  409. (*index)++;
  410. printf("dcoll = %d, dprot = %d, dgun = %d, bcoll = %d, bprot = %d, bgun = %d\r\n",\
  411. g_encodeOpt.tableDa[i].da.dcollId,g_encodeOpt.tableDa[i].da.dportId,g_encodeOpt.tableDa[i].da.dgunId,\
  412. g_encodeOpt.tableDa[i].da.bcollId,g_encodeOpt.tableDa[i].da.bportId,g_encodeOpt.tableDa[i].da.bgunId);
  413. }
  414. }
  415. /* else if(step == CONFIG_STEP_03){ // 第三步,更新显示屏表
  416. for(i=0;i<p_msg->groupNo;i++){
  417. if(*index == 0){
  418. g_xspDa.xspDa[*index].configDa.xspmsg.xsp_sn = p_msg->_xspMsg[i].xsp_sn;
  419. g_xspDa.xspDa[*index].configDa.xspmsg.cbusId = p_msg->_xspMsg[i].cbusId;
  420. g_xspDa.xspDa[*index].configDa.xspmsg.cdaId = p_msg->_xspMsg[i].cdaId;
  421. g_xspDa.xspDa[*index].configDa.xspmsg.portid = p_msg->_xspMsg[i].portid;
  422. priceid = p_msg->_xspMsg[i].priceid;
  423. g_xspDa.xspDa[*index].configDa.xspmsg.gunid[priceid] = p_msg->_xspMsg[i].gunid;
  424. // g_xspDa.xspDa[*index].configDa.xspmsg.gunPri[0].priceid = p_msg->_xspMsg[i].priceid;
  425. g_xspDa.xspDa[*index].configDa.priceNum = 1;
  426. (*index)++;
  427. }
  428. else {
  429. ret = check_xsp_table_repeat_sn(*index,p_msg->_xspMsg[i].xsp_sn);
  430. if(ret == -1){ // 显示屏的SN没有重复的
  431. g_xspDa.xspDa[*index].configDa.xspmsg.xsp_sn = p_msg->_xspMsg[i].xsp_sn;
  432. g_xspDa.xspDa[*index].configDa.xspmsg.cbusId = p_msg->_xspMsg[i].cbusId;
  433. g_xspDa.xspDa[*index].configDa.xspmsg.cdaId = p_msg->_xspMsg[i].cdaId;
  434. g_xspDa.xspDa[*index].configDa.xspmsg.portid = p_msg->_xspMsg[i].portid;
  435. priceid = p_msg->_xspMsg[i].priceid;
  436. g_xspDa.xspDa[*index].configDa.xspmsg.gunid[priceid] = p_msg->_xspMsg[i].gunid;
  437. g_xspDa.xspDa[*index].configDa.priceNum = 1;
  438. (*index)++;
  439. }
  440. else { // 显示屏的SN有重复的,处理单价屏
  441. j = g_xspDa.xspDa[ret].configDa.priceNum;
  442. priceid = p_msg->_xspMsg[i].priceid;
  443. g_xspDa.xspDa[ret].configDa.xspmsg.gunid[priceid] = p_msg->_xspMsg[i].gunid;
  444. g_xspDa.xspDa[*index].configDa.priceNum++;
  445. }
  446. }
  447. }
  448. }*/
  449. }
  450. void init_encoder_table_step_04(uint8_t *data,uint8_t step)
  451. {
  452. static uint8_t groupId = 0;
  453. downlink0x1019_04 *p_msg = NULL;
  454. uint8_t sendbuff[256] = {0},sendlen = 0;
  455. p_msg = (downlink0x1019_04 *)data;
  456. if(p_msg->frame_no==0xFF){ /* 表示单帧 */
  457. if(step == CONFIG_STEP_04){ // 单帧第一步时要清零
  458. memset(&g_encodeOpt,0,sizeof(encodeMsg));
  459. }
  460. groupId = 0;
  461. update_encoder_table_step_04(&groupId,data,step);
  462. g_encodeOpt.encodenum = groupId; // 编码器的个数
  463. }
  464. else if((p_msg->frame_no&0x80) == 0x80) {/* 为多帧且为第一帧 */
  465. memset(&g_encodeOpt,0,sizeof(encodeMsg));
  466. groupId = 0;
  467. update_encoder_table_step_04(&groupId,data,step);
  468. }
  469. else if((p_msg->frame_no&0x0F) != 0x01) { /* 多帧的后续帧 */
  470. update_encoder_table_step_04(&groupId,data,step);
  471. }
  472. else { /* 多帧的最后一帧 */
  473. update_encoder_table_step_04(&groupId,data,step);
  474. g_encodeOpt.encodenum = groupId; // 显示屏的个数
  475. }
  476. if((p_msg->frame_no==0xFF) || (p_msg->frame_no&0x01) == 0x01){ //单帧或是最后一帧
  477. if(step == CONFIG_STEP_04) {
  478. gateway_collect_init();
  479. fram_write_encoder_configMsg();
  480. fram_write_encoder_msg();
  481. if(g_encodeOpt.encodenum!=0) {
  482. g_firmwareMsg.gatewayMsg.configmsg.bInitMsg.bInit.benable_qei = 1;
  483. g_encodeOpt.benable = 1;
  484. fram_write_config_msg(0);
  485. encoder_printf();
  486. uplink_tax_statusmcmd_0x2002(sendbuff,&sendlen,DEVICE_GATEWAY,0); //网关的状态信息上报
  487. tax_net_send(sendbuff,sendlen,FIRST_TYPE_STATUS,COLL_UP_STATUS_CMD2002);
  488. }
  489. //downlink_config.config_xsp = (0x11>>4)&0x0F;
  490. /*gateway_collect_init();
  491. fram_write_xsp_configMsg();
  492. fram_write_xsp_msg();
  493. fram_write_config_msg(0x11);*/
  494. }
  495. }
  496. }
  497. void downlink_analyze_system_cmd0x1019(uint8_t *data,uint16_t size)
  498. {
  499. volatile uint8_t i=0,j=0,k=0,flag=0x11;
  500. // uint32_t collsn[64];
  501. // static uint8_t groupId = 0;
  502. downlinkSyscmd0x1019 *p_msg = NULL;
  503. p_msg = (downlinkSyscmd0x1019*)data;
  504. printf("sn = %010u, step = %d\r\n",p_msg->gateway_sn,p_msg->step);
  505. if(p_msg->gateway_sn != downlink_config.gateway_id){ // 不是发给本网关的消息
  506. return ;
  507. }
  508. if(p_msg->step == CONFIG_STEP_01){
  509. memset(&downlink_config,0,sizeof(downlink_config));
  510. g_encodeOpt.encodenum = 0;
  511. g_encoderDa.bhaveEncoder = p_msg->da.step1.bencoder;
  512. downlink_config.bInstallFinish = INSTALL_5A;// 安装第一步
  513. downlink_config.gateway_id = g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn;
  514. printf("\r\n config step 01\r\n");
  515. init_collect_table((void*)(&p_msg->da.step1),p_msg->step);
  516. g_firmwareMsg.gatewayMsg.configmsg.bInitMsg.bInit.benable_qei = 0;
  517. g_encodeOpt.benable = 0;
  518. fram_write_config_msg(0);
  519. }
  520. else if(p_msg->step == CONFIG_STEP_04){ // 配置第四步 编码器路由表初始化
  521. init_encoder_table_step_04((void*)(&p_msg->da.step4),p_msg->step);
  522. printf("\r\n confige step 4 encodernum = %d\r\n",g_encodeOpt.encodenum);
  523. }
  524. else if(p_msg->step == CONFIG_STEP_05) { // 配置第五步, 配置编码器使能
  525. printf("\r\n confige step %d, value = %d\r\n",p_msg->step,p_msg->da.step5.enableTime);
  526. if(p_msg->da.step5.enableTime == 0xFF){ // 永久使用编码器
  527. encoder_timer_stop();
  528. g_encoderDa.bhaveEncoder = 0x01;
  529. g_firmwareMsg.gatewayMsg.configmsg.bInitMsg.bInit.bConfig_qei = g_encoderDa.bhaveEncoder;
  530. fram_write_config_msg(0);
  531. }
  532. else if(p_msg->da.step5.enableTime == 0x00 ){ // 不使用编码器
  533. g_encoderDa.bhaveEncoder = 0x00;
  534. g_firmwareMsg.gatewayMsg.configmsg.bInitMsg.bInit.bConfig_qei = g_encoderDa.bhaveEncoder;
  535. fram_write_config_msg(0);
  536. }
  537. else { // 定时使用编码器,时间为分钟
  538. g_encoderDa.bhaveEncoder = 0x01;
  539. encoder_timer_start(p_msg->da.step5.enableTime);
  540. }
  541. }
  542. else if(p_msg->step == CONFIG_STEP_09) { // 配置最后下 即配置完成
  543. printf("\r\n config step 09\r\n");
  544. downlink_config.bInstallFinish = 0;//
  545. }
  546. }
  547. /*--------------------------------------------------------------
  548. * 配置报税口的枪的个数0x1020
  549. * --------------------------------------------------------------*/
  550. void downlink_analyze_system_cmd0x1020(uint8_t *data,uint16_t size)
  551. {
  552. uint8_t i = 0;
  553. downlinkSysCmd0x1020 *p_msg = NULL;
  554. // return;
  555. p_msg = (downlinkSysCmd0x1020*)data;
  556. if(p_msg->gateway_sn != downlink_config.gateway_id){ // 不是发给本网关的消息
  557. return ;
  558. }
  559. for(i=0;i<downlink_config.collect_num;i++){
  560. if(p_msg->coll_sn==downlink_config.collect_conf[i].collect_no) break;
  561. }
  562. if(p_msg->taxNo01 > 0) {
  563. downlink_config.collect_conf[i].tax_conf[0].gun_num = p_msg->gunNum01;
  564. }
  565. if(p_msg->taxNo02 > 0) {
  566. downlink_config.collect_conf[i].tax_conf[1].gun_num = p_msg->gunNum02;
  567. }
  568. fram_write_collect_msg();
  569. init_gun_status();
  570. }
  571. /*--------------------------------------------------------------
  572. * 编码器路由表是否启用
  573. * -------------------------------------------------------------*/
  574. void downlink_analyze_system_cmd0x1022(uint8_t *data)
  575. {
  576. downlinkSysCmd0x1022 *p_msg = NULL;
  577. uint8_t sendbuff[256] = {0},sendlen = 0;
  578. p_msg = (downlinkSysCmd0x1022*)data;
  579. printf("1022 recve\r\n");
  580. if((p_msg->gateway_sn == downlink_config.gateway_id) || ( p_msg->gateway_sn==0xFFFFFFFF) ){
  581. g_firmwareMsg.gatewayMsg.configmsg.bInitMsg.bInit.benable_qei = p_msg->benable;
  582. g_encodeOpt.benable = p_msg->benable;
  583. fram_write_config_msg(0);
  584. printf("msg 1022 config sucess\r\n");
  585. uplink_tax_statusmcmd_0x2002(sendbuff,&sendlen,DEVICE_GATEWAY,0); //网关的状态信息上报
  586. tax_net_send(sendbuff,sendlen,FIRST_TYPE_STATUS,COLL_UP_STATUS_CMD2002);
  587. }
  588. }
  589. /*--------------------------------------------------------------
  590. * 采集器设备设置 0x1023
  591. * --------------------------------------------------------------*/
  592. void downlink_analyze_system_cmd0x1023(uint8_t *data,uint16_t size)
  593. {
  594. downlinkSysCmd0x1023 *p_msg = NULL;
  595. p_msg = (downlinkSysCmd0x1023*)data;
  596. if(p_msg->gateway_sn != downlink_config.gateway_id) return;
  597. switch(p_msg->targetType){
  598. case 0x0101: // 网关
  599. if(p_msg->sn != downlink_config.gateway_id) break;
  600. break;
  601. case 0x0201: case 0x0202:// 采集器
  602. if(p_msg->cmd == 0x02 )gateway_collect_set_cmd0x5D(0,p_msg->sn,p_msg->targetType,p_msg->cmd);
  603. g_runData.bfirstSend0x56 = 1;
  604. break;
  605. case 0x0301: // 液位仪采集器
  606. break;
  607. case 0x0401: // 显示器
  608. break;
  609. case 0x0601: // 加密模块
  610. break;
  611. }
  612. }
  613. /*--------------------------------------------------------------
  614. * 读取报税口数据 0x1034
  615. * --------------------------------------------------------------*/
  616. extern uint64_t g_checkDa[16][2][8];
  617. void downlink_analyze_system_cmd0x1034(uint8_t *data,uint16_t size)
  618. {
  619. downlinkSysCmd0x1034 *msg = (downlinkSysCmd0x1034*)data;
  620. uint8_t index,i,j,k;
  621. printf("rcv msg 01--1034, type=%x\r\n",msg->read_type);
  622. if(msg->read_type == 0xFF){
  623. g_runData.bReadMingWenData=5;
  624. for(i=0;i<downlink_config.collect_num;i++){
  625. for(j=0;j<2;j++){
  626. for(k=0;k<8;k++){
  627. g_checkDa[i][j][k] = 0;
  628. }
  629. }
  630. }
  631. }
  632. else if(msg->read_type == 0x00){
  633. index = read_collect_index(msg->coll_sn);
  634. if(index == 0xFF) return;
  635. nodeConf.taxconf[index].port[msg->taxNo-1].gun[msg->gunNo-1].tsmw_flag = 0;
  636. }
  637. }
  638. /*--------------------------------------------------------------
  639. * 系统类(0x01) 密文是否实时读取
  640. * --------------------------------------------------------------*/
  641. void downlink_analyze_system_cmd0x1051(uint8_t *data,uint16_t size)
  642. {
  643. int ret = 0;
  644. uint8_t sendbuff[256] = {0}, sendlen = 0;
  645. downlinkSysCmd0x1051 *pmsg = NULL;
  646. pmsg = (downlinkSysCmd0x1051*)data;
  647. if(pmsg->gateway_sn != downlink_config.gateway_id) return;
  648. ret = read_collect_index(pmsg->coll_sn);
  649. if(ret == -1) return;
  650. printf("rcv cmd 1051\r\n");
  651. downlink_config.collect_conf[ret].tax_conf[pmsg->taxNo-1].encryption = pmsg->benable; // 拓盛密文,但不用50分钟读取一次
  652. //printf("1051, coll_sn = %010u,tax = %d\r\n",pmsg->coll_sn,pmsg->taxNo)
  653. fram_write_collect_msg(); // 存储
  654. uplink_update_systemcmd_0x2051(sendbuff,&sendlen,pmsg->coll_sn,pmsg->taxNo,pmsg->benable); //网关的状态信息上报
  655. tax_net_send(sendbuff,sendlen,FIRST_TYPE_SYST,GATE_UP_SYS_CMD2051);
  656. return;
  657. }
  658. /*--------------------------------------------------------------
  659. * 系统类(0x01) 透传指令(0x1052)
  660. * --------------------------------------------------------------*/
  661. void downlink_analyze_system_cmd0x1052(uint8_t *data,uint16_t size)
  662. {
  663. int ret = 0;
  664. downlinkSysCmd0x1052 *pmsg = NULL;
  665. pmsg = (downlinkSysCmd0x1052*)(data+12);
  666. if(pmsg->gateway_sn != downlink_config.gateway_id) return;
  667. ret = read_collect_index(pmsg->coll_sn);
  668. if(ret == -1) return;
  669. printf("rcv cmd 1052\r\n");
  670. g_runData.bNetCmd = 1;
  671. save_comme_queue(0x01, 0x1052,data,size);
  672. return;
  673. }
  674. /*--------------------------------------------------------------
  675. * 系统类(0x01) (0x1053)
  676. * --------------------------------------------------------------*/
  677. void downlink_analyze_system_cmd0x1053(uint8_t *data,uint16_t size)
  678. {
  679. int ret = 0;
  680. downlinkSysCmd0x1053 *pmsg = NULL;
  681. pmsg = (downlinkSysCmd0x1053*)(data+12);
  682. if(pmsg->firstLevelSn != downlink_config.gateway_id) return;
  683. printf("rcv cmd 1053\r\n");
  684. if(pmsg->targetDevType != DEVICE_GATEWAY){
  685. g_runData.bNetCmd = 1;
  686. save_comme_queue(0x01, 0x1053,data,size);
  687. }
  688. return;
  689. }
  690. /*--------------------------------------------------------------
  691. * 解析网络下发的 系统类(0x01)的数据
  692. * --------------------------------------------------------------*/
  693. void downlink_analyze_system_cmd(uint16_t type, uint8_t *data, uint16_t size)
  694. {
  695. switch(type){
  696. case COLL_DN_SYS_CMD1011: //系统类 采集路由信息初始化下行
  697. // downlink_gateway_para(data,size);
  698. break;
  699. case COLL_DN_SYS_CMD1012: // 系统类,刷新税控序列号
  700. downlink_analyze_system_cmd0x1012(data,size);
  701. break;
  702. case COLL_DN_SYS_CMD1021: // 系统类,系统重新启动
  703. downlink_analyze_system_cmd0x1021(data,size);
  704. break;
  705. case GATEWAY_DN_SYS_CMD1013: // 系统类,时间轮询间隔
  706. downlink_analyze_system_cmd0x1013(data);
  707. break;
  708. case COLL_DN_SYS_CMD1001: // 升级
  709. printf(" recive update cmd\r\n");
  710. gateway_update_proc(data,size);
  711. break;
  712. case COLL_DN_SYS_CMD1002: // 连接器版本同步
  713. downlink_analyze_system_cmd0x1002(data,size);
  714. break;
  715. case GATEWAY_DN_SYS_CMD1003: //配置mqtt服务器
  716. downlink_analyze_system_cmd0x1003(data,size);
  717. break;
  718. case COLL_DN_SYS_CMD1016: //lora参数切换
  719. downlink_analyze_system_cmd0x1016(data,size);
  720. break;
  721. case COLL_DN_SYS_CMD1017: // lora参数读取
  722. downlink_analyze_system_cmd0x1017(data,size);
  723. break;
  724. case GATEWAY_DN_SYS_CMD1018: // 手动刷新税控序列号
  725. downlink_analyze_system_cmd0x1018(data,size);
  726. break;
  727. case COLL_DN_SYS_CMD1019: // 系统类,带显示屏或不带显示屏的路由信息初始化下行
  728. downlink_analyze_system_cmd0x1019(data,size);
  729. break;
  730. case COLL_DN_SYS_CMD1020: // 系统类,配置报税口枪的个数
  731. downlink_analyze_system_cmd0x1020(data,size);
  732. break;
  733. case GATEWAY_DN_SYS_CMD1022: // 系统类, 是否启用编码器路由表
  734. downlink_analyze_system_cmd0x1022(data);
  735. break;
  736. case COLL_DN_SYS_CMD1023: // 系统类 采集器设备设置
  737. downlink_analyze_system_cmd0x1023(data,size);
  738. break;
  739. case COLL_DN_SYS_CMD1034: // 系统类,读取报税口数据
  740. downlink_analyze_system_cmd0x1034(data,size);
  741. break;
  742. case GATEWAY_DN_SYS_CMD1051: // 系统类 拓盛密文实时读取
  743. downlink_analyze_system_cmd0x1051(data,size);
  744. break;
  745. case GATEWAY_DN_SYS_CMD1052:// 系统类, 透传指令
  746. downlink_analyze_system_cmd0x1052(data,size);
  747. break;
  748. case GATEWAY_DN_SYS_CMD1053:// 系统类,
  749. downlink_analyze_system_cmd0x1053(data,size);
  750. break;
  751. }
  752. }
  753. /*----------------------------------------------------------------------
  754. * 解析网络下发的 状态类的信息 固件信息下行指令 0x1001
  755. * ---------------------------------------------------------------------*/
  756. void downlink_analyze_status_cmd0x1001(uint16_t type, uint8_t *data,uint16_t size)
  757. {
  758. uint8_t index = 0;
  759. uint8_t sendBuff[160];
  760. uint8_t sendLen = 0;
  761. downlinkStatusCmd0x1001 *pMsg = NULL;
  762. pMsg = (downlinkStatusCmd0x1001*)data;
  763. if(pMsg->gateway_sn!=downlink_config.gateway_id) return;
  764. memset(sendBuff,0,sizeof(sendBuff));
  765. switch(pMsg->targetType){
  766. case 0x0101: // 网关
  767. uplink_tax_statusmcmd_0x2001(sendBuff,&sendLen,pMsg->targetType,0);
  768. tax_net_send(sendBuff,sendLen,FIRST_TYPE_STATUS,COLL_UP_STATUS_CMD2001);
  769. break;
  770. case 0x0201: case 0x0202:// 采集器
  771. index = read_collect_index(pMsg->sn); //根据采集器的SN号,查找采集器的编号
  772. g_readCmd58.nodeCur = index;
  773. g_runData.bRead0x58 = 1;
  774. g_readCmd58.stauts[0] =( g_readCmd58.stauts[0] &( ~(0x01<<index)));
  775. g_runData.bServerRead58 = 1;
  776. break;
  777. case 0x0301: // 液位仪采集器
  778. break;
  779. case 0x0401: // 显示器
  780. break;
  781. }
  782. }
  783. /*--------------------------------------------------------------
  784. * 解析网络下发的状态类(0x02)的数据
  785. * --------------------------------------------------------------*/
  786. void downlink_analyze_status_cmd(uint16_t type,uint8_t *data, uint16_t size)
  787. {
  788. switch(type){
  789. case COLL_DN_STATUS_CMD1001: // 固件信息下行
  790. downlink_analyze_status_cmd0x1001(type,data,size);
  791. break;
  792. }
  793. }
  794. /*--------------------------------------------------------------
  795. * 异常类数据下行 0x1001
  796. * --------------------------------------------------------------*/
  797. void downlink_analyze_log_cmd0x1001(uint8_t *data,uint16_t size)
  798. {
  799. uint8_t sendBuff[256] = {0};
  800. uint8_t sendLen = 0,i=0,num = 0;
  801. downlinkLogCmd0x1001 *msg = NULL;
  802. msg = (downlinkLogCmd0x1001*)data;
  803. if(msg->gateway_sn!=downlink_config.gateway_id) return;
  804. num = downlink_config.collect_num;
  805. i = 0;
  806. do{
  807. if(num<=6){
  808. uplink_tax_log_da(sendBuff,&sendLen,LOG_BASIC_MSG,i,0,0,0,0,num);
  809. //tax_net_send(sendBuff,sendLen,FIRST_TYPE_LOG,GATEWAY_UP_LOG_CMD2001);
  810. tax_net_send_log(sendBuff,sendLen);
  811. i += num;
  812. }
  813. else{
  814. uplink_tax_log_da(sendBuff,&sendLen,LOG_BASIC_MSG,i,0,0,0,0,6);
  815. //tax_net_send(sendBuff,sendLen,FIRST_TYPE_LOG,GATEWAY_UP_LOG_CMD2001);
  816. tax_net_send_log(sendBuff,sendLen);
  817. i += 6;
  818. num = num-6;
  819. }
  820. if(i>=downlink_config.collect_num) break;
  821. }while(i<downlink_config.collect_num);
  822. g_logCfigDa.bEnable = msg->bEnable;
  823. if(msg->bEnable == 1){ // 开启
  824. g_logCfigDa.settimer = msg->timer*1000; // 单位为秒,要换为毫秒计算
  825. timeout_setValue(&g_logCfigDa.time,msg->timer*1000);
  826. timeout_start(&g_logCfigDa.time);
  827. g_runData.bsendgatewayfirmMsg = 1;
  828. g_runData.bRead0x58 = 1;
  829. g_readCmd58.nodeCur = 0;
  830. g_readCmd58.stauts[0] = 0;
  831. }
  832. else { // 关闭
  833. timeout_stop(&g_logCfigDa.time);
  834. timeout_stop(&g_logCfigDa.time2);
  835. }
  836. }
  837. /*--------------------------------------------------------------
  838. * 异常类数据下行 0x1002 原始数据上传
  839. *
  840. * --------------------------------------------------------------*/
  841. void downlink_analyze_log_cmd0x1002(uint8_t *data,uint16_t size)
  842. {
  843. uint8_t sendBuff[256] = {0};
  844. uint8_t sendLen = 0,i=0,num = 0;
  845. downlinkLogCmd0x1002 *msg = NULL;
  846. msg = (downlinkLogCmd0x1002*)data;
  847. if(msg->gateway_sn!=downlink_config.gateway_id) return;
  848. printf ("----1002\r\n");
  849. num = downlink_config.collect_num;
  850. i = 0;
  851. do{
  852. if(num<=6){
  853. uplink_tax_log_da(sendBuff,&sendLen,LOG_BASIC_MSG,i,0,0,0,0,num);
  854. tax_net_send_log(sendBuff,sendLen);
  855. i += num;
  856. }
  857. else{
  858. uplink_tax_log_da(sendBuff,&sendLen,LOG_BASIC_MSG,i,0,0,0,0,6);
  859. tax_net_send_log(sendBuff,sendLen);
  860. i += 6;
  861. num = num-6;
  862. }
  863. if(i>=downlink_config.collect_num) break;
  864. }while(i<downlink_config.collect_num);
  865. g_logCfigDa.bEnable = msg->bEnable;
  866. // g_logCfigDa.status = msg->opentype;
  867. if(msg->bEnable == 1){ // 开启
  868. if(msg->opentype==0x01) g_logCfigDa.status = 0x80; // 不指定任何
  869. else if(msg->opentype == 0x02) g_logCfigDa.status = 0x81;//指定采集器
  870. else if(msg->opentype == 0x03) g_logCfigDa.status = 0x83; // 指定报税口
  871. else if(msg->opentype == 0x04) g_logCfigDa.status = 0x87; // 指定到枪
  872. g_logCfigDa.settimer2 = msg->timer*1000; // 单位为秒,要换为毫秒计算
  873. g_logCfigDa.collIndex = read_collect_index(msg->collSN);
  874. g_logCfigDa.taxInddex = msg->taxno;
  875. g_logCfigDa.gunIndex = msg->gunno;
  876. timeout_setValue(&g_logCfigDa.time2,msg->timer*1000);
  877. timeout_start(&g_logCfigDa.time2);
  878. g_runData.bsendgatewayfirmMsg = 1;
  879. g_runData.bRead0x58 = 1;
  880. g_readCmd58.nodeCur = 0;
  881. g_readCmd58.stauts[0] = 0;
  882. }
  883. else { // 关闭
  884. timeout_stop(&g_logCfigDa.time2);
  885. timeout_stop(&g_logCfigDa.time);
  886. }
  887. }
  888. /*--------------------------------------------------------------
  889. * 解析网络下发的异常类(0x10)的数据
  890. * --------------------------------------------------------------*/
  891. void downlink_analyze_log_cmd(uint16_t type,uint8_t *data, uint16_t size)
  892. {
  893. switch(type){
  894. case GATEWAY_DN_LOG_CMD1001: // 异常类下行
  895. downlink_analyze_log_cmd0x1001(data,size);
  896. break;
  897. case GATEWAY_DN_LOG_CMD1002:
  898. downlink_analyze_log_cmd0x1002(data,size);
  899. break;
  900. }
  901. }
  902. extern uint16_t crc16_get(uint8_t *data, uint8_t size);
  903. int downlink_gateway_analyze(uint8_t *data, uint16_t len)
  904. {
  905. int ret = 1;
  906. uint16_t crc,fcrc;
  907. uint8_t msg_type = 0;
  908. sverMsgHeader *p_msg = (sverMsgHeader *)data;
  909. if(p_msg->len > 256)
  910. return ret;
  911. crc = _crc16_get(data,p_msg->len+FRAME_HEADER_LEN-2);// len-2);
  912. fcrc = p_msg->info[p_msg->len-1];
  913. fcrc = (fcrc<<8)|p_msg->info[p_msg->len-2];
  914. if(p_msg->frame_header != 0xfefe){printf("rcv net data head error\r\n"); return 0;}
  915. if(crc != fcrc) {printf("rcv net data crc error\r\n"); return 0;}
  916. msg_type = p_msg->msgtypeFirst;
  917. printf("msg_type:%d, cmd=%0x\n",msg_type,p_msg->msgtypeSecd);
  918. switch(msg_type)
  919. {
  920. case FIRST_TYPE_SYST: //0x01
  921. //downlink_analyze_system_cmd(p_msg->msgtypeSecd,(uint8_t*)p_msg->info,p_msg->len);
  922. if((p_msg->msgtypeSecd == 0x1052) || (p_msg->msgtypeSecd== 0x1053))
  923. downlink_analyze_system_cmd(p_msg->msgtypeSecd,data,len);
  924. else
  925. downlink_analyze_system_cmd(p_msg->msgtypeSecd,(uint8_t*)p_msg->info,p_msg->len);
  926. break;
  927. case FIRST_TYPE_STATUS: // 0x02
  928. downlink_analyze_status_cmd(p_msg->msgtypeSecd,(uint8_t*)p_msg->info,p_msg->len);
  929. break;
  930. case FIRST_TYPE_DATA: // 0x03
  931. break;
  932. case FIRST_TYPE_LOG: // 0x10
  933. downlink_analyze_log_cmd(p_msg->msgtypeSecd,(uint8_t*)p_msg->info,p_msg->len);
  934. break;
  935. default:
  936. break;
  937. }
  938. return 0;
  939. }