net_proc.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951
  1. #include "net_proc.h"
  2. #include "../ota/ota.h"
  3. #include "me3616.h"
  4. #include "../storage/AT24C128Opt.h"
  5. #include "../network/nettimer.h"
  6. #include "../command/uart_conf.h"
  7. extern volatile uint32_t TickCounter;
  8. system_network_t sys_net;
  9. void collect_msg_frame_fill(gateway_collect_com_t *p_msg,uint8_t msg_type,uint16_t len);
  10. #define hextoascii(x) \
  11. if((x) < 10) { \
  12. (x) = (x)|0x30; \
  13. } else { \
  14. (x) = (x)-10 + 'A';\
  15. }
  16. void NET_IMEI_ICCID_INFO_GET(char *imei, char *iccid)
  17. {
  18. ME3616 *uplink = sys_net.net_hdl;
  19. if(uplink) {
  20. uplink->imei_iccid_get(imei, iccid);
  21. }
  22. }
  23. extern ME3616 air;
  24. extern ME3616 * AIR_Init(void);
  25. void * uplink_net_init(char *device_id)
  26. {
  27. char sub_topic[64] = {0};
  28. ME3616 *uplink;
  29. // snprintf(sub_topic, sizeof(sub_topic), "RCC/%s", device_id);
  30. // snprintf(sub_topic, sizeof(sub_topic), "%s", device_id);
  31. //uplink = ME3616_Init();
  32. uplink = AIR_Init();
  33. uplink->PowerOn(1);
  34. if(uplink->GetCCID) {
  35. uplink->GetCCID(); /*获取CCID*/
  36. } else {
  37. printf("uplink->GetCCID = %p\r\n", uplink->GetCCID);
  38. }
  39. if(uplink->GetIMEI) {
  40. uplink->GetIMEI();
  41. } else {
  42. printf("uplink->GetIMEI = %p\r\n", uplink->GetIMEI);
  43. }
  44. uplink->GetCSQ(); /*等待网络*/
  45. // NVIC_SystemReset();
  46. sprintf(sub_topic,"%04x-%010u",GATEWAY_DEVICE_TYPE, g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn);
  47. if(g_firmwareMsg.mqttidport.flag ==1){
  48. if(g_mqttRunDa.bChangeMqtt == 1){
  49. // uplink->MQTT.SetNet(MQTT_SERVER_IP1, MQTT_SERVER_PORT);
  50. // uplink->MQTT.Connect("cpyypt", (char*)sub_topic, "1SvTlvm1VCawSzS");
  51. uplink->MQTT.SetNet(g_mqttRunDa.mqttMsg.ip, g_mqttRunDa.mqttMsg.port);
  52. uplink->MQTT.Connect(g_mqttRunDa.mqttMsg.admin, (char*)sub_topic, g_mqttRunDa.mqttMsg.password);
  53. printf("\r\n change, mqttIP: mqttPort\r\n");//,g_mqttRunDa.mqttMsg.ip,g_mqttRunDa.mqttMsg.port);
  54. printf("\r\n change, admin: password\r\n");//,g_mqttRunDa.mqttMsg.admin,g_mqttRunDa.mqttMsg.password);
  55. }
  56. else {
  57. uplink->MQTT.SetNet(g_firmwareMsg.mqttidport.ip, g_firmwareMsg.mqttidport.port);
  58. uplink->MQTT.Connect(g_firmwareMsg.mqttidport.admin, (char*)sub_topic, g_firmwareMsg.mqttidport.password);
  59. printf("\r\n Have Init, mqttIP: mqttPort \r\n");//,g_firmwareMsg.mqttidport.ip,g_firmwareMsg.mqttidport.port);
  60. printf("\r\n Have Init, admin: password \r\n");//,g_firmwareMsg.mqttidport.admin,g_firmwareMsg.mqttidport.password);
  61. }
  62. }
  63. else
  64. {
  65. uplink->MQTT.SetNet(MQTT_SERVER_IP, MQTT_SERVER_PORT);
  66. uplink->MQTT.Connect("admin", (char*)sub_topic, "houjianwei");
  67. printf("\r\n NO Init, mqttIP: mqttPort\r\n");//,MQTT_SERVER_IP,MQTT_SERVER_PORT);
  68. printf("\r\n No Init, admin: , password\r\n");//,"admin","houjianwei");
  69. }
  70. memset(sub_topic,0,sizeof(sub_topic));
  71. sprintf(sub_topic,"%s%04x/%s",(char*)MQTT_DNLINK_TOPIC_CASE,GATEWAY_DEVICE_TYPE, (char*)"broadcast");
  72. uplink->MQTT.Sub((char*)sub_topic);
  73. memset(sub_topic,0,sizeof(sub_topic));
  74. sprintf(sub_topic,"%s%04x/%010u",(char*)MQTT_DNLINK_TOPIC,GATEWAY_DEVICE_TYPE, g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn);
  75. uplink->MQTT.Sub(sub_topic); // 订阅上行主题
  76. memcpy(g_firmwareMsg.gatewayMsg.Iccid1,air.State.iccid,20);
  77. memcpy(g_firmwareMsg.gatewayMsg.Imei,air.State.imei,15);
  78. return uplink;
  79. }
  80. extern void AIR_CLOSE_TCP();
  81. void close_tcp_mqtt(void)
  82. {
  83. AIR_CLOSE_TCP();
  84. }
  85. void uplink_net_send(char *buffer, uint32_t len)
  86. {
  87. uint32_t i, str_len = 0;//, high, low;
  88. inner_msg_format_t *p_net_msg = (inner_msg_format_t *)buffer;
  89. ME3616 *uplink = sys_net.net_hdl;
  90. if(uplink) {
  91. memset(sys_net.str, 0, sizeof(sys_net.str));
  92. //printf("type = %d, len = %d\r\n", p_net_msg->type, len);
  93. #if 0
  94. for(i = 0;i < len;i++) {
  95. high = (buffer[i]>>4)&0xf;
  96. low = buffer[i]&0xf;
  97. hextoascii(high);
  98. hextoascii(low);
  99. str_len += snprintf(sys_net.str + str_len, sizeof(sys_net.str)-str_len, "%x", high);
  100. str_len += snprintf(sys_net.str + str_len, sizeof(sys_net.str)-str_len, "%x", low);
  101. }
  102. //printf("%s, %d\r\n", sys_net.str, strlen(sys_net.str));
  103. uplink->MQTT.Pub(TOPIC_GET_BY_MSGTYPE(p_net_msg->type), sys_net.str, strlen(sys_net.str)/2);
  104. #else
  105. for(i = 0;i < len;i++) {
  106. str_len += snprintf(sys_net.str + str_len, sizeof(sys_net.str)-str_len, "%02x", buffer[i]);
  107. }
  108. //printf("%s, %d\r\n", sys_net.str, strlen(sys_net.str));
  109. g_data4G.bconnect4G = uplink->MQTT.Pub(TOPIC_GET_BY_MSGTYPE(p_net_msg->type), sys_net.str, strlen(sys_net.str)/2);
  110. #endif
  111. }
  112. }
  113. void collect_station_proto_proc(system_network_t *p_sys_net, inner_msg_format_t *p_msg, uint32_t msg_len)
  114. {
  115. gb_node_bind_info_t *p_bind = NULL;
  116. gb_gateway_bind_info_t *p_gw_bind = NULL;
  117. gb_node_info_t *p_node = NULL;
  118. u8 i;
  119. switch(p_msg->type) {
  120. case net_msg_type_update:
  121. break;
  122. case net_msg_type_reboot:
  123. p_bind = (gb_node_bind_info_t *)p_msg->info;
  124. if(gateway_id_cmp(p_bind->gw_device_id)) {
  125. if(device_type_and_id_cmp(p_bind->device_type, p_bind->device_id)) {
  126. NVIC_SystemReset();
  127. }
  128. }
  129. break;
  130. //绑定请求和心跳上行转发
  131. case net_msg_type_bind_req:
  132. case net_msg_type_node_echo:
  133. p_bind = (gb_node_bind_info_t *)p_msg->info;
  134. if(device_type_and_id_cmp(p_bind->device_type, p_bind->device_id)) {
  135. if(sys_net.uplink_send) {
  136. sys_net.uplink_send((char *)p_msg, FRAME_HEADER_LEN + p_msg->len);
  137. }
  138. }
  139. break;
  140. //接收网关回响及心跳
  141. case net_msg_type_bind_rsp:
  142. p_bind = (gb_node_bind_info_t *)p_msg->info;
  143. if(device_type_and_id_cmp(p_bind->device_type, p_bind->device_id)) {
  144. gateway_gw_id_flush(p_bind->gw_device_id);
  145. }
  146. break;
  147. case net_msg_type_gw_echo:
  148. p_gw_bind = (gb_gateway_bind_info_t *)p_msg->info;
  149. if(gateway_id_cmp(p_gw_bind->gw_device_id)) {
  150. for(i = 0;i < GB_SUPPORT_MAX_NODE;i++) {
  151. p_node = &p_gw_bind->node[i];
  152. if(device_type_and_id_cmp(p_node->device_type, p_node->device_id)) {
  153. gateway_gw_id_flush(p_gw_bind->gw_device_id);
  154. break;
  155. }
  156. }
  157. }
  158. break;
  159. default:
  160. break;
  161. }
  162. //printf("collect_station_proto_proc, msg_type = %d, msg_len = %d\r\n", p_msg->type, msg_len);
  163. //OSTmrStop(&sys_net.net_tmr, OS_OPT_TMR_NONE, NULL, &err);
  164. }
  165. void oiltank_station_proto_proc(system_network_t *p_sys_net, inner_msg_format_t *p_msg, uint32_t msg_len)
  166. {
  167. printf("oiltank_station_proto_proc, msg_type = %d, msg_len = %d\r\n", p_msg->type, msg_len);
  168. }
  169. //设置升级标志
  170. uint16_t set_updata_state(uint16_t data)
  171. {
  172. uint16_t temp_data,ret_data = 0;
  173. uint16_t temp_h,temp_l;
  174. temp_data = data;
  175. temp_h = ((~temp_data)<<8)&0xff00;
  176. temp_l = temp_data&0x00ff;
  177. ret_data = temp_h | temp_l;
  178. return ret_data;
  179. }
  180. //判断升级标志的本体和掩码
  181. uint8_t updata_state_cmp(uint16_t data)
  182. {
  183. uint8_t ret = 0;
  184. uint16_t temp_data;
  185. uint8_t temp_h,temp_l;
  186. temp_data = data;
  187. temp_h = (uint8_t)((temp_data&0xff00)>>8);
  188. temp_l = (uint8_t)(temp_data&0x00ff);
  189. if((temp_h^temp_l) == 0xff)
  190. {
  191. ret = 1;
  192. }
  193. return ret;
  194. }
  195. /*------------------------------------------------------------------------
  196. * 上报服务器的升级状态
  197. * -----------------------------------------------------------------------*/
  198. void up_to_send_server_update_status(uint16_t targetType, uint32_t sn, uint16_t taskNo,uint8_t updateStatus)
  199. {
  200. char buff[128] = {0};
  201. uint8_t bufflen = 0;
  202. memset(buff,0,sizeof(buff));
  203. uplink_update_systemcmd_0x2001((uint8_t*)buff,&bufflen,targetType,sn,taskNo,updateStatus);
  204. tax_net_send((uint8_t*)buff,bufflen,FIRST_TYPE_SYST,COLL_UP_SYS_CMD2001); //向服务器上传数据的完整数据,并通过mqtt发送
  205. return;
  206. }
  207. extern uint8_t * AIR_HTTP_READ(uint32_t start_addr, uint32_t data_len);
  208. extern void lora_send(char *tx_data, uint32_t tx_len);
  209. /*--------------------------------------------------------------------
  210. * 升级
  211. * http://121.89.239.35:8002/chfs/shared/0101/010103001.bin
  212. * http://121.89.239.35:8002/chfs/shared/0101/A64010001.bin
  213. * https://oil-public.oss-cn-zhangjiakou.aliyuncs.com/upgrade/apk/20211126/A64010001.bin
  214. *
  215. * https://oil-public.oss-cn-zhangjiakou.aliyuncs.com/upgrade/apk/20211129/01013001.bin
  216. * https://oil-public.oss-cn-zhangjiakou.aliyuncs.com/upgrade/apk/20211129/01013002.bin
  217. * https://oil-public.oss-cn-zhangjiakou.aliyuncs.com/upgrade/apk/20211211/01013003.bin
  218. * -------------------------------------------------------------------*/
  219. void gateway_update_proc(uint8_t *data,uint8_t msg_len)
  220. {
  221. uint32_t start_addr = 0, total_len = 0, remain_len, read_len, total_crc = 0;
  222. uint8_t *p_content = NULL, i,updateStatus = UPDATE_DOWNLOADFILE_SUCCESS;
  223. uint16_t send_data_dr2 = 0;
  224. int index = 0,len = 0;
  225. OS_ERR err;
  226. char buff[128] = {0};
  227. const char ch = '.';
  228. char *ret = NULL;
  229. uint32_t version = 0;
  230. uint16_t dd,nn;
  231. uint8_t ff;
  232. uint32_t fileVer,addr,filelen,crcVl,fixChar,getcrc;
  233. downlinkSysCmd0x1001 *p_msg = NULL;
  234. update_msg_format p_update;
  235. sverMsgHeader *pHeadmsg;
  236. OS_MSG_SIZE msg_len_head;
  237. g_runData.bUpdate = 1;
  238. g_updateProg.updateProgFrom = UPDATE_PROG_FROM_NET;
  239. p_msg = (downlinkSysCmd0x1001*)data;
  240. updateStatus = UPDATE_RECEIVE_UPDATEFLAG; //文件下载 APP3写入成功
  241. up_to_send_server_update_status(0x0301,downlink_config.gateway_id,p_msg->taskNo,updateStatus);
  242. while(sys_net.net_q.MsgQ.NbrEntries!=0){
  243. OSSemPend(&sys_net.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  244. pHeadmsg = (sverMsgHeader *)OSQPend(&sys_net.net_q, 0, OS_OPT_PEND_NON_BLOCKING, &msg_len_head, NULL, &err); /* blocking. */
  245. OSSemPost(&sys_net.sem, OS_OPT_POST_ALL, &err);
  246. gw_net_send((char *)pHeadmsg, msg_len_head);
  247. net_queue_mem_free(pHeadmsg);
  248. }
  249. BKP_WriteBackupRegister(BKP_DR4, p_msg->taskNo);
  250. // memset(p_msg->url, 0, sizeof(p_msg->url));
  251. // snprintf(p_msg->url, sizeof(p_msg->url),
  252. // "%s","https://oil-public.oss-cn-zhangjiakou.aliyuncs.com/upgrade/apk/20211213/02013001.bin");
  253. ret = strrchr(p_msg->url, ch)-8;
  254. sscanf(ret,"%[^.]",buff);
  255. sscanf(buff,"%08x",&version);
  256. dd = (version>>16)&0xFFFF; //类型
  257. ff = (version>>12)&0x0F; //aap类型
  258. nn = version&0xFFF; // 版本
  259. if(dd != p_msg->targetType){
  260. updateStatus = UPDATE_DEVICETYPEERROR;
  261. goto UPDATE_END;
  262. }
  263. if((p_msg->targetType==0x0301)){// 版本对比
  264. if(g_firmwareMsg.gatewayMsg.verMsg.gate_appVr== version){
  265. updateStatus = UPDATE_SAMEVERSION;
  266. goto UPDATE_END;
  267. }
  268. }
  269. // else if(p_msg->targetType==0x0201){
  270. // if(p_msg->sn!=0xFFFFFFFF){
  271. // index = read_collect_index(p_msg->sn);
  272. // if(index== -1){
  273. // updateStatus = UPDATE_FAILE_NOCOLLECT;
  274. // goto UPDATE_END;
  275. // }
  276. // if(g_firmwareMsg.collMsg[index].appVr == version){
  277. // updateStatus = UPDATE_SAMEVERSION;
  278. // goto UPDATE_END;
  279. // }
  280. // }
  281. // }
  282. g_runData.updateDeviceTyp = p_msg->targetType;
  283. //提取url文件到对应的升级区
  284. //len = strlen(p_msg->url);
  285. g_runData.bUpdate = 1;
  286. memcpy(buff,p_msg->url,p_msg->urlLen);
  287. AIR_HTTP_GET(buff ,p_msg->urlLen, &total_len);
  288. printf("total_len %d\r\n", total_len);
  289. if(total_len<=2){
  290. updateStatus = UPDATE_DOWNLOADFILE_FAILED;// 文件下载失败
  291. goto UPDATE_END;
  292. }
  293. else if(total_len>131072){
  294. updateStatus = UPdATE_FILE_LEN_ERROR;
  295. goto UPDATE_END;
  296. }
  297. g_ledStatus.ledM = LED_M_QUICK;
  298. Flash_RangeErase(OTA_UPDATE_APP3_FLASH_START_ADDR, OTA_UPDATE_APP3_FLASH_SIZE); // 擦除APP3区
  299. while(start_addr < total_len) {//每次读取512字节,写入到flash中
  300. remain_len = total_len - start_addr;
  301. read_len = (remain_len > 512)?512:remain_len;
  302. p_content = AIR_HTTP_READ(start_addr, read_len);
  303. data_dump("Update Data", p_content, read_len);
  304. Flash_BufferWrite(OTA_UPDATE_APP3_FLASH_START_ADDR + start_addr, (uint32_t *)p_content, read_len);
  305. start_addr += read_len;
  306. }
  307. OSTimeDlyHMSM(0, 0, 0, 200, OS_OPT_TIME_DLY, &err);
  308. crcVl = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-4); //CRC校验
  309. fixChar = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-8); // 固定字符 WBJW
  310. fileVer = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-12); // 固件信息
  311. filelen = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-20); // 文件总长度
  312. addr = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-16); // 文件写入的地址
  313. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);
  314. CRC_ResetDR();
  315. CRC_CalcBlockCRC((uint32_t*)OTA_UPDATE_APP3_FLASH_START_ADDR, (total_len -4)/4);
  316. getcrc = CRC_GetCRC();
  317. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,DISABLE);
  318. if(getcrc!=crcVl) {
  319. updateStatus = UPDATE_CRCERROR;
  320. printf("update file crc error\r\n");// 升级文件crc校验错误
  321. goto UPDATE_END;
  322. }
  323. if(version!=fileVer){
  324. updateStatus = UPDATE_URL_FILE_TYPE_ERROR;
  325. goto UPDATE_END;
  326. }
  327. printf("^^^^^^^^update file download success\r\n");
  328. switch(p_msg->targetType){
  329. case 0x0101: // 网关
  330. break;
  331. case 0x0201: // 采集器
  332. break;
  333. case 0x0301: // 液位仪采集器
  334. g_firmwareMsg.gatewayMsg.verMsg.gate_appVr3 = version;
  335. fram_write_gateway_version(); // 将版本号写入到EEPROM中
  336. fram_write_update_flag(); // 写入升级标志
  337. send_data_dr2 = set_updata_state(UPDATE_DOWNLOADFILE_SUCCESS);
  338. BKP_WriteBackupRegister(BKP_DR3, send_data_dr2); // 写入状态码
  339. send_data_dr2 = set_updata_state(0x81);
  340. BKP_WriteBackupRegister(BKP_DR2, send_data_dr2); // 写入标志码
  341. BKP_WriteBackupRegister(BKP_DR5, UP_PROG_FROM_NET); // 升级的来源 0x22 来源来网络服务下发的
  342. OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err);
  343. printf("\r\n gateway update ======================\r\n");
  344. NVIC_SystemReset();//复位//设备重新启动//写升级标志位,然后复位,进入bootloader程序中
  345. break;
  346. case 0x0401: // 显示器
  347. break;
  348. }
  349. return;
  350. UPDATE_END:
  351. up_to_send_server_update_status(0x0301,downlink_config.gateway_id,p_msg->taskNo,updateStatus);
  352. g_runData.bUpdate = 0;
  353. g_updateProg.updateProgFrom = UPDATE_PROG_NULL;
  354. }
  355. /*--------------------------------------------------------------------------------
  356. * 升级重传 或是读取升级状态
  357. * --------------------------------------------------------------------------------*/
  358. void gateway_update_collect_status(void)
  359. {
  360. }
  361. /*---------------------------------------------------------------------------------
  362. * 网关自己升级,重新启动后,自动上报服务器升级的状态
  363. * ---------------------------------------------------------------------------------*/
  364. void gateway_reset_send_update_status(void)
  365. {
  366. uint16_t taskNo = 0;
  367. if((g_runData.bResetUpdate == 1) && (air.State.MQTT_State==1)){
  368. taskNo = BKP_ReadBackupRegister(BKP_DR4);
  369. up_to_send_server_update_status(0x0301,downlink_config.gateway_id,taskNo,g_runData.bsendUpdateStatus);
  370. g_runData.bResetUpdate = 0;
  371. }
  372. }
  373. /*-------------------------------------------------------------
  374. * 排序
  375. * -------------------------------------------------------------*/
  376. void sort(void)
  377. {
  378. int i = 0;
  379. int j = 0;
  380. int tmp = 0;
  381. int m = g_updateProg.num;
  382. for (i = 0; i<m - 1; i++)
  383. {
  384. for (j = 0; j < m - i - 1; j++)
  385. {
  386. if (g_updateProg.sn[j]>g_updateProg.sn[j + 1])
  387. {
  388. tmp = g_updateProg.sn[j + 1];
  389. g_updateProg.sn[j + 1] = g_updateProg.sn[j];
  390. g_updateProg.sn[j] = tmp;
  391. tmp = g_updateProg.appVr[j + 1];
  392. g_updateProg.appVr[j + 1] = g_updateProg.appVr[j];
  393. g_updateProg.appVr[j] = tmp;
  394. tmp = g_updateProg.status[j + 1];
  395. g_updateProg.status[j + 1] = g_updateProg.status[j];
  396. g_updateProg.status[j] = tmp;
  397. }
  398. }
  399. }
  400. }
  401. /*--------------------------------------------------------------------------------
  402. * 升级重传 或是读取升级状态 (网关升级网关时用到)
  403. * --------------------------------------------------------------------------------*/
  404. void gateway_update_gateway_status(void)
  405. {
  406. uint8_t flag = 0,i=0;
  407. uint8_t num = 0;
  408. OS_ERR err;
  409. if(g_runData.bUpdate != 2 ) return;
  410. if(g_runData.updateDeviceTyp!= 0x0301) return;
  411. if((TickCounter - g_runData.startUpdateTotalTime)< UPDATE_COLLECT_TOTALTIME){
  412. if((g_runData.repeatUpdateTime!=0) && ((TickCounter - g_runData.repeatUpdateTime) > UPDATE_REPEAT_TIME)){ // 2s内没有收到重传指令
  413. g_runData.readUpdateStatusTime = TickCounter; // 开始延时5s
  414. g_runData.repeatUpdateTime = 0;
  415. }
  416. if((g_runData.readUpdateStatusTime!=0) && ((TickCounter-g_runData.readUpdateStatusTime)>UPDATE_READSTATUS_TIME_GATEWAY)){
  417. flag = 1;
  418. g_runData.readUpdateStatusTime = 0;
  419. }
  420. }
  421. else { // 升级总时间超时
  422. flag = 1;
  423. }
  424. if(flag == 1){ // 读取采集器的升级状态
  425. g_runData.bUpdate = 0;
  426. flag = 0;
  427. //g_runData.bsendUpdateStatus = 2;
  428. g_ledStatus.ledM = LED_M_LOW;
  429. g_ledStatus.led16.status = g_ledStatus.collNum;
  430. g_runData.bUpdateHost = 0;
  431. printf("\r\n update finish read update status\r\n");
  432. sort();
  433. for(i=0;i<g_updateProg.num;i++){
  434. printf("sn = %010u, appVr = 0x%08x, status = %d\r\n",g_updateProg.sn[i],g_updateProg.appVr[i],g_updateProg.status[i]);
  435. }
  436. g_updateProg.updateProgFrom = UPDATE_PROG_NULL;
  437. }
  438. }
  439. /* -------------------------------------------------------------
  440. * 网关升级网关
  441. * -------------------------------------------------------------*/
  442. void gateway_update_gateway_proc(void)
  443. {
  444. OS_ERR err;
  445. uint32_t total_len = 0,total_crc = 0;
  446. uint8_t i = 0;
  447. update_msg_format p_update;
  448. g_updateProg.updateProgFrom = UPDATE_PROG_FROM_GATEWAY;
  449. g_runData.bUpdate = 1;
  450. total_len = Flash_DatalenRead(OTA_UPDATE_APP1_FLASH_START_ADDR,OTA_UPDATE_APP3_FLASH_SIZE);
  451. printf("-----------------total_len = %d",total_len);
  452. p_update.rcv_device_type = 0x0301;// 设备类型
  453. p_update.rcv_device_id = 0xFFFFFFFF;
  454. p_update.des_device_type = 0x0301;// 设备类型
  455. p_update.des_device_id = 0xFFFFFFFF;
  456. p_update.update_version = g_firmwareMsg.gatewayMsg.verMsg.gate_appVr; // 升级版本号
  457. g_runData.updateDeviceTyp = 0x0101;
  458. g_runData.bUpdateHost = 1;
  459. g_updateProg.num = 0;
  460. for(i=0;i<64;i++) {
  461. g_updateProg.sn[i] = 0x00000000;
  462. g_updateProg.appVr[i] = 0x00000000;
  463. g_updateProg.status[i] = 0x00000000;
  464. }
  465. lora_gw_ota_info_Init(&p_update, total_len, total_crc);
  466. for(i = 0;i < 5;i++) {
  467. lora_gw_ota_start(&sys_net);
  468. OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err);
  469. }
  470. OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
  471. lora_gw_ota_continues(&sys_net,OTA_UPDATE_APP1_FLASH_START_ADDR);
  472. g_runData.bUpdate = 2;
  473. g_runData.startUpdateTotalTime = TickCounter;
  474. g_runData.repeatUpdateTime = TickCounter;
  475. g_runData.readUpdateStatusTime = 0;
  476. printf("\r\n continue update finish \r\n");
  477. // g_runData.bUpdate = 0;
  478. }
  479. /*-------------------------------------------------------------------------------
  480. * 升级成功后,主设备 接收升级的状态
  481. * --------------------------------------------------------------------------------*/
  482. void gateway_update_status_rcv(gateway_collect_com_t *data, uint32_t len)
  483. {
  484. uint8_t i = 0;
  485. OS_ERR err;
  486. ota_updatestatus_up_t *msg = (ota_updatestatus_up_t *)data->taxinfo.info;
  487. if(msg->des_device_type == 0x0201) {
  488. g_runData.repeatUpdateTime = TickCounter;
  489. g_runData.readUpdateStatusTime = 0;
  490. printf("^^^^^^^rcv type = %04x sn = %08x app = %08x, status = %d\r\n",msg->des_device_type, msg->des_device_id,msg->des_device_appVr,msg->status);
  491. if(g_updateProg.rec0x16 == 0x01){
  492. // 上报升级成功指令
  493. g_updateProg.rec0x16 = 0x00;
  494. g_runData.bUpdate = 0x00;
  495. OSTmrStop(&g_updateProg.update_total_time, OS_OPT_TMR_NONE, NULL, &err);
  496. }
  497. return;
  498. }
  499. else if(msg->des_device_type == 0x0101) {
  500. printf("^^^^^^^rcv sn = %08x app = %08x, status = %d\r\n",msg->des_device_id,msg->des_device_appVr,msg->status);
  501. for(i=0;i<g_updateProg.num + 1;i++){
  502. if(g_updateProg.sn[i] == 0x00000000){
  503. g_updateProg.sn[i] = msg->des_device_id;
  504. g_updateProg.appVr[i] = msg->des_device_appVr;
  505. g_updateProg.status[i] = msg->status;
  506. g_updateProg.num++;
  507. break;
  508. }
  509. else {
  510. if(g_updateProg.sn[i] == msg->des_device_id) break;
  511. }
  512. }
  513. g_runData.repeatUpdateTime = TickCounter;
  514. g_runData.readUpdateStatusTime = 0;
  515. }
  516. }
  517. /*------------------------------------------------------------------------------------
  518. * 升级成功后, 从设备 上报自己的升级状态
  519. * -----------------------------------------------------------------------------------*/
  520. void gateway_update_status_send(system_network_t *p_sys_net)
  521. {
  522. uint16_t data = 0,crc = 0;
  523. uint32_t a = 0;
  524. OS_ERR err;
  525. gateway_collect_com_t msg;
  526. ota_updatestatus_up_t *p_ota = (ota_updatestatus_up_t *)msg.taxinfo.info;
  527. if(g_runData.bUpdateHost == 1 ) return;
  528. if(g_runData.bResetUpdate ==0 ) return;
  529. if(g_updateProg.num >=3){
  530. g_runData.bResetUpdate = 0;
  531. return;
  532. }
  533. if (!(timeout_isOut(&g_updateProg.upStatusOut))) return;
  534. p_ota->rcv_device_type = 0x0101;
  535. p_ota->rcv_device_id = downlink_config.gateway_id;
  536. p_ota->des_device_type = 0x0101;
  537. p_ota->des_device_id = downlink_config.gateway_id;
  538. p_ota->des_device_bootVr = g_firmwareMsg.gatewayMsg.verMsg.gate_bootloaderVr;
  539. p_ota->des_device_appVr = g_firmwareMsg.gatewayMsg.verMsg.gate_appVr ;
  540. p_ota->status = g_runData.bsendUpdateStatus;
  541. p_ota->reserve = 0x00000000;
  542. collect_msg_frame_fill(&msg, 0x23, sizeof(ota_updatestatus_up_t)+2);
  543. crc = _crc16_get((uint8_t *)&msg,msg.len + GATE_COLL_HEAD_LEN -2 );
  544. msg.taxinfo.info[msg.len -2] = crc&0xff;
  545. msg.taxinfo.info[msg.len - 1] = (crc>>8)&0xff;
  546. if(g_updateProg.num == 0) {
  547. srand(TickCounter);
  548. a = rand() % 233+200;
  549. printf(" a = %d\r\n",a);
  550. OSTimeDlyHMSM(0, 0, 0, 300+a, OS_OPT_TIME_DLY, &err);
  551. }
  552. data_dump("send update status ", (uint8_t *)&msg, msg.len + 12);
  553. p_sys_net->downlink_send((char *)&msg, GATE_COLL_HEAD_LEN + msg.len);
  554. g_updateProg.num++; // 发送的次数
  555. // p_sys_net->workstate = DEV_WORK_STATE_UPDATING;
  556. }
  557. void update_total_timer(void *p_tmr, void *p_arg)
  558. {
  559. OS_ERR err;
  560. g_updateProg.rec0x16 = 0x00;
  561. g_runData.bUpdate = 0x00;
  562. printf("rcv 0x16, update timeout\r\n");
  563. OSTmrStop(&g_updateProg.update_total_time, OS_OPT_TMR_NONE, NULL, &err);
  564. }
  565. /*------------------------------------------------------------------------------------
  566. * 连接器版本同步
  567. * -----------------------------------------------------------------------------------*/
  568. void gateway_send_update_collect_up_collect(system_network_t *p_sys_net,uint8_t *data,uint16_t len)
  569. {
  570. uint16_t crc = 0;
  571. uint32_t a = 0;
  572. OS_ERR err;
  573. gateway_collect_com_t msg;
  574. //ota_lineoffupdate_coll_t *p_ota = (ota_lineoffupdate_coll_t *)msg.taxinfo.info;
  575. g_updateProg.rec0x16 = 0x01;
  576. g_runData.bUpdate = 0x01;
  577. memcpy(msg.taxinfo.info,data,len);
  578. collect_msg_frame_fill(&msg, 0x16, sizeof(ota_lineoffupdate_coll_t)+2);
  579. crc = _crc16_get((uint8_t *)&msg,msg.len + GATE_COLL_HEAD_LEN -2 );
  580. msg.taxinfo.info[msg.len -2] = crc&0xff;
  581. msg.taxinfo.info[msg.len - 1] = (crc>>8)&0xff;
  582. data_dump("send update status ", (uint8_t *)&msg, msg.len + 12);
  583. p_sys_net->downlink_send((char *)&msg, GATE_COLL_HEAD_LEN + msg.len);
  584. // p_sys_net->workstate = DEV_WORK_STATE_UPDATING;
  585. OSTmrCreate(&g_updateProg.update_total_time, "updateTotal_tmr", UPDATE_TOTAL_PERIOD, UPDATE_TOTAL_PERIOD, OS_OPT_TMR_PERIODIC, update_total_timer, NULL, &err);
  586. OSTmrStart(&g_updateProg.update_total_time, &err);
  587. printf("0x16 update total timer start\r\n");
  588. }
  589. void net_queue_insert(char *p_msg, uint32_t msg_len)
  590. {
  591. OS_ERR err;
  592. OSSemPend(&sys_net.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  593. OS_QPost(&sys_net.net_q, p_msg, msg_len, OS_OPT_POST_FIFO, 0, &err);
  594. OSSemPost(&sys_net.sem, OS_OPT_POST_ALL, &err);
  595. //printf("net_queue_insert %p %d\r\n", p_msg, msg_len);
  596. }
  597. void * net_queue_mem_calloc(void)
  598. {
  599. OS_ERR err;
  600. void * p_msg = NULL;
  601. OSSemPend(&sys_net.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  602. if((sys_net.workstate == DEV_WORK_STATE_UPDATING)||
  603. (sys_net.workstate == DEV_WORK_STATE_ONLOOKER)) {
  604. OSSemPost(&sys_net.sem, OS_OPT_POST_ALL, &err);
  605. return p_msg;
  606. }
  607. p_msg = OSMemGet(&sys_net.net_m, &err);
  608. OSSemPost(&sys_net.sem, OS_OPT_POST_ALL, &err);
  609. return p_msg;
  610. }
  611. void * net_queue_mem_calloc_must(void)
  612. {
  613. OS_ERR err;
  614. void * p_msg = NULL;
  615. OSSemPend(&sys_net.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  616. p_msg = OSMemGet(&sys_net.net_m, &err);
  617. OSSemPost(&sys_net.sem, OS_OPT_POST_ALL, &err);
  618. return p_msg;
  619. }
  620. int net_queue_mem_free(void * p_msg)
  621. {
  622. OS_ERR err;
  623. OSSemPend(&sys_net.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  624. OSMemPut(&sys_net.net_m, p_msg, &err);
  625. OSSemPost(&sys_net.sem, OS_OPT_POST_ALL, &err);
  626. return err;
  627. }
  628. void collect_msg_frame_fill(gateway_collect_com_t *p_msg,uint8_t msg_type,uint16_t len)
  629. {
  630. p_msg->frame_header = 0xfefe;
  631. p_msg->type = msg_type;
  632. p_msg->proto_ver = 0x01;
  633. p_msg->seq_no = sys_net.seq_no++;
  634. p_msg->len = len;
  635. p_msg->secondType = 0;
  636. // CRC_ResetDR();
  637. // CRC_CalcBlockCRC((uint32_t*)p_msg, GATE_COLL_HEAD_LEN + len);
  638. // p_msg->fcs = CRC_GetCRC()&0xffff;
  639. return ;
  640. }
  641. void net_msg_frame_fill(gateway_collect_com_t *p_msg, uint8_t msg_type, uint16_t len)
  642. {
  643. static uint32_t msg_no = 0;
  644. uint16_t crc;
  645. p_msg->frame_header = 0xfefe;
  646. p_msg->proto_ver = 0x01;
  647. p_msg->seq_no = msg_no;
  648. p_msg->type = msg_type;
  649. p_msg->secondType = 0x00;
  650. p_msg->len = len+2;// 后面加两个字节的CRC
  651. crc = _crc16_get((uint8_t *)p_msg,p_msg->len + GATE_COLL_HEAD_LEN -2 );
  652. p_msg->taxinfo.info[p_msg->len -2] = crc&0xff;
  653. p_msg->taxinfo.info[p_msg->len - 1] = (crc>>8)&0xff;
  654. // data_dump("send repeat updata", (uint8_t *)p_msg, p_msg->len + 12);
  655. return ;
  656. }
  657. extern volatile uint32_t TickCounter;
  658. void net_timer_proc(void *p_tmr, void *p_arg)
  659. {
  660. // inner_msg_format_t *p_msg = NULL;
  661. // p_msg = (inner_msg_format_t *)net_queue_mem_calloc();
  662. // p_msg->frame_header = 0xfefe;
  663. // p_msg->type = net_msg_type_timer;
  664. // net_queue_insert((char *)p_msg, sizeof(inner_msg_format_t));
  665. //
  666. // printf("net_timer_proc %d!!!\r\n", TickCounter);
  667. }
  668. extern void lora_send(char *tx_data, uint32_t tx_len);
  669. void svc_init(u32 dev_type, u32 dev_id)
  670. {
  671. OS_ERR err;
  672. // printf("dev_type:%d\n",dev_type);
  673. switch(dev_type) {
  674. case DEV_TYPE_COLLECT_STATION:// 采集器
  675. sys_net.uplink_send = lora_send;
  676. // tax_init();
  677. break;
  678. case DEV_TYPE_OILTANK_STATION: // 油罐车
  679. sys_net.uplink_send = lora_send;
  680. // oiltank_init();
  681. break;
  682. case DEV_TYPE_GATEWAY: // 网关设备
  683. sys_net.net_hdl = uplink_net_init((char*)g_upLinkTopic);
  684. sys_net.uplink_send = uplink_net_send; //上传数据的函数指针 4G
  685. sys_net.downlink_send = lora_send; // 下发数据的函数指针 lora
  686. break;
  687. default:
  688. printf("dev_type = %d error !!!\r\n", dev_type);
  689. break;
  690. }
  691. device_init(dev_type, dev_id);
  692. }
  693. //void net_msg_recv(void)
  694. //{
  695. // int len = 0;
  696. // char *str;
  697. // char *msg = NULL;
  698. // inner_msg_format_t *p_msg = NULL;
  699. // OS_ERR err;
  700. //
  701. // memset(sys_net.str, 0, sizeof(sys_net.str));
  702. // len = Module_Blocking_Read(sys_net.str, 0);
  703. // if(len) {
  704. // str = strstr(sys_net.str, "byte,");
  705. // p_msg = (inner_msg_format_t *)(str + 5);
  706. // if(str) {
  707. // /* 接受消息, 发往net_proc模块统一处理 */
  708. // msg = (char *)net_queue_mem_calloc();
  709. // if(msg) {
  710. // memcpy(msg, p_msg, p_msg->len + FRAME_HEADER_LEN);
  711. // OS_QPost(&sys_net.net_q, msg, p_msg->len + FRAME_HEADER_LEN, OS_OPT_POST_FIFO, 0, &err);
  712. // }
  713. // data_dump("NET RECB", (uint8_t *)p_msg, p_msg->len + FRAME_HEADER_LEN);
  714. // }
  715. // }
  716. //}
  717. void svc_proc(uint32_t dev_type, uint32_t dev_id)
  718. {
  719. OS_ERR err;
  720. if((downlink_config.gateway_id==0x00000000) || (downlink_config.gateway_id == 0xFFFFFFFF)) return;
  721. if(g_ptTest.bTestStart == PT_ON ) return;
  722. dev_type = DEV_TYPE_GATEWAY;
  723. svc_init(dev_type, dev_id);
  724. timeout_setValue(&g_timeOut,3*60000); // 十分钟读取一次60*1000*10
  725. timeout_start(&g_timeOut);
  726. timeout_setValue(&g_uart4Time,200);//100ms
  727. timeout_setValue(&g_uart5Time,200);//100ms
  728. while(1) {
  729. if(((g_runData.bUpdate!=0) && (g_updateProg.updateProgFrom==UPDATE_PROG_FROM_GATEWAY)) || (g_runData.bResetUpdate==2)) {
  730. gateway_update_gateway_status();
  731. gateway_update_status_send(&sys_net);
  732. goto END_DELAY;
  733. }
  734. oiltank_operation(0);
  735. END_DELAY:
  736. OSTimeDlyHMSM(0, 0, 0, 5, OS_OPT_TIME_DLY, &err);
  737. }
  738. }
  739. /*******************************/
  740. void net_queue_proc_test(void)
  741. {
  742. OS_ERR err;
  743. sverMsgHeader *p_msg;
  744. OS_MSG_SIZE msg_len;
  745. uint8_t type,type1 = 0;
  746. //printf("net_queue_proc 1111\r\n");
  747. OSSemPend(&sys_net.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  748. p_msg = (sverMsgHeader *)OSQPend(&sys_net.net_q, 0, OS_OPT_PEND_NON_BLOCKING, &msg_len, NULL, &err); /* blocking. */
  749. OSSemPost(&sys_net.sem, OS_OPT_POST_ALL, &err);
  750. type = (p_msg->msgtypeSecd>>8)&0xFF;
  751. if(p_msg&&msg_len)
  752. {
  753. if(type == TAX_UPLINK_TYPE)
  754. {
  755. set_led_status(3,1);
  756. gw_net_send((char *)p_msg, msg_len); //向服务器端发送消息
  757. printf("\r\n mqtt send tax end type = %d, cmd = %x\r\n",p_msg->msgtypeFirst,p_msg->msgtypeSecd);
  758. set_led_status(3,0);
  759. }
  760. else if(type == DOWNLINK_CONFIG_TYPE)
  761. {
  762. set_led_status(2,1);
  763. downlink_gateway_analyze((uint8_t *)p_msg, msg_len); //接收服务器端的消息
  764. set_led_status(2,0);
  765. }
  766. net_queue_mem_free(p_msg);
  767. }
  768. }
  769. /*******************************/
  770. void net_proc(void)
  771. {
  772. OS_ERR err;
  773. memset(&sys_net, 0, sizeof(sys_net));
  774. OSSemCreate(&sys_net.sem, "net_sem", 1, &err);
  775. OSQCreate(&sys_net.net_q, "net_queue", 4, &err);//创建网络消息处理队列
  776. OSMemCreate(&sys_net.net_m, "net_memory", sys_net.memory, 4, 1024, &err);//创建内存管理池
  777. printf("net_proc finish !!!\r\n");
  778. while(sys_net.dev_type == 0) {
  779. sys_net.dev_type = device_type_get(); //
  780. OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
  781. }
  782. sys_net.workstate = 0;
  783. g_runData.bInitNetProc = 1;
  784. while(1) {
  785. if(g_ptTest.bTestStart == PT_ON) {
  786. OSTimeDlyHMSM(0, 0, 0, 5, OS_OPT_TIME_DLY, &err);
  787. continue;
  788. }
  789. if(sys_net.dev_type == DEV_TYPE_GATEWAY)
  790. {
  791. if(sys_net.net_hdl) {
  792. net_msg_recv1();
  793. }
  794. }
  795. net_queue_proc_test();
  796. OSTimeDlyHMSM(0, 0, 0, 5, OS_OPT_TIME_DLY, &err);
  797. }
  798. }
  799. //void net_msg_recv_test(void)
  800. //{
  801. // int len = 0;
  802. // char *str;
  803. // char *msg = NULL;
  804. // inner_msg_format_t *p_msg = NULL;
  805. // OS_ERR err;
  806. //
  807. // memset(sys_net.str, 0, sizeof(sys_net.str));
  808. // len = Module_Blocking_Read(sys_net.str, 0);
  809. // if(len) {
  810. // str = strstr(sys_net.str, "byte,");
  811. // p_msg = (inner_msg_format_t *)(str + 5);
  812. // if(str) {
  813. // /* 接受消息, 发往net_proc模块统一处理 */
  814. // msg = (char *)net_queue_mem_calloc();
  815. // if(msg) {
  816. // memcpy(msg, p_msg, p_msg->len + FRAME_HEADER_LEN);
  817. // OS_QPost(&sys_net.net_q, msg, p_msg->len + FRAME_HEADER_LEN, OS_OPT_POST_FIFO, 0, &err);
  818. // }
  819. // data_dump("NET RECB", (uint8_t *)p_msg, p_msg->len + FRAME_HEADER_LEN);
  820. // }
  821. // }
  822. //}