downlink.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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 "../../User/includes.h"
  7. #include "../storage/AT24c128.h"
  8. #include "../gateway_collect/gateway_collect.h"
  9. #include "../dev_mgr/taxctrl/tax_ctrl.h"
  10. #include "../globalDef.h"
  11. #include "../storage/AT24C128Opt.h"
  12. #include "../network_mgr/net_ctrl.h"
  13. #include "../storage/AT24C128Opt.h"
  14. #include "nettimer.h"
  15. #include "me3616.h"
  16. extern ME3616 air;
  17. downlink_config_t downlink_config;
  18. void downlink_init(void)
  19. {
  20. int ret;
  21. int i;
  22. uint32_t flag = 0;
  23. // memset(&downlink_config.collect_conf,0,sizeof(downlink_config.collect_conf));
  24. // printf("downlink size %d\n",sizeof(downlink_config));
  25. // printf("gateway_read size %d\n",sizeof(gateway_read));
  26. sprintf(g_upLinkTopic,"%s%04x/%010u",(char*)MQTT_UPLINK_TOPIC,GATEWAY_DEVICE_TYPE, g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn);
  27. // fram_read_config_msg();
  28. // if(downlink_config.config_flag == CONFIG_WRITE)
  29. {
  30. g_ledStatus.collNum = g_ledStatus.led16.status;
  31. g_runData.timeSendStatus = 1;
  32. g_runData.bUpdate = 0;
  33. g_runData.bsendOilData = 0;
  34. downlink_config.config_flag = 1;
  35. g_ledStatus.led16.status = 0x8000;
  36. set_led_update_status(g_ledStatus.led16.status);
  37. }
  38. }
  39. int downlink_gateway_para(uint8_t *data, uint16_t len)
  40. {
  41. int ret=-1;
  42. int i,j,k;
  43. downlinkSysCmd0x1011 *p_msg = NULL;
  44. uint16_t flag = 0x01;
  45. uint8_t *tempdata;
  46. tempdata = data+5;
  47. p_msg = (downlinkSysCmd0x1011 *)data;
  48. memset(&downlink_config,0,sizeof(downlink_config));
  49. // if(p_msg->gateway_id != g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn)
  50. // return ret;
  51. downlink_config.gateway_id = p_msg->gateway_id;
  52. // downlink_config.collect_num = p_msg->collect_num;
  53. // g_firmwareMsg.gatewayMsg.configmsg.coll_num = p_msg->collect_num;
  54. // g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn = p_msg->gateway_id;
  55. // if(p_msg->collect_num > COLLECT_MAX_NUM) //采集器个数大于最大值,数据错误,直接返回
  56. // return ret;
  57. downlink_config.config_flag = CONFIG_WRITE;
  58. fram_write_config_msg(flag);
  59. //fram_write_gateway_soft_msg();
  60. downlink_config.config_flag = flag;
  61. g_runData.timeSendStatus = 1;
  62. g_runData.bUpdate = 0;
  63. g_runData.bsendOilData = 0;
  64. // AT24CXX_Write(CONFIG_ADDR,(uint8_t *)&downlink_config,sizeof(downlink_config));
  65. NVIC_SystemReset();//复位
  66. return 0;
  67. }
  68. /*--------------------------------------------------------------
  69. * 解析网络下发的 系统类(0x01)的 0x1003指令 切换mqtt服务器
  70. * -------------------------------------------------------------*/
  71. void downlink_analyze_system_cmd0x1003(uint8_t *data,uint16_t size)
  72. {
  73. uint8_t len = 0;
  74. downlinkSysCmd0x1003 *msg = NULL;
  75. msg = (downlinkSysCmd0x1003*)data;
  76. if(msg->gateway_sn != downlink_config.gateway_id) return;
  77. //if(msg->targettype != GATEWAY_DEVICE_TYPE) return;
  78. memset(&(g_mqttRunDa.mqttMsg),0,sizeof(MqttIdPort));
  79. memcpy(g_mqttRunDa.mqttMsg.ip,msg->str,msg->iplen);
  80. len = msg->iplen;
  81. memcpy(g_mqttRunDa.mqttMsg.port,msg->str+len,msg->portlen);
  82. len += msg->portlen;
  83. memcpy(g_mqttRunDa.mqttMsg.admin,msg->str+len,msg->userlen);
  84. len += msg->userlen;
  85. memcpy(g_mqttRunDa.mqttMsg.password,msg->str+len,msg->pwdlen);
  86. g_mqttRunDa.mqttIdlen = msg->iplen;
  87. g_mqttRunDa.mqttPortlen = msg->portlen;
  88. g_mqttRunDa.mqttUserlen = msg->userlen;
  89. g_mqttRunDa.mqttPwdlen = msg->pwdlen;
  90. close_tcp_mqtt();
  91. g_mqttRunDa.bChangeMqtt = 1;
  92. air.State.MQTT_State= 0;
  93. //g_mqttRunDa.bChangeSuc = 0;
  94. g_mqttRunDa.connectNum = 0;
  95. g_runData.cregStatus = 0;
  96. }
  97. /*--------------------------------------------------------------
  98. * 刷新税控序列号0x1012
  99. * --------------------------------------------------------------*/
  100. void downlink_analyze_system_cmd0x1012(uint8_t *data,uint16_t size)
  101. {
  102. }
  103. /*--------------------------------------------------------------
  104. * 设备重新启动 0x1021
  105. * --------------------------------------------------------------*/
  106. void downlink_analyze_system_cmd0x1021(uint8_t *data,uint16_t size)
  107. {
  108. downlinkSysCmd0x1021 *p_msg = NULL;
  109. p_msg = (downlinkSysCmd0x1021*)data;
  110. switch(p_msg->targetType){
  111. case 0x0101: // 网关
  112. if(p_msg->sn != downlink_config.gateway_id) break;
  113. NVIC_SystemReset();//复位//设备重新启动
  114. break;
  115. case 0x0201: // 采集器
  116. break;
  117. case 0x0301: // 液位仪采集器
  118. if(p_msg->sn != downlink_config.gateway_id) break;
  119. NVIC_SystemReset();//复位//设备重新启动
  120. break;
  121. case 0x0401: // 显示器
  122. break;
  123. }
  124. }
  125. /*---------------------------------------------------------------
  126. * 液位仪的配置信息初始化
  127. * --------------------------------------------------------------*/
  128. void downlink_oil_sys_cmd0x1031(uint8_t *data, uint16_t size)
  129. {
  130. downlinkSysOilCmd0x1031 *pmsg = NULL;
  131. // char sendbuff[32] = {0};
  132. // uint16_t len = 0;
  133. // downlinkDataOilCmd0x1021 *msg = (downlinkDataOilCmd0x1021*)sendbuff;
  134. pmsg = (downlinkSysOilCmd0x1031*)data;
  135. if((pmsg->gateway_sn!=downlink_config.gateway_id) && (pmsg->gateway_sn!=0xFFFFFFFF) ) return;
  136. g_oilReadMsg.paraLen = pmsg->paraLen;
  137. memset(g_oilReadMsg.param,0,sizeof(g_oilReadMsg.param));
  138. memcpy(g_oilReadMsg.param,pmsg->param,pmsg->paraLen);
  139. g_oilReadMsg.bInit = 0x5;
  140. fram_write_oil_msg();
  141. timeout_stop(&g_timeOut);
  142. g_runData.bsendOilData = READ_TIMER;
  143. // msg->gateway_sn = downlink_config.gateway_id;
  144. // len = sizeof(downlinkDataOilCmd0x1021);
  145. // tax_net_send(sendbuff,len,0x01,0x2031);
  146. }
  147. /*--------------------------------------------------------------
  148. * 解析网络下发的 系统类(0x01)的数据
  149. * --------------------------------------------------------------*/
  150. void downlink_analyze_system_cmd(uint16_t type, uint8_t *data, uint16_t size)
  151. {
  152. switch(type){
  153. case COLL_DN_SYS_CMD1011: //系统类 采集路由信息初始化下行
  154. downlink_gateway_para(data,size);
  155. break;
  156. case COLL_DN_SYS_CMD1012: // 系统类,刷新税控序列号
  157. downlink_analyze_system_cmd0x1012(data,size);
  158. break;
  159. case COLL_DN_SYS_CMD1021: // 系统类,系统重新启动
  160. downlink_analyze_system_cmd0x1021(data,size);
  161. break;
  162. case GATEWAY_DN_SYS_CMD1003: //配置mqtt服务器
  163. downlink_analyze_system_cmd0x1003(data,size);
  164. break;
  165. case COLL_DN_SYS_CMD1001: // 升级
  166. gateway_update_proc(data,size);
  167. break;
  168. case OILL_DN_SYS_CMD1031: // 系统类,油罐下行配置
  169. downlink_oil_sys_cmd0x1031(data,size);
  170. break;
  171. }
  172. }
  173. /*----------------------------------------------------------------------
  174. * 解析网络下发的 状态类的信息 固件信息下行指令 0x1001
  175. * ---------------------------------------------------------------------*/
  176. void downlink_analyze_status_cmd0x1001(uint16_t type, uint8_t *data,uint16_t size)
  177. {
  178. uint8_t index = 0;
  179. uint8_t sendBuff[160];
  180. uint8_t sendLen = 0;
  181. downlinkStatusCmd0x1001 *pMsg = NULL;
  182. pMsg = (downlinkStatusCmd0x1001*)data;
  183. if(pMsg->gateway_sn!=downlink_config.gateway_id) return;
  184. memset(sendBuff,0,sizeof(sendBuff));
  185. switch(pMsg->targetType){
  186. case 0x0101: // 网关
  187. uplink_tax_statusmcmd_0x2001(sendBuff,&sendLen,pMsg->targetType,0);
  188. tax_net_send(sendBuff,sendLen,FIRST_TYPE_STATUS,COLL_UP_STATUS_CMD2001);
  189. break;
  190. case 0x0201: // 采集器
  191. break;
  192. case 0x0301: // 液位仪采集器
  193. uplink_tax_statusmcmd_0x2001(sendBuff,&sendLen,pMsg->targetType,0);
  194. tax_net_send(sendBuff,sendLen,FIRST_TYPE_STATUS,COLL_UP_STATUS_CMD2001);
  195. break;
  196. case 0x0401: // 显示器
  197. break;
  198. }
  199. }
  200. /*--------------------------------------------------------------
  201. * 解析网络下发的状态类(0x02)的数据
  202. * --------------------------------------------------------------*/
  203. void downlink_analyze_status_cmd(uint16_t type,uint8_t *data, uint16_t size)
  204. {
  205. switch(type){
  206. case COLL_DN_STATUS_CMD1001: // 固件信息下行
  207. downlink_analyze_status_cmd0x1001(type,data,size);
  208. break;
  209. }
  210. }
  211. /*--------------------------------------------------------------------
  212. * 读取液位仪的数据
  213. * --------------------------------------------------------------------*/
  214. void downlink_oil_data_cmd0x1021(uint8_t *data,uint16_t size)
  215. {
  216. downlinkDataOilCmd0x1021 *pmsg = NULL;
  217. pmsg = (downlinkDataOilCmd0x1021*)data;
  218. if((pmsg->gateway_sn!=downlink_config.gateway_id) && (pmsg->gateway_sn!=0xFFFFFFFF)) return ;
  219. timeout_stop(&g_timeOut);
  220. g_runData.bsendOilData = READ_TIMER;
  221. g_runData.bread = 1;
  222. }
  223. /*--------------------------------------------------------------------
  224. * 数据类 0x03 类的信息
  225. * -------------------------------------------------------------------*/
  226. void downlink_analyze_data_cmd(uint16_t type,uint8_t *data, uint16_t size)
  227. {
  228. switch(type){
  229. case SECOND_TYPE_DATA_TAX : //报税口类
  230. break;
  231. case SECOND_TYPE_DATA_LED : // 显示屏
  232. break;
  233. case COLL_OIL_DATA_CMD1021 : // 液位仪
  234. downlink_oil_data_cmd0x1021(data,size);
  235. break;
  236. }
  237. }
  238. extern uint16_t crc16_get(uint8_t *data, uint8_t size);
  239. int downlink_gateway_analyze(uint8_t *data, uint16_t len)
  240. {
  241. int ret = 1;
  242. uint16_t crc,fcrc;
  243. uint8_t msg_type = 0;
  244. sverMsgHeader *p_msg = (sverMsgHeader *)data;
  245. if(p_msg->len > 128)
  246. return ret;
  247. crc = _crc16_get(data,p_msg->len+FRAME_HEADER_LEN-2);// len-2);
  248. fcrc = p_msg->info[p_msg->len-1];
  249. fcrc = (fcrc<<8)|p_msg->info[p_msg->len-2];
  250. if(p_msg->frame_header != 0xfefe){printf("rcv net data head error\r\n"); return 0;}
  251. if(crc != fcrc) {printf("rcv net data crc error\r\n"); return 0;}
  252. msg_type = p_msg->msgtypeFirst;
  253. printf("msg_type:%d\n",msg_type);
  254. switch(msg_type)
  255. {
  256. case FIRST_TYPE_SYST: //0x01
  257. downlink_analyze_system_cmd(p_msg->msgtypeSecd,(uint8_t*)p_msg->info,p_msg->len);
  258. break;
  259. case FIRST_TYPE_STATUS: // 0x02
  260. downlink_analyze_status_cmd(p_msg->msgtypeSecd,(uint8_t*)p_msg->info,p_msg->len);
  261. break;
  262. case FIRST_TYPE_DATA: // 0x03
  263. downlink_analyze_data_cmd(p_msg->msgtypeSecd,(uint8_t*)p_msg->info,p_msg->len);
  264. break;
  265. default:
  266. break;
  267. }
  268. return 0;
  269. }