downlink.c 37 KB

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