net_proc.c 36 KB

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