#include "air780e.h" FIFO_T g_4Grxfifo; // 4G的接收缓冲区 FIFO_T g_4Gtxfifo; // 4G的发送缓冲区 _4GMsgInfo g_4gMsg; MqttMsg g_mqttMsg; MqttCHmsg g_mqttCHmsg; extern volatile uint32_t g_tick; static uint8_t _tempbuff[256] = {'\0'}; static uint8_t _temp4Gbuff[640]; static uint8_t buff[256]; uint8_t AT_GET_Data_2Param(char * buff1,uint8_t get_data[],char*head,char*tail) { uint16_t i; uint16_t len1,len2; char *t = NULL; char *h=strstr(buff1,head); if(strstr(buff1,head)&&strstr(buff1,tail)) { len1=strlen(h); /*剩余长度*/ len2=strlen(head); /*头子串长度*/ t=strstr(h+len2,tail); if(len1>len2){ for(i=0;h+i+len2!=t;i++){ get_data[i]=h[i+len2]; } get_data[i]='\0';//加上结束符 } else{ printf("\r\n字串长度错误\r\n"); return 0; } } else { if(!strstr(buff1,head))printf("\r\n未能检索到头字串\r\n"); if(!strstr(buff1,tail))printf("\r\n未能检索到尾字串\r\n"); printf("\r\n请检查你的数据原文:\r\n"); printf("%s", buff1); return 0; } return 1; } void send_cmd_to_mqtt(char *str,uint8_t cmd) { if(g_uart1Info.bSdFinish == 1){ //printf("发送:%d, %s",g_uart1Info.bSdFinish, str); g_uart1Info.cmd = cmd; memset(g_uart1Info.txfifo,0,USART1_TX_SIZE); strcpy((char*)g_uart1Info.txfifo,str); usart_tx_dma_send(USART1,g_uart1Info.txfifo,strlen((char*)g_uart1Info.txfifo)); } else printf("上次发送未完成\r\n"); } uint8_t send_data_to_mqtt(uint8_t type, uint8_t *data, uint8_t len) { uint16_t i,ret; uint16_t send_len = 0; memset(g_uart1Info.txfifo,0,USART1_TX_SIZE); memset(_temp4Gbuff,0,640); for(i=0;i5){ g_4gMsg.bconnect = 0; g_4gMsg.noreturnNum = 0; } return ret; } void close_mqtt(void) { //uint8_t val; send_cmd_to_mqtt("AT+MDISCONNECT\r\n",AT_MDISCONNECT); waiting_uart_return(500,"OK",NULL); //if(ret==0) goto MQTT_ERROR; send_cmd_to_mqtt("AT+MIPCLOSE\r\n",AT_MIPCLOSE); waiting_uart_return(500,"OK",NULL); //if(ret==0) goto MQTT_ERROR; } void read_mqtt_power_up_msg(void) { while(U1CB.URxDataOUT != U1CB.URxDataIN){ //memset(buff,0,256); memcpy(buff,U1CB.URxDataOUT->start,U1CB.URxDataOUT->end-U1CB.URxDataOUT->start+1); printf("%s",buff); U1CB.URxDataOUT++; if(U1CB.URxDataOUT == U1CB.URxDataEND){ U1CB.URxDataOUT = &U1CB.URxDataPtr[0]; } } } unsigned char HexToChar(unsigned char bChar) { if((bChar>=0x30)&&(bChar<=0x39)) { bChar -= 0x30; } else if((bChar>=0x41)&&(bChar<=0x46)) // Capital { bChar -= 0x37; } else if((bChar>=0x61)&&(bChar<=0x66)) //littlecase { bChar -= 0x57; } else { bChar = 0xff; } return bChar; } int net_rcvdata_ch(char *data, uint8_t *out_data, int len) { int i,slen=0; uint8_t temp1,temp2; for(i = 0; i < len; i+=2) { temp1 = HexToChar(data[i]); temp2 = HexToChar(data[i+1]); out_data[slen] = (temp1<<4) | temp2; slen++; } return slen; } void read_mqtt_work_msg(void) { uint8_t srclen; uint16_t len; char *str = NULL; if(U1CB.URxDataOUT == U1CB.URxDataIN) return; // fifo为空 do{ memset(buff,0,256); if((U1CB.URxDataOUT == U1CB.URxDataIN)) break; len = U1CB.URxDataOUT->end - U1CB.URxDataOUT->start +1; str = strstr((char*)U1CB.URxDataOUT->start,(char*)"byte"); if(str != NULL){ AT_GET_Data_2Param((char*)U1CB.URxDataOUT->start,buff,",","byte"); srclen = atoi((char*)buff); memset(buff,0,256); srclen = net_rcvdata_ch(str+5,buff,srclen*2); data_dump("NET_RCB",buff,srclen); fifo_write(&g_4Grxfifo,buff,srclen); // 将数据写入到4G 接收fifo中 memset(U1CB.URxDataOUT->start,0, len); } else if(strstr((char*)U1CB.URxDataOUT->start,"+CSQ")){ printf("+++++CSQ\r\n"); } else if(strstr((char*)U1CB.URxDataOUT->start,"+CESQ")){ printf("+++++CESQ\r\n"); } else if(strstr((char*)U1CB.URxDataOUT->start,"+CREG:") \ || strstr((char*)U1CB.URxDataOUT->start,"+NO Service")){ printf("+++++CREG\r\n"); str = strstr((char*)U1CB.URxDataOUT->start,"+CREG:"); g_4gMsg.cregStatus = atoi((char*)(str+6)); // 是否已经注册网络 1:已经注册,非1:没有注册成功 g_4gMsg.bconnect = (g_4gMsg.cregStatus==1? 1: 0); printf("网络连接状态 cregStatus = :%d\r\n",g_4gMsg.cregStatus); } U1CB.URxDataOUT++; if(U1CB.URxDataOUT == U1CB.URxDataEND){ U1CB.URxDataOUT = &U1CB.URxDataPtr[0]; } }while(1); } static uint8_t waiting_uart_return(uint32_t timeout,char*str,uint32_t *value) { uint8_t ret;//, buff[256]; char *str1=NULL; int dBm,dbvl; uint8_t srclen; memset(g_uart1Info.waitMsg,0,16); strcpy((char*)g_uart1Info.waitMsg,str); start_delay_ms(timeout); memset(buff,0,256); do{ if(U1CB.URxDataOUT != U1CB.URxDataIN){ strncat((char*)buff,(char*)U1CB.URxDataOUT->start,U1CB.URxDataOUT->end - U1CB.URxDataOUT->start +1); U1CB.URxDataOUT++; if(U1CB.URxDataOUT == U1CB.URxDataEND){ U1CB.URxDataOUT = &U1CB.URxDataPtr[0]; } if(strstr((char*)buff,(char*)g_uart1Info.waitMsg)){ ret = 1; break; } } }while(!g_iDelayfinish); stop_delay_ms(); if(ret == 1) { memset((char*)_tempbuff,0,32); switch(g_uart1Info.cmd){ case AT_MQTTSTATUS: printf("收到:%s\r\n",buff); str1 = strstr((char*)buff,"+MQTTSTATU :"); *value = atoi(str1+12); break; case AT_CPIN: printf("收到:%s\r\n",buff); AT_GET_Data_2Param((char*)buff,_tempbuff,"+CPIN: ","\r\nOK"); printf("---CPIN:%s\r\n",_tempbuff); //if(strstr(_tempbuff,"READY")) ret = 1; //else ret = 2; break; case AT_CGATT: // 查询是否附着上数据网络 printf("收到:%s\r\n",buff); AT_GET_Data_2Param((char*)buff,_tempbuff,"+CGATT: ","\r\nOK"); printf("---CGATT:%s\r\n",_tempbuff); *value = atoi(_tempbuff); break; case AT_SAPRB_GPRS: // printf("收到:%s\r\n",buff); break; case AT_SAPRB_APN: // printf("收到:%s\r\n",buff); break; case AT_SAPRB_11: // printf("收到:%s\r\n",buff); break; case AT_SAPRB_21: // printf("收到:%s\r\n",buff); break; case AT_CREG: printf("收到:%s\r\n",buff); AT_GET_Data_2Param((char*)buff,_tempbuff,",","\r\nOK"); g_4gMsg.cregStatus = atoi((char*)_tempbuff); printf("网络连接状态 cregStatus = :%d\r\n",g_4gMsg.cregStatus); break; case AT_ICCID: printf("收到:%s\r\n",buff); AT_GET_Data_2Param((char*)buff,_tempbuff,"+ICCID: ","\r\n"); //printf("ICCID: %s\r\n",_tempbuff); memcpy(g_4gMsg.iccid,_tempbuff,20); //printf("ICCID: %s\r\n",g_4gMsg.iccid); break; case AT_CGSN: printf("收到:%s\r\n",buff); AT_GET_Data_2Param((char*)buff,_tempbuff,"AT+CGSN\r\n","\r\nOK"); //printf("IMEI: %s\r\n",_tempbuff); memcpy(g_4gMsg.imei,_tempbuff+2,15); break; case AT_ATI: printf("收到:%s\r\n",buff); break; case AT_CSQ: AT_GET_Data_2Param((char*)buff,_tempbuff,"+CSQ: ",","); dbvl = (uint32_t)atoi((char*)_tempbuff); if(dbvl==99) {dBm = 0; printf("signal intensity:there is no signal\r\n");} else if(dbvl>=31&&dbvl<=99) {dBm = dbvl*2-113; printf("signal intensity:-51dBm or higher\r\n");} else if(dbvl>=2&&dbvl<31) {dBm = dbvl*2-113; printf("signal intensity:-109dBm ~ -53dBm\r\n");} else if(dbvl==1) {dBm = -111; printf("signal intensity:-111dBm\r\n");} else {dBm = dbvl*2-113; printf("signal intensity:-111dBm or less\r\n");} g_4gMsg.dBm = dBm; printf("~~~~~~~~~~4g-rssi-dbm: %d\r\n",g_4gMsg.dBm); case AT_MCONNECT: printf("MQTT CONNECT SUCCESS\r\n"); g_4gMsg.bconnect = 1; g_devMsg.baskIdentity = 1; break; case AT_HTTPACTION: str = strstr((char*)buff, "," ); if(str) { printf("%s\r\n", str); str += 1; str = strstr(str, "," ); if(str) { printf("%s\r\n", str); str += 1; *value = atoi(str);//获取接收长度 } } break; default: str = strstr((char*)buff,(char*)"byte"); if(str != NULL){ AT_GET_Data_2Param((char*)buff,_tempbuff,",","byte"); srclen = atoi((char*)_tempbuff); memset(_tempbuff,0,256); srclen = net_rcvdata_ch(str+5,_tempbuff,srclen*2); data_dump("NET_RCB",_tempbuff,srclen); fifo_write(&g_4Grxfifo,_tempbuff,srclen); // 将数据写入到4G 接收fifo中 //memset(U1CB.URxDataOUT->start,0,srclen); } break; } } else { printf("超时,4G模块没有返回\r\n"); ret = 0; } return ret; } void AIR_HTTP_GET(const char *url, uint32_t *pLen) { char buff[128]={0}; send_cmd_to_mqtt("AT+CIPCLOSE\r\n",AT_NULL); //关闭UDP或TCP waiting_uart_return(200,"CLOSE OK", NULL); send_cmd_to_mqtt("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",AT_NULL); //设置HTTP功能的承载类型 waiting_uart_return(200,"OK", NULL); send_cmd_to_mqtt("AT+SAPBR=3,1,\"APN\",\"\"\r\n",AT_NULL);//设置pdp承载参数之APN waiting_uart_return(200,"OK", NULL); send_cmd_to_mqtt("AT+SAPBR=1,1\r\n",AT_NULL);//激活该承载的GPRS PDP上下文 waiting_uart_return(200,"OK", NULL); send_cmd_to_mqtt("AT+SAPBR=2,1\r\n",AT_NULL);//查询下承载的状态 waiting_uart_return(200,"OK", NULL); send_cmd_to_mqtt("AT+HTTPINIT\r\n",AT_NULL);//HTTP协议栈初始化 waiting_uart_return(200,"OK", NULL); memset(buff,0,128); sprintf(buff,"AT+HTTPPARA=\"URL\",\"%s\"\r\n", url); send_cmd_to_mqtt(buff,AT_NULL);//建立http链接 waiting_uart_return(300,"OK", NULL); send_cmd_to_mqtt("AT+HTTPACTION=0\r\n",AT_HTTPACTION); // 得到文件的大小 waiting_uart_return(6000,"+HTTPACTION:", pLen); return; } uint8_t rxfifo[1024]; uint8_t * AIR_HTTP_READ(uint32_t start_addr, uint32_t data_len) { uint8_t *p_buf = NULL; char *str=NULL; uint32_t read_len; uint8_t temp[32]; uint16_t rxlen = 0,len=0; memset(temp,0,32); sprintf((char*)temp,"AT+HTTPREAD=%d,%d\r\n", start_addr, data_len); send_cmd_to_mqtt((char*)temp,AT_NULL);//AT+HTTPREAD=, strcpy((char*)g_uart1Info.waitMsg,"+HTTPREAD: "); memset(rxfifo,0,1024); rxlen = 0; start_delay_ms(300); // while(!g_iDelayfinish); // stop_delay_ms(); do{ if(U1CB.URxDataOUT != U1CB.URxDataIN){ len = U1CB.URxDataOUT->end - U1CB.URxDataOUT->start + 1; memcpy(rxfifo+rxlen,U1CB.URxDataOUT->start,len); rxlen = rxlen + len; U1CB.URxDataOUT++; if(U1CB.URxDataOUT == U1CB.URxDataEND){ U1CB.URxDataOUT = &U1CB.URxDataPtr[0]; } str = strstr((char*)rxfifo,"+HTTPREAD: "); if(str && ((rxlen-(str-(char*)rxfifo))>=17)){ memset(temp,0,32); if(AT_GET_Data_2Param((char*)rxfifo,(uint8_t*)temp, "+HTTPREAD: ", "\r\n")){ read_len = atoi((char*)temp); } if(((char*)rxfifo+rxlen-str)>= (read_len+10)) break; } } }while(!g_iDelayfinish); stop_delay_ms(); //if(1 == ret){ memset(temp,0,32); if(AT_GET_Data_2Param((char*)rxfifo,(uint8_t*)temp, "+HTTPREAD: ", "\r\n")) { /*头尾提取方法*/ read_len = atoi((char*)temp); if(data_len == read_len) { p_buf = (uint8_t *)strstr((char*)rxfifo, "+HTTPREAD: "); p_buf = (uint8_t *)strstr((char *)p_buf, "\r\n"); p_buf += 2;/* data position. */ } // if(data_len <512){ // printf("data_len = %d, read_len= %d\r\n",data_len,read_len); // data_dump("Update Data", p_buf,read_len); // } } // } return p_buf; } /*---------------------------------------------------------------- * 激活pdp * ---------------------------------------------------------------*/ uint8_t activation_pdp(void) { uint8_t ret; uint8_t count = 0,repeat = 0; uint32_t val; REPEAT_PDP: send_cmd_to_mqtt("AT+CPIN?\r\n",AT_CPIN); // 查询SIM卡是否正常 ret = waiting_uart_return(500,"OK",NULL); if(ret==0){ count++; printf("cpin repeat %d\r\n",count); if(count <4) goto REPEAT_PDP; else goto END_PDP; } count = 0; AT_CGATT: send_cmd_to_mqtt("AT+CGATT?\r\n",AT_CGATT); // 查询是否附着上数据网络 ret = waiting_uart_return(500,"OK",&val); if((ret==0) || (val==0)){ count++; if(count <4) goto AT_CGATT; else goto END_PDP; } count = 0; send_cmd_to_mqtt("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",AT_SAPRB_GPRS); // 设置PDP ret = waiting_uart_return(500,"OK",NULL); if(ret==0) { send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP ret = waiting_uart_return(500,"OK",NULL); delay_ms(2000); if(ret == 0){ if(repeat++ < 3)goto REPEAT_PDP; else goto END_PDP; } else repeat = 0; } send_cmd_to_mqtt("AT+SAPBR=3,1,\"APN\",\"\"\r\n",AT_SAPRB_APN); // 设置PDP ret = waiting_uart_return(500,"OK",NULL); if(ret==0) { send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP ret = waiting_uart_return(500,"OK",NULL); delay_ms(2000); if(ret == 0){ if(repeat++ < 3)goto REPEAT_PDP; else goto END_PDP; } else repeat = 0; } send_cmd_to_mqtt("AT+SAPBR=1,1\r\n",AT_SAPRB_11); // 设置PDP ret = waiting_uart_return(500,"OK",NULL); if(ret==0) { send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP ret = waiting_uart_return(500,"OK",NULL); delay_ms(2000); if(ret == 0){ if(repeat++ < 3)goto REPEAT_PDP; else goto END_PDP; } else repeat = 0; } send_cmd_to_mqtt("AT+SAPBR=2,1\r\n",AT_SAPRB_21); // 设置PDP ret = waiting_uart_return(500,"OK",NULL); if(ret==0) { send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP ret = waiting_uart_return(500,"OK",NULL); delay_ms(2000); if(ret == 0){ if(repeat++ < 3)goto REPEAT_PDP; else goto END_PDP; } else repeat = 0; } return 1; END_PDP: return 0; } uint8_t init_mqtt_power_up(void) { uint8_t ret,count = 0; uint32_t val; char topic[64],sub_topic[64]; if(B4G_NOHAVE == g_devMsg.bHave4G) return 0; if(g_4gMsg.delay == 0) g_4gMsg.delay = 1; timeout_setValue(&g_4gMsg.timer,g_4gMsg.delay*TIMER_4G); printf("timer \r\n"); start_delay_ms(6000); while(!g_iDelayfinish); stop_delay_ms(); read_mqtt_power_up_msg(); start_delay_ms(6000); while(!g_iDelayfinish); stop_delay_ms(); start_delay_ms(2000); while(!g_iDelayfinish); stop_delay_ms(); printf("timer1111 \r\n"); read_mqtt_power_up_msg(); memset(g_4gMsg.upTopic,0,64); sprintf(g_4gMsg.upTopic,"cpyypt/up/%04x/%010u",g_devMsg.devType, g_devMsg.devSn); eeprom_read_mqtt_msg(); if(1 == g_mqttMsg.flag){ // 产测时配置了mqtt if(1 == g_mqttCHmsg.bChangeMqtt){ //切换mqtt服务器地址 memset(topic,0,64); sprintf(topic,"AT+MCONFIG=%04x-%010u,%s,%s\r\n",g_devMsg.devType,g_devMsg.devSn,g_mqttCHmsg.mqttMsg.admin,g_mqttCHmsg.mqttMsg.password); memset(sub_topic,0,64); sprintf(sub_topic,"AT+MIPSTART=\"%s\",\"%s\"\r\n",g_mqttCHmsg.mqttMsg.ip,g_mqttCHmsg.mqttMsg.port); } else { // 不切换mqtt服务器地址 memset(topic,0,64); sprintf(topic,"AT+MCONFIG=%04x-%010u,%s,%s\r\n",g_devMsg.devType,g_devMsg.devSn,g_mqttMsg.admin,g_mqttMsg.password); memset(sub_topic,0,64); sprintf(sub_topic,"AT+MIPSTART=\"%s\",\"%s\"\r\n",g_mqttMsg.ip,g_mqttMsg.port); } } else {// 未配置mqtt服务器地址 sprintf(g_mqttMsg.admin,"%s","admin"); sprintf(g_mqttMsg.port,"%s","9000"); sprintf(g_mqttMsg.ip,"%s","test-mqtt.cpyypt.cn"); sprintf(g_mqttMsg.password,"%s","houjianwei"); eeprom_write_mqtt_msg((uint8_t*)&g_mqttMsg,sizeof(MqttMsg)); memset(topic,0,64); sprintf(topic,"AT+MCONFIG=%04x-%010u,%s,%s\r\n",g_devMsg.devType,g_devMsg.devSn,"admin","houjianwei"); memset(sub_topic,0,64); sprintf(sub_topic,"AT+MIPSTART=\"%s\",\"%s\"\r\n","test-mqtt.cpyypt.cn","9000"); } send_cmd_to_mqtt("AT+MQTTSTATU\r\n",AT_MQTTSTATUS); ret = waiting_uart_return(500,"OK",&val); if(ret==0) goto MQTT_ERROR; if(val != 0){ send_cmd_to_mqtt("AT+MIPCLOSE\r\n",AT_MIPCLOSE); ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; } send_cmd_to_mqtt("AT\r\n",AT_AT); ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; send_cmd_to_mqtt("AT\r\n",AT_AT); ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; ret = activation_pdp(); if(ret == 0) goto MQTT_ERROR; send_cmd_to_mqtt("AT+CREG=1\r\n",AT_CREGSET); ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; send_cmd_to_mqtt("AT+CREG?\r\n",AT_CREG); ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; send_cmd_to_mqtt("ATI\r\n",AT_ATI); // 回显示模式关闭 ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; send_cmd_to_mqtt("AT+ICCID\r\n",AT_ICCID); ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; send_cmd_to_mqtt("AT+CGSN\r\n",AT_CGSN); ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; send_cmd_to_mqtt("AT+CSQ\r\n",AT_CSQ); ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; REPEAT_MCONFIG: send_cmd_to_mqtt(topic,AT_MCONFIG);//"AT+MCONFIG=123,admin,houjianwei\r\n" ret = waiting_uart_return(500,"OK",NULL); if(ret==0){ count++; if(count <4) goto REPEAT_MCONFIG; else goto MQTT_ERROR; } count = 0; REPEAT_MIPSTART: send_cmd_to_mqtt(sub_topic,AT_MIPSTART);//"AT+MIPSTART=\"test-mqtt.cpyypt.cn\",\"9000\"\r\n" ret = waiting_uart_return(500,"CONNECT OK",NULL); if(ret==0){ count++; if(count <4) goto REPEAT_MIPSTART; else goto MQTT_ERROR; } count = 0; REPEAT_MCONNECT: send_cmd_to_mqtt("AT+MCONNECT=1,60\r\n",AT_MCONNECT); ret = waiting_uart_return(500,"CONNACK OK",NULL); if(ret==0){ count++; if(count <4) goto REPEAT_MCONNECT; else goto MQTT_ERROR; } count = 0; send_cmd_to_mqtt("AT+MQTTMODE=1\r\n",AT_MQTTMODE); ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; send_cmd_to_mqtt("ATE0\r\n",AT_ATE); // 回显示模式关闭 ret = waiting_uart_return(500,"OK",NULL); if(ret==0) goto MQTT_ERROR; REPEAT_MSUB_01: memset(topic,0,sizeof(topic)); sprintf((char*)topic,"%s%04x/%s",(char*)MQTT_DNLINK_TOPIC_CASE,g_devMsg.devType, (char*)"broadcast"); memset(sub_topic,0,sizeof(sub_topic)); sprintf((char*)sub_topic,"AT+MSUB=\"%s\", 0\r\n",(char*)topic); send_cmd_to_mqtt((char*)sub_topic,AT_SUB); // 订阅主题 ret = waiting_uart_return(500,"SUBACK",NULL); if(ret==0){ count++; if(count <4) goto REPEAT_MSUB_01; else goto MQTT_ERROR; } else printf("MQTT SUB01 SUCCESS\r\n"); count = 0; REPEAT_MSUB_02: memset(topic,0,sizeof(topic)); sprintf((char*)topic,"%s%04x/%010u",(char*)MQTT_DNLINK_TOPIC,g_devMsg.devType, g_devMsg.devSn); memset(sub_topic,0,sizeof(sub_topic)); sprintf((char*)sub_topic,"AT+MSUB=\"%s\", 0\r\n",(char*)topic); send_cmd_to_mqtt((char*)sub_topic,AT_SUB); // 订阅主题 ret = waiting_uart_return(500,"SUBACK",NULL); if(ret==0){ count++; if(count <4) goto REPEAT_MSUB_02; else goto MQTT_ERROR; } else printf("MQTT SUB02 SUCCESS\r\n"); count = 0; strcpy((char*)g_uart1Info.waitMsg,"+MSUB"); timeout_stop(&g_4gMsg.timer); g_4gMsg.delay = 1; if(1 == g_mqttCHmsg.bChangeMqtt){ eeprom_write_mqtt_msg((uint8_t*)&g_mqttCHmsg.mqttMsg,sizeof(MqttMsg)); g_mqttCHmsg.bChangeMqtt = 0; } //dma_config_mode_work(); return ret; MQTT_ERROR: g_4gMsg.bconnect = 0; g_devMsg.baskIdentity = 0x00; if(g_4gMsg.delay == 61){ // 一个小时没有连接上网络,则重新启动 NVIC_SystemReset(); } timeout_start(&g_4gMsg.timer); if(1 == g_4gMsg.delay) g_4gMsg.delay = 3; else if(3 == g_4gMsg.delay) g_4gMsg.delay = 5; else if(5 == g_4gMsg.delay) g_4gMsg.delay = 10; else if(10 == g_4gMsg.delay) g_4gMsg.delay = 60; else g_4gMsg.delay = 61; printf("--------------mqtt error,delay = %d\r\n",g_4gMsg.delay); if(g_4gMsg.delay == 10){ if(1 == g_mqttCHmsg.bChangeMqtt){ // 切换到原来的服务器上 g_mqttCHmsg.bChangeMqtt = 0; g_4gMsg.delay = 1; timeout_stop(&g_4gMsg.timer); timeout_setValue(&g_4gMsg.timer,g_4gMsg.delay*TIMER_4G); printf("切换服务器失败,切换到原来的服务器\r\n"); } } return ret; } /*---------------------------------------------------------------------------------- * 将需要发送的数据放到4G的发送fifo中 * 1: 操作成功 0:操作失败 * ---------------------------------------------------------------------------------*/ uint8_t add_data_to_4G_txfifo(uint8_t *txdata,uint8_t len,uint8_t msgType1,uint16_t msgType2) { //uint8_t buff[256]= {0}; static uint32_t seq_num = 0; uint16_t crc; netMsgFormat *p_msg = (netMsgFormat*)buff; if(len > 256-12) return 0; memset(buff,0,256); p_msg->start = 0xfefe; p_msg->proVer = 0x02; p_msg->msgId = (seq_num++)%0xFFFFFFFF; p_msg->msgType1 = msgType1; p_msg->msgType2 = msgType2; p_msg->palen = len + 2; memcpy(p_msg->info, txdata, len); crc = _crc16_get((uint8_t *)p_msg,len+12); p_msg->info[len] = crc&0xff; p_msg->info[len+1] = (crc>>8)&0xff; return (fifo_write(&g_4Gtxfifo,buff,len+NET_HEAD_LEN+2)); }