#include "stm32f4xx.h" #include #include "at.h" #include #include "queue.h" #include "atair720.h" #include "flash_if.h" #include "board-config.h" #include "usart.h" #include "WatchDog.h" #include "sys_tick.h" #include "sx1276_api.h" #include "para-config.h" #include "led.h" #include "type-spec.h" #include #include "atoi.h" #include "main.h" #include "ota.h" //#include "usart.h" #define TEST_TEST_TEST 1 #define UART2_Buffer_Max_LEN 256 #define USART_REC_LEN 200 //定义最大接收字节数 200 #define RevOK 1 #define Idle 0 #define Reving 2 uint8_t Air_IMEI[32]={0}; uint8_t Air_ICCID[32]={0}; //TCP连接超时 u16 TcpConnectTimeOut = 0; uint16_t USART1RxSta = 0; //TCP连接OK标识 u8 CONNECTISOK = 0; extern struct UsartRxBuffer Usart2RxBuffer; /** * @brief 向 AIR 模块发送命令后,检测接收到的应答 * @param str 期待的应答结果 * @retval 0 没有得到期待的应答结果 其他 期待应答结果的位置 */ char* air_check_cmd(char *str) { char *strx = 0; char *CONNECTOK = "CONNECT OK"; if(str == NULL) return strx; /* 添加结束符 */ strx = strstr((const char*)Usart2RxBuffer.pBuffer, (const char*)str); if( NULL != strstr((const char*)Usart2RxBuffer.pBuffer, (const char*)CONNECTOK ) ) { CONNECTISOK = 1; TcpConnectTimeOut = 0; } return (char*)strx; } /** * @brief 实现下载 * @param cmd 发送的命令 * @param ack 期待的应答结果 * @param waittime 等待时间(单位:10ms) * @retval 0 发送成功 1 发送失败 */ uint8_t * air_send_HTTPREADCmd(uint16_t srcadr,uint16_t downcLen, uint16_t waittime) { uint8_t res,cmdtmp[100],tmp[50],len; u8 times = 3; uint32_t wait = waittime,readlen,cmdLen,codelen = downcLen; char *cmdTmp; char *AckTmp = "+HTTPACTION:",*pstrx,*pchar,*pres=NULL; memset(cmdtmp,0,50); cmdLen = strlen("AT+HTTPREAD="); memcpy(cmdtmp,"AT+HTTPREAD=",cmdLen); memset(tmp,0,50); len = myitoa(srcadr,(char *)&tmp[0]);//address strcat((char *)&cmdtmp[0],(char *)&tmp); cmdLen += len; memset(tmp,0,50); strcat((char *)&cmdtmp[0],",");//, cmdLen += 1; memset(tmp,0,50); myitoa(codelen,(char *)&tmp[0]);//data len strcat((char *)&cmdtmp[0],(char *)&tmp); cmdLen += strlen((char *)&tmp[0]); strcat((char *)&cmdtmp[0],"\r\n"); cmdLen +=strlen("\r\n"); times = 10; res = 0; AT_AIR720_DEBUG_F("%s",cmdtmp); USART2_ready_buf_ok = 0; while(times) { times--; /* 发送下一条命令之前,清接收状态 */ memset(Usart2RxBuffer.pBuffer , 0 , USART2_BUF_SIZE); Usart2RxBuffer.Buffer_Len = 0; USART2_ready_buf_ok = Idle; USART2_SendNByte((uint8_t *)cmdtmp, cmdLen); wait=waittime; if(wait) { while(--wait) { delay_ms(100); /* 接收到一帧数据 */ //AT_AIR720_DEBUG_F("%s:wait!!!!","+HTTPREAD:"); if (USART2_ready_buf_ok == RevOK) { USART2_ready_buf_ok = Idle; AT_AIR720_DEBUG_F("cmd rcv =%s\r\n",Usart2RxBuffer.pBuffer); /* 添加结束符 */ pstrx = strstr((const char*)Usart2RxBuffer.pBuffer, "+HTTPREAD:"); if(pstrx == NULL) { break; } pstrx += strlen("+HTTPREAD: "); pchar = strstr((const char*)pstrx, "\r\n"); *pchar = '\0'; readlen = atoi(pstrx); if(readlen == downcLen) { pres = pchar+2; res = 1; break; } //AT_AIR720_DEBUG_F("%s:send ok!!!!",cmd); break; } USART2_ready_buf_ok = Idle; } IWDG_Feed(); //喂狗 } return (uint8_t *)pres; } return NULL; } /** * @brief 向 AIR 模块发送命令 * @param cmd 发送的命令 * @param ack 期待的应答结果 * @param waittime 等待时间(单位:10ms) * @retval 0 发送成功 1 发送失败 */ uint8_t air_send_cmd(char *cmd, char *ack, uint16_t waittime) { uint8_t res = 0; u8 times = 3; uint16_t wait = waittime; //memset(Usart2_RX_BUF , 0 , 64); //AT_AIR720_DEBUG_F("%s!!!!",cmd); times = 10; while(times) { times--; /* 发送下一条命令之前,清接收状态 */ memset(Usart2RxBuffer.pBuffer , 0 , USART2_BUF_SIZE); Usart2RxBuffer.Buffer_Len = 0; USART2_ready_buf_ok = Idle; USART2_SendNByte((uint8_t *)cmd, strlen((const char *)cmd)); //AT_AIR720_DEBUG_F("%s:send!!!!",cmd); wait=waittime; if(ack && wait) { while(--wait) { delay_ms(10); /* 接收到一帧数据 */ //AT_AIR720_DEBUG_F("%s:wait!!!!",cmd); if (USART2_ready_buf_ok == RevOK) { USART2_ready_buf_ok = Idle; AT_AIR720_DEBUG_F("cmd rcv =%s\r\n",Usart2RxBuffer.pBuffer); /* 接收到期待的应答结果 */ if (air_check_cmd(ack)) { AT_AIR720_DEBUG_F("air_send_cmd:2:%s ACK OK!!!!!!!!!!\r\n",cmd); times = 0; res = 1; //AT_AIR720_DEBUG_F("%s:send ok!!!!",cmd); break; } } IWDG_Feed(); //喂狗 } } } return res; } /** * @brief air_send_HTTPACTIONCmd * @param cmd 发送的命令 * @param ack 期待的应答结果 * @param waittime 等待时间(单位:10ms) * @retval 0 发送成功 1 发送失败 */ uint8_t air_send_HTTPACTIONCmd(uint8_t index, uint32_t *pLen, uint16_t waittime) { uint8_t res = 0; u8 times = 3,get_Wait_flg; uint16_t wait = waittime,len,i; const char *cmdTmp = "AT+HTTPACTION=0\r\n"; const char *AckTmp = "+HTTPACTION:",*strx; //memset(Usart2_RX_BUF , 0 , 64); char *ACkOK = "OK"; USART2_ready_buf_ok = 0; res=air_send_cmd(( char *)cmdTmp, ACkOK, 300); while(res &&waittime) { waittime--; delay_ms(10); //AT_AIR720_DEBUG_F("%s:wait len!!!!","AT+HTTPACTION"); if (USART2_ready_buf_ok == RevOK) { USART2_ready_buf_ok = Idle; AT_AIR720_DEBUG_F("cmd rcv =%s\r\n",Usart2RxBuffer.pBuffer); strx = strstr((const char*)Usart2RxBuffer.pBuffer, (const char*)AckTmp ); for(i = 0;i< USART2_ready_buf_len;i++) printf("%02X ",USART2_ready_buf[i]); if(strx == NULL) { AT_AIR720_DEBUG_F("%s NULL!!!!",AckTmp); break; } strx = strstr((const char*)strx, "," ); if(strx == NULL) { break; } strx+=1; strx = strstr((const char*)strx, "," ); if(strx == NULL) { break; } strx +=1; *pLen = atoi(strx);//获取接收长度 res = 1; break; } IWDG_Feed(); //喂狗 } return res; } /** * @brief air_send_IMEI_Cmd * @param cmd 发送的命令 * @param ack 期待的应答结果 * @param waittime 等待时间(单位:10ms) * @retval 0 发送成功 1 发送失败 */ uint8_t air_send_IMEI_Cmd(uint16_t waittime) { uint8_t res = 1; u8 times = 3,get_Wait_flg; uint16_t wait = waittime,len,i; const char *cmdTmp = "AT+CGSN\r\n"; const char *strx,*stry; //memset(Usart2_RX_BUF , 0 , 64); char *ACkOK = "OK"; times = 10; while(times--){ USART2_ready_buf_ok = 0; memset(USART2_ready_buf,0,USART2_BUF_SIZE); USART2_SendNByte((uint8_t *)cmdTmp, strlen((const char *)cmdTmp)); while(waittime) { waittime--; delay_ms(10); //AT_AIR720_DEBUG_F("%s:wait len!!!!","AT+HTTPACTION"); if (USART2_ready_buf_ok == RevOK) { strx = (const char*)USART2_ready_buf; //打印返回指令 for(i = 0;i< USART2_ready_buf_len;i++) printf("%02X ",USART2_ready_buf[i]); printf("\r\n"); //检索8 6 6 7 1 4 0 4 6 8 1 8 3 5 6 之前的"\r\n" strx = strstr((const char*)strx, "\r\n86" ); if(strx == NULL) { AT_AIR720_DEBUG_F("strx == NULL\r\n"); break; } strx+=2; //检索8 6 6 7 1 4 0 4 6 8 1 8 3 5 6 之后的"\r\n" stry = strstr((const char*)(strx), "\r\n" ); if(stry == NULL) { AT_AIR720_DEBUG_F("stry == NULL\r\n"); break; } len = (int)(stry)-(int)(strx); // if((len<=0)||(len>17)||(len>sizeof(Air_IMEI))) { AT_AIR720_DEBUG_F("((len<=0)||(len>17)||(len>sizeof(Air_IMEI)))\r\n"); AT_AIR720_DEBUG_F("len=%d,stry=0x%8X,strx=0x%8X\r\n",len,(int)stry,(int)strx); break; } //中间段为IMEI memset(Air_IMEI,0,sizeof(Air_IMEI)); for(i = 0;i < len;i++) { if((*(strx+i)>='0')||(*(strx+i)<='9')) { Air_IMEI[i]= *(strx+i); } else{ memset(Air_IMEI,0,sizeof(Air_IMEI)); AT_AIR720_DEBUG_F("((*(strx+i)<'0')||(*(strx+i)>'9'))\r\n"); return 0; } } AT_AIR720_DEBUG_F("IMEI=%s\r\n",Air_IMEI); //USART2_SendNByte(Air_IMEI,len); //AT_AIR720_DEBUG("\r\n"); return 0; } delay_ms(300); } } return res; } /** * @brief air_send_ICCID_Cmd * @param cmd 发送的命令 * @param ack 期待的应答结果 * @param waittime 等待时间(单位:10ms) * @retval 0 发送成功 1 发送失败 */ uint8_t air_send_ICCID_Cmd(uint16_t waittime) { uint8_t res = 1; u8 times = 3,get_Wait_flg; uint16_t wait = waittime,len,i; const char *cmdTmp = "AT+ICCID\r\n"; const char *strx,*stry; //memset(Usart2_RX_BUF , 0 , 64); char *ACkOK = "OK"; times = 10; while(times--){ USART2_ready_buf_ok = 0; memset(USART2_ready_buf,0,USART2_BUF_SIZE); USART2_SendNByte((uint8_t *)cmdTmp, strlen((const char *)cmdTmp)); while(waittime) { waittime--; delay_ms(10); //AT_AIR720_DEBUG_F("%s:wait len!!!!","AT+HTTPACTION"); if (USART2_ready_buf_ok == RevOK) { strx = (const char*)USART2_ready_buf; //打印返回指令 for(i = 0;i< USART2_ready_buf_len;i++) printf("%02X ",USART2_ready_buf[i]); printf("\r\n"); /* AT+ICCID +ICCID: 89860464011970002199 OK */ //检索89860464011970002199之前的"\r\n" strx = strstr((const char*)strx, "\r\n+ICCID: 8986" ); if(strx == NULL) { AT_AIR720_DEBUG_F("strx == NULL\r\n"); break; } strx+=10; //检索89860464011970002199之后的"\r\n" stry = strstr((const char*)(strx), "\r\n" ); if(stry == NULL) { AT_AIR720_DEBUG_F("stry == NULL\r\n"); break; } len = (int)(stry)-(int)(strx); // if((len<=0)||(len>20)||(len>sizeof(Air_ICCID))) { AT_AIR720_DEBUG_F("((len<=0)||(len>17)||(len>sizeof(Air_ICCID)))\r\n"); AT_AIR720_DEBUG_F("len=%d,stry=0x%8X,strx=0x%8X\r\n",len,(int)stry,(int)strx); break; } //中间段为IMEI memset(Air_ICCID,0,sizeof(Air_ICCID)); for(i = 0;i < len;i++) { if((*(strx+i)>='0')||(*(strx+i)<='9')) { Air_ICCID[i]= *(strx+i); } else{ memset(Air_ICCID,0,sizeof(Air_ICCID)); AT_AIR720_DEBUG_F("((*(strx+i)<'0')||(*(strx+i)>'9'))\r\n"); return 0; } } AT_AIR720_DEBUG_F("Air_ICCID=%s\r\n",Air_ICCID); //USART2_SendNByte(Air_IMEI,len); //AT_AIR720_DEBUG("\r\n"); return 0; } delay_ms(300); } } return res; } uint8_t bcd_h_asc ( uint8_t data) { return ((data>>4)+0x30); } uint8_t bcd_l_asc ( uint8_t data) { return ((data&0x0f)+0x30); } static uint8_t check_code(uint8_t size,uint8_t *buf) { uint8_t i; uint8_t check_c ; if(size<5) return 0; check_c =buf[2]; // for(i=3;i<(size-1);i++) check_c =check_c^buf[i]; return check_c; } extern config_t Config; extern uint8_t LoRa_receive_buf[LoRa_RCV_BUF_SIZE]; extern volatile uint32_t Air720RestCounter; #define AIR720_SQ_DEPTH (8) #define AIR720_SQ_WIDTH (128) extern sequeue_t *SX1276_Send_sq_init(uint8_t row,uint16_t col); sequeue_t * Air720_Send_Sq; sequeue_t * Air720_SqInit(void) { return Create_Empty_Sequeue(AIR720_SQ_DEPTH,AIR720_SQ_WIDTH); } sequeue_t * Air720_Rev_Sq; sequeue_t * Air720_RevSqInit(void) { return Create_Empty_Sequeue(AIR720_SQ_DEPTH,AIR720_SQ_WIDTH); } tCounterTimeOut_t time_gw_heartbeat; tCounterTimeOut_t time_gw_force_rst; void Air720_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIOB时钟 //GPIO初始化设置 GPIO_InitStructure.GPIO_Pin = AIR720_RESET_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化 GPIO_ResetBits(GPIOD, AIR720_RESET_PIN); delay_ms(500); GPIO_SetBits(GPIOD,AIR720_RESET_PIN); Air720_Send_Sq = Air720_SqInit(); Air720_Rev_Sq = Air720_RevSqInit(); time_gw_heartbeat.counter =TickCounter; time_gw_heartbeat.timeOut =60*1000; } Uint8 AT[]="AT\r\n"; #define SERVICE_IP tAT_AIRE720_StateCodes AT_aire720_State = AT_AIRE720_STATE_INIT; extern GATE_CONFIG_T gt_config_para; tCounterTimeOut_t time_at_air720_receive; #define UDP_CONNECT_RETRY_TIMES (50) void Air720_send(uint8_t*pbuf, uint8_t Size) { char at_cmd[32]; uint8_t at_len; at_len = sprintf((char *)at_cmd,"AT+CIPSEND=%d\r\n",Size); USART2_SendNByte((uint8_t *)at_cmd, at_len); delay_ms(10); USART2_SendNByte((uint8_t *)pbuf, Size); /* if(air_send_cmd(at_cmd, ">", 2)) { USART2_SendNByte((uint8_t *)pbuf, Size); //AT_AIR720_DEBUG_F("UDP send ready!!!!"); } */ } uint16_t UDP_0C_frame(void) { uint8_t temp,index; uint8_t check; uint8_t i; uint8_t frame[128]; tUNION32_T ptmp_32; index = 0; frame[index++]=0xFF; frame[index++]=0xEE; frame[index++]=0x00; frame[index++]=0x00; frame[index++]=0x0C; // 1 frame[index++]=gt_config_para.DevId[0]; //网关ID(4B) frame[index++]=gt_config_para.DevId[1]; frame[index++]=gt_config_para.DevId[2]; frame[index++]=gt_config_para.DevId[3]; frame[index++]=0x00; //预留 frame[index++]=0x00; //预留 frame[index++]=0x00; // frame[index++]=0x00; //是否加密,网关自己的0c指令不关注 frame[index++]=gt_config_para.DevId[0]; //网关ID(4B) frame[index++]=gt_config_para.DevId[1]; frame[index++]=gt_config_para.DevId[2]; frame[index++]=gt_config_para.DevId[3]; frame[index++]=gt_config_para.DevType; //网关类型 0x1,网关 0x2,液位仪 0x3,采集器 0x4,NB油机 0x5,NB液位仪 0x9,英泰赛福模块 frame[index++]=0x00; //通道号 ptmp_32.data_32=CURRENT_SOFTWARE_VER; frame[index++]=ptmp_32.data_8[0]; //网关App版本号(4B) frame[index++]=ptmp_32.data_8[1]; frame[index++]=ptmp_32.data_8[2]; frame[index++]=ptmp_32.data_8[3]; frame[index++]=gt_config_para.BLVer[0]; //网关BL版本(4B) frame[index++]=gt_config_para.BLVer[1]; frame[index++]=gt_config_para.BLVer[2]; frame[index++]=gt_config_para.BLVer[3]; frame[index++]=gt_config_para.BLVer[0]; //网关Set版本(2B) 低16位 frame[index++]=gt_config_para.BLVer[1]; frame[index++]=gt_config_para.RstCnt[0]; //复位次数 frame[index++]=gt_config_para.RstCnt[1]; frame[index++]=0x00; //逻辑和校验 frame[2] = ((index-5) >> 0) & 0xff; frame[3] = ((index-5) >> 8) & 0xff; //计算逻辑和校验 check =0x00; for(i=0;i<(index-1);i++) { check = check ^ frame[i]; } frame[index-1]=check; AT_AIR720_DEBUG_F("0C len=%02d,msg=\r\n",index); AT_AIR720_DEBUG_H(frame,index); AT_AIR720_DEBUG("\r\n"); //将组装好的0D包,入队列 En_Queue(Air720_Send_Sq,frame,sizeof(frame),index); // return (index+1); } int Air720_analysis(uint8_t *sbuf,uint8_t slen){ int ReturnCode = -1; uint8_t check=0; uint8_t scrc=0x00; uint8_t at720frame[128]; uint8_t index; uint8_t temp; uint32_t uTemp_32=0; int i; tUNION32_T *ptmp_32 = NULL; tUNION16_T *ptmp_16 = NULL; uint8_t findChannel=0; uint8_t offset=0; uint32_t fCMD1=0; uint32_t fGwID=0; uint8_t fencrypt=0; uint32_t fNodeID=0; uint32_t fport=0; uint32_t fgun=0; uint8_t fDevType=0; uint8_t fChannel=0; uint32_t fAppVer=0; uint32_t fBLVer=0; uint32_t fSetVer=0; IWDG_Feed(); //喂狗 //校验 if((sbuf==NULL)||(slen == 0)) { AT_AIR720_DEBUG_F("error:sbuf == NULL,or slen == 0\r\n"); return ReturnCode; } //帧头(1Byte) if((sbuf[0]!=0xFF)||(sbuf[1]!=0xEE)) { AT_AIR720_DEBUG_F("error:帧头错误,0x%02X%02X\r\n",sbuf[0],sbuf[1]); return ReturnCode; } //帧长度(1Byte) if((sbuf[2]!=slen-5)||(sbuf[3]!=0)) { AT_AIR720_DEBUG_F("error:sbuf[2]!=slen-5,sbuf[2]=0x%02X,slen=0x%02X\r\n",sbuf[2],slen); return ReturnCode; } //和校验 check = 0; for(i=0;idata_32; uTemp_32 = ((tUNION32_T *)>_config_para.DevId[0])->data_32; if(fGwID!=uTemp_32){ AT_AIR720_DEBUG_F("error:网关ID不匹配thisGwID=0x%08X,fGwID=0x%08X\r\n",uTemp_32,fGwID); return ReturnCode; } IWDG_Feed(); //喂狗 //解析 if(sbuf[4]==0x0C){//心跳相关的指令 offset = 13; fNodeID = ((tUNION32_T *)(sbuf+offset))->data_32; //NodeID是否匹配 //查询设备是否已在列表中 findChannel=0; for(i=0;idata_32==fNodeID){ findChannel=i+1; break; } } if(findChannel){ AT_AIR720_DEBUG_F("找到设备绑定信息!ID=0x%08X,Channel=%d\r\n",fNodeID,findChannel); AT_AIR720_DEBUG_F("0C len=%02d,msg=\r\n",slen); AT_AIR720_DEBUG_H(sbuf,slen); AT_AIR720_DEBUG("\r\n"); //帧结构完全一致,只需转发 En_Queue(Air720_Send_Sq,sbuf,slen,slen); set_led_en_process(); start_led(findChannel-1,500,80,400); //心跳计数器清零 //time_gw_heartbeat.counter = TickCounter; return 0; } else{ AT_AIR720_DEBUG_F("未找到设备绑定信息!ID=0x%08X\r\n",fNodeID); return -1; } } //非加密FFEE45000DFFFFFFFF00000000190001630101303030303030313133303638303030303030353933303939BB1AFF8601303130323033303035383034303239363538303531317481 //加 密FFEE37000D03000161000000011B00016301000000123456789000001234567890BB188101A111000101010112345678901234567890000100E51254 else if(sbuf[4]==0x0D){//业务上报相关的指令 offset = 13; fNodeID = ((tUNION32_T *)(sbuf+offset))->data_32; //NodeID是否匹配 //查询设备是否已在列表中 findChannel=0; for(i=0;idata_32==fNodeID){ findChannel=i+1; break; } } if(findChannel){ set_led_en_process(); start_led(findChannel-1,500,20,400); AT_AIR720_DEBUG_F("找到设备绑定信息!ID=0x%08X,Channel=%d\r\n",fNodeID,findChannel); //创建0D上报帧 index=0; for(i=0;i<17;i++){ //前17个字节一致, at720frame[index++] = sbuf[i]; } fport = sbuf[17]; at720frame[index++] = (findChannel-1)*2 + fport + 1; //端口号(1-12) fgun = sbuf[18]; at720frame[index++] = fgun+ 1; //枪号(1-8) fencrypt = sbuf[12];//是否加密,指英泰赛福 //如果是加密的 if(fencrypt){ //UDP总累计油量(12B) 比如0000001234.56 offset=20; index+=Hex2Ascii(at720frame+index,sbuf+offset,6); //UDP总累计金额(12B), 比如0000002222.56 offset=27; index+=Hex2Ascii(at720frame+index,sbuf+offset,6); temp = index; // 记录当前长度 // 非加密真实返回数据 // BB 1A FF 86 01 32 34 31 36 31 35 30 30 30 30 30 31 30 30 30 30 35 33 35 33 31 39 74 at720frame[index++]=0xBB; //32 //帧头 35 at720frame[index++]=0x1A; //33 //帧长度 36 at720frame[index++]=0xFF; //34 //帧号 37 at720frame[index++]=0x86; //35 //86表示当次加油数据 38 at720frame[index++]=0x01; //36 //状态 39 //日期,(6B),05日14时19分 offset=41; index+=Hex2Ascii(at720frame+index,sbuf+offset,3); //加油机返回记录 1升 offset=46; index+=Hex2Ascii(at720frame+index,sbuf+offset,3); //加油机返回记录金额 offset=51; index+=Hex2Ascii(at720frame+index,sbuf+offset,3); //单价 53.19 offset=55; index+=Hex2Ascii(at720frame+index,sbuf+offset,2); at720frame[index++] = 0x00; //小帧逻辑和校验 //计算小帧长度,固定0x1A //小帧逻辑和校验 check = 0; AT_AIR720_DEBUG_F("temp=%d\r\n",temp); for(i=temp+2;i> 0) & 0xff; at720frame[3] = ((index-5) >> 8) & 0xff; check = 0; for(i=0;i> 0) & 0xff; at720frame[3] = ((index-5) >> 8) & 0xff; check = 0; for(i=0;i>2)// uint16_t packetsize = DOWM_BYTE_SIZE; int16_t res =-1; uint16_t i,j; uint16_t cnt = 0 ,len_tail,cnt_tail,byte_tail,dlen,wlen; uint8_t *pBuff = NULL ; uint8_t flg,cntOk; Uint32 BuffTmp,addr; BuffTmp = 0; BuffTmp += packetsize + 41;//总bufer大小,41为指令的大小 if(BuffTmp>USART2_BUF_SIZE) { AT_AIR720_DEBUG_F("buffer is SMALLL!!!"); return 1; } cnt = srclen/(packetsize);//计算下载次数 len_tail = srclen%(packetsize);//不够一包剩余字节 addr = APP3_SECTOR1_START_ADD;//flash编程地址 FLASH_If_EraseSector(addr); //packetsize = 10; cntOk = 0; //while(1) { for(i=0;i>2) ;j++) { BuffTmp = *(Uint32*)(pBuff + j*sizeof(Uint32)); FLASH_ProgramWord((uint32_t)(addr + j*sizeof(Uint32)), BuffTmp); } cntOk++; addr +=packetsize; } //指示在下载 if(gt_config_para.pcb_ver ==0){ LED_Set(0,LED_FLASH); } else{ LED_MODE_Set(LED_FLASH); } } } if(i != cntOk) { AT_AIR720_DEBUG_F("down is FAIL!!!"); return -1; } if(len_tail) { pBuff = air_send_HTTPREADCmd(addr,len_tail,300); if(pBuff != NULL)//1024 { cnt_tail= len_tail>>2; //写flash for(i = 0; i=10)&&(codelen<=128*1024)){ break; } } } if((codelen<10)||(codelen>128*1024)){ AT_AIR720_DEBUG_F("升级包长度错误\r\n"); NVIC_SystemReset();// 强制复位 } IWDG_Feed(); #if 0 if(air_send_HTTPREADCmd(0,codelen, 300))/*读取数据codelen = 10; */ { AT_AIR720_DEBUG_F("AT+HTTPREADCmd=0!!!!,%d\r\n",vaildcodelen); res = 0; } #else return Update_Read_Write(codelen); #endif } #define F1_CMD2_DOWM_SVR2WG_START_UPDATE 0x01 //下行,网关->采集器,启动升级 tUpdare_Paras Updare_Paras_form_S; /******************************** * @brief Air720_Update_Down * @par pddata [tUpdare_Paras*] * @ * @retval 0初始成功,非0失败 ********************************/ int8_t Air720_Update_Down(void) { //切换模式 tUpdare_Paras *ptmp = &Updare_Paras_form_S; //Uint16 len = strlen((const char *)pURl); //ptmp->srcUrlLen = len; if((ptmp == NULL) || (ptmp->srcUrlLen < 30 ))//URL太短,小于50个字符,认为不合法 { AT_AIR720_DEBUG_F("input para error:pddata == NULL\r\n"); return -EINVAL; } AT_AIR720_DEBUG_F("Air720_Update_Down\r\n"); //模式切换 if(Down_Update_Packet(&ptmp->ppath[0],ptmp->srcUrlLen)!=0){ AT_AIR720_DEBUG_F("Air720_Update_Down exit: dowm fail!!!!!!!!!!!\r\n"); } else { Clr_Queue(lora_rx_sq); Clr_Queue(lora_tx_sq); set_ota_http_time_init(); if(Updare_Paras_form_S.desDeviceType == DEVICE_TYPE_OIL_GATEWAY){//升级网关 set_ota_upstate(0x71,Updare_Paras_form_S.firmWareType); set_main_WorkMode(GATEWAY_UPDATE_MODE); } if(Updare_Paras_form_S.desDeviceType == DEVICE_TYPE_NODE){//升级采集器 OTA_Wg2Node(DEVICE_TYPE_NODE,0xFFFFFFFF,OTA_UPDATE_FIREWARE_TYPE_APP,0xFFFFFFFF);// set_main_WorkMode(NODE_UPDATE_MODE); } AT_AIR720_DEBUG_F("Air720_Update_Down OK!!\r\n"); } return 0; } /******************************** * @brief Air720_Receive_Handle * @par sbuf [uint8_t*] 帧缓存地址 * @par slen [uint8_t] 帧长度 * @retval 0初始成功,非0失败 ********************************/ DEV_WORK_MODE_T Air720_Receive_Handle(uint8_t *sbuf,uint16_t slen) { int8_t ReturnCode = -1; uint8_t scrc=0x0000,cmd1Tmp,cmd2Tmp; DEV_WORK_MODE_T GtWorkMode =DEV_MODE_ALL ; uint8_t O9cmd2=0; int i,j; uint8_t check=0; uint8_t uTemp_8=0; uint8_t findChannel=0; uint32_t uTemp_32=0; uint8_t data_offset=0; uint32_t addrPkg=0; uint32_t id=0; uint32_t ver=0; uint8_t state=0; //uint8_t arair720[8][128]={0}; uint16_t sendLen,RevLen,sumCheck; static uint32_t cmdCnt=0; tUNION32_T *ptmp_32 = NULL,*ptmp_32_2=NULL; tUNION16_T *ptmp_16 = NULL; uint8_t *pbuf; //Frame09_t *pdst; //校验 if((sbuf == NULL)||(slen == 0)) { AT_AIR720_DEBUG_F("error:sbuf == NULL,or slen == 0,%p\r\n",sbuf); return GtWorkMode; } AT_AIR720_DEBUG_F("len=%d,msg=\r\n",USART2_ready_buf_len); for(i=0;idata_16 ; pbuf+=2;//指向命令字 //解析 ptmp_16 =(tUNION16_T *)pbuf; cmd1Tmp = ptmp_16->data_8[0]; cmd2Tmp = ptmp_16->data_8[1]; pbuf +=2;//指向设备ID if(cmd1Tmp == F1_CMD2) { switch(cmd2Tmp) { case 0xFF://启动升级,F1_CMD2_DOWM_SVR2WG_START_UPDATE // AT_AIR720_DEBUG_F("接收到升级指令!!!!!!!!!!!!!!!!!!!!!!\r\n"); ptmp_32 = (tUNION32_T *)pbuf; ptmp_32_2 = (tUNION32_T *)>_config_para.DevId; pbuf+=4;//指向参数信息 if((ptmp_32->data_32 == ptmp_32_2->data_32) ||(ptmp_32->data_32== 0xFFFFFFFF)) {//提取信息 pbuf+=1; Updare_Paras_form_S.firmWareType = *pbuf++;//提取固件类型 Updare_Paras_form_S.desDeviceType = *pbuf++; ptmp_32 =(tUNION32_T *)pbuf; ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.desDeviceID; ptmp_32_2->data_32 = ptmp_32->data_32; pbuf +=4; Updare_Paras_form_S.desDeviceChannel = *pbuf++; ptmp_32 =(tUNION32_T *)pbuf; ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.softWareOldVer; ptmp_32_2->data_32 = ptmp_32->data_32; pbuf +=4; ptmp_32 =(tUNION32_T *)pbuf; ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.softWareNewVer; ptmp_32_2->data_32 = ptmp_32->data_32; pbuf +=4; //路径长度 Updare_Paras_form_S.srcUrlLen = *pbuf++; AT_AIR720_DEBUG_F("路径长度=%d\r\n",Updare_Paras_form_S.srcUrlLen); //路径 memcpy(Updare_Paras_form_S.ppath,pbuf,Updare_Paras_form_S.srcUrlLen); AT_AIR720_DEBUG_F("url=\r\n"); AT_AIR720_DEBUG_NB(Updare_Paras_form_S.ppath,Updare_Paras_form_S.srcUrlLen); printf("\r\n"); // GtWorkMode = GATEWAY_UPDATE_DOWN_MODE; AT_AIR720_DEBUG_F("F1_CMD2_DOWM_SVR2WG_START_UPDATE\r\n"); }else { //id不匹配不做处理 } break; case O9_CMD2: break; default: break; } } IWDG_Feed(); //喂狗 return GtWorkMode; } /******************************** * @brief Air720_Receive_Handle * @par sbuf [uint8_t*] 帧缓存地址 * @par slen [uint8_t] 帧长度 * @retval 0初始成功,非0失败 ********************************/ DEV_WORK_MODE_T Air720_Receive_Handler2(uint8_t *pbuf,uint16_t plen)//接收,拆包,入队列 { uint32_t i=0; static uint32_t rcvCnt=0; DEV_WORK_MODE_T GtWorkMode =DEV_MODE_ALL ; AT_AIR720_DEBUG_F("接收,rcvCnt=%d,plen=%d:\r\n",rcvCnt++,plen); if(plen<10) return DEV_MODE_ALL; AT_AIR720_DEBUG_NB(pbuf,plen); AT_AIR720_DEBUG("\r\n"); if((pbuf[0]==0xFF)&&(pbuf[1]==0xEE)){ En_Queue(Air720_Rev_Sq,pbuf,AIR720_SQ_WIDTH,pbuf[2]+5);//AIR720_SQ_DEPTH,AIR720_SQ_WIDTH); AT_AIR720_DEBUG_F("单独,接收到服务器指令,len=%d\r\n",pbuf[2]+5); AT_AIR720_DEBUG_H(pbuf,pbuf[2]+5); } for(i=0;idata_16 ; pbuf+=2;//指向命令字 //解析 ptmp_16 =(tUNION16_T *)pbuf; cmd1Tmp = ptmp_16->data_8[0]; cmd2Tmp = ptmp_16->data_8[1]; pbuf +=2;//指向设备ID AT_AIR720_DEBUG_F("处理服务器指令,cmdCnt=%d,cmd1Tmp=0x%02X,cmd2Tmp=0x%02X,\r\n",cmdCnt,cmd1Tmp,cmd2Tmp); if(cmd1Tmp == F1_CMD2) { switch(cmd2Tmp) { case F1_CMD2_DOWM_SVR2WG_START_UPDATE://启动升级, // AT_AIR720_DEBUG_F("接收到升级指令!!!!!!!!!!!!!!!!!!!!!!\r\n"); ptmp_32 = (tUNION32_T *)pbuf; ptmp_32_2 = (tUNION32_T *)>_config_para.DevId; pbuf+=4;//指向参数信息 if((ptmp_32->data_32 == ptmp_32_2->data_32) ||(ptmp_32->data_32== 0xFFFFFFFF)) {//提取信息 pbuf+=1; Updare_Paras_form_S.firmWareType = *pbuf++;//提取固件类型 Updare_Paras_form_S.desDeviceType = *pbuf++; ptmp_32 =(tUNION32_T *)pbuf; ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.desDeviceID; ptmp_32_2->data_32 = ptmp_32->data_32; pbuf +=4; Updare_Paras_form_S.desDeviceChannel = *pbuf++; ptmp_32 =(tUNION32_T *)pbuf; ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.softWareOldVer; ptmp_32_2->data_32 = ptmp_32->data_32; pbuf +=4; ptmp_32 =(tUNION32_T *)pbuf; ptmp_32_2 = (tUNION32_T *)&Updare_Paras_form_S.softWareNewVer; ptmp_32_2->data_32 = ptmp_32->data_32; pbuf +=4; //路径长度 Updare_Paras_form_S.srcUrlLen = *pbuf++; AT_AIR720_DEBUG_F("路径长度=%d\r\n",Updare_Paras_form_S.srcUrlLen); //路径 memcpy(Updare_Paras_form_S.ppath,pbuf,Updare_Paras_form_S.srcUrlLen); AT_AIR720_DEBUG_F("url=\r\n"); AT_AIR720_DEBUG_NB(Updare_Paras_form_S.ppath,Updare_Paras_form_S.srcUrlLen); printf("\r\n"); // // // i=10; // while(i--){ // IWDG_Feed(); //喂狗 // AT_AIR720_DEBUG_F("F1_CMD2_DOWM_SVR2WG_START_UPDATE\r\n"); // delay_ms(1000); // } // return GtWorkMode; gt_config_para.is_udp_update = 1;//是UDP升级 GtWorkMode = GATEWAY_UPDATE_DOWN_MODE; set_main_WorkMode(GtWorkMode); AT_AIR720_DEBUG_F("F1_CMD2_DOWM_SVR2WG_START_UPDATE\r\n"); }else { //id不匹配不做处理 } break; default: break; } } else if(0x0C){ //接收到任何FF EE的数据,复位时间后延 time_gw_force_rst.counter=TickCounter; AT_AIR720_DEBUG_F("心跳清零\r\n"); } else if(0x0D){ } else if(0xF2){ if(cmd2Tmp==0x11){ AT_AIR720_DEBUG_F("接收到复位网关指令!!!!!!!!!!!!!!!!!!!!!!\r\n"); NVIC_SystemReset();// 复位 } } } return GtWorkMode; } ////////////////////////////////////////////////////////////////////////////////////////////// int aire720_closeHTTP_openUDP(int AireConnectState){ Uint8 sout[128]; Uint32 lout; int res=255; int i=0; Uint32 uTemp32 = 0; static Uint32 CIICR_retry_time=0; if(AireConnectState){ AT_AIR720_DEBUG_F("关闭UDP或TCP,AT+CIPCLOSE!!!!,%d\r\n",uTemp32++); if(air_send_cmd("AT+CIPCLOSE\r\n", "CLOSE OK", 200)) { AT_AIR720_DEBUG_F("AT+CIPCLOSE ok!!!!\r\n"); } else{ AT_AIR720_DEBUG_F("AT+CIPCLOSE failed!!!!\r\n"); } } AT_AIR720_DEBUG_F("AT,%d\r\n",uTemp32++); if(air_send_cmd("AT\r\n", "OK", 200)) { AT_AIR720_DEBUG_F("AT ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT failed!!!!\r\n\r\n"); } AT_AIR720_DEBUG_F("ATTE0,%d\r\n",uTemp32++); if(air_send_cmd("ATTE0\r\n", "OK", 200)) { AT_AIR720_DEBUG_F("ATTE0 ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("ATTE0 failed!!!!\r\n\r\n"); } AT_AIR720_DEBUG_F("设置为快发模式,AT+CIPQSEND=1,%d\r\n",uTemp32++); if(air_send_cmd("AT+CIPQSEND=1\r\n", "OK", 200)) // 设置为快发模式 { AT_AIR720_DEBUG_F("AT+CIPQSEND ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT+CIPQSEND failed!!!!\r\n\r\n"); } AT_AIR720_DEBUG_F("启动任务,设置APN,AT+CSTT,%d\r\n",uTemp32++); if(air_send_cmd("AT+CSTT\r\n", "OK", 200)) // 启动任务,设置APN { AT_AIR720_DEBUG_F("AT+CSTT ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT+CSTT failed!!!!\r\n\r\n"); } AT_AIR720_DEBUG_F("激活移动场景,获取IP地址,AT+CIICR%d\r\n",uTemp32++); if(air_send_cmd("AT+CIICR\r\n", "OK", 200)) // 激活移动场景,获取IP地址 { AT_AIR720_DEBUG_F("AT+CIICR ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT+CSTT failed!!!!retry=%d\r\n\r\n",CIICR_retry_time); CIICR_retry_time++; if(CIICR_retry_time>5){ return res; } } //LED_RUN_Set(LED_FLASH); IWDG_Feed(); // 确保模块工作正常 AT_AIR720_DEBUG_F("查询分配的IP地址,AT+CIFSR,%d\r\n",uTemp32++); if(air_send_cmd("AT+CIFSR\r\n", ".", 200)) //查询分配的IP地址 { AT_AIR720_DEBUG_F("AT+CIFSR ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT+CIFSR failed!!!!\r\n\r\n"); return res; } //LED_RUN_Set(LED_FLASH); IWDG_Feed(); res=0; return 0; } /***返回工作模式**/ int flg = 1; void AT_aire720_process(DEV_WORK_MODE_T *pmode){ Uint16 retryTimes = 0,sendlen,flg = 1; Uint16 lora_rcv_len = 0; Uint8 lora_rcv_buffer[128]; Uint16 at_send_len = 0; Uint8 at_send_buffer[128]; Uint16 cmd_len = 0; Uint32 uTemp32 = 0; Uint8 cmd_str[32]; Uint8 buffer[256]; DEV_WORK_MODE_T WorkMode = *pmode,ret; static Uint32 retry_time=0; static Uint32 CIICR_retry_time=0; int i; char *pchar = "AT+CPIN1111111111111111111111\r\n"; //心跳,超过一定时间没有节点的数据,则网关自己上传心跳 if((*pmode == GATEWAY_WORK_MODE)&&(TickCounter - time_gw_heartbeat.counter > time_gw_heartbeat.timeOut)){ time_gw_heartbeat.counter = TickCounter; UDP_0C_frame(); AT_AIR720_DEBUG_F("gw heartbeat time out\r\n"); } IWDG_Feed(); //喂狗 if(!Check_Seqeue_Empty(lora_rx_sq)){ IWDG_Feed(); //喂狗 lora_rcv_len = 0; memset(lora_rcv_buffer,0,sizeof(lora_rcv_buffer)); De_Queue(lora_rx_sq,lora_rcv_buffer,sizeof(lora_rcv_buffer),(uint8_t *)&lora_rcv_len); AT_AIR720_DEBUG_F("lora receive:len=%02d,msg=\r\n",lora_rcv_len); AT_AIR720_DEBUG_H(lora_rcv_buffer,lora_rcv_len); AT_AIR720_DEBUG("\r\n"); IWDG_Feed(); //喂狗 Air720_analysis(lora_rcv_buffer,lora_rcv_len); IWDG_Feed(); //喂狗 //int Air720_analysis(uint8_t *sbuf,uint8_t slen){ } switch(AT_aire720_State){ case AT_AIRE720_STATE_IDLE: // AT_aire720_State = AT_AIRE720_STATE_SEND; break; case AT_AIRE720_STATE_INIT: Air720_Init(); #if 0 AT_AIR720_DEBUG_F("尝试联网,retry_time=%d\r\n",retry_time++); if(aire720_closeHTTP_openUDP(0)){ AT_AIR720_DEBUG_F("尝试联网 failed!!!!retry_time=%d\r\n",retry_time++); if(retry_time>5){ AT_aire720_State =AT_AIRE720_STATE_CONNECTING; retry_time=0; } break; } else{ AT_AIR720_DEBUG_F("尝试联网 OK\r\n"); } #endif if(1){ for(i=0;i<10;i++){ AT_AIR720_DEBUG_F(".\r\n"); IWDG_Feed(); //喂狗 delay_ms(1000); //LED_RUN_Set(LED_FLASH); } AT_AIR720_DEBUG_F("start AT\r\n"); cmd_len = sprintf((char *)cmd_str,"AT\r\n"); USART2_SendNByte(cmd_str, cmd_len); IWDG_Feed(); //喂狗 delay_ms(1000); IWDG_Feed(); //喂狗 //LED_RUN_Set(LED_FLASH); AT_AIR720_DEBUG_F("start ATE0&W\r\n"); cmd_len = sprintf((char *)cmd_str,"ATE0&W\r\n"); USART2_SendNByte(cmd_str, cmd_len); IWDG_Feed(); //喂狗 delay_ms(1000); IWDG_Feed(); //喂狗 //LED_RUN_Set(LED_FLASH); AT_AIR720_DEBUG_F("start AT+CIPMUX=0\r\n"); cmd_len = sprintf((char *)cmd_str,"AT+CIPMUX=0\r\n"); USART2_SendNByte(cmd_str, cmd_len); IWDG_Feed(); //喂狗 delay_ms(1000); IWDG_Feed(); //喂狗 //LED_RUN_Set(LED_FLASH); AT_AIR720_DEBUG_F("start AT+CIPQSEND=1\r\n"); cmd_len = sprintf((char *)cmd_str,"AT+CIPQSEND=1\r\n"); // 设置为快发模式 USART2_SendNByte(cmd_str, cmd_len); IWDG_Feed(); //喂狗 delay_ms(1000); IWDG_Feed(); //喂狗 //LED_RUN_Set(LED_FLASH); AT_AIR720_DEBUG_F("start AT+CSTT\r\n"); cmd_len = sprintf((char *)cmd_str,"AT+CSTT\r\n"); // 启动任务,设置APN USART2_SendNByte(cmd_str, cmd_len); IWDG_Feed(); //喂狗 delay_ms(1000); IWDG_Feed(); //喂狗 //LED_RUN_Set(LED_FLASH); AT_AIR720_DEBUG_F("start AT+CIICR\r\n"); cmd_len = sprintf((char *)cmd_str,"AT+CIICR\r\n"); // 激活移动场景,获取IP地址 USART2_SendNByte(cmd_str, cmd_len); IWDG_Feed(); //喂狗 delay_ms(1000); IWDG_Feed(); //喂狗 //LED_RUN_Set(LED_FLASH); AT_AIR720_DEBUG_F("start AT+CIFSR\r\n"); cmd_len = sprintf((char *)cmd_str,"AT+CIFSR\r\n"); //查询分配的IP地址 USART2_SendNByte(cmd_str, cmd_len); IWDG_Feed(); //喂狗 delay_ms(1000); IWDG_Feed(); //喂狗 //LED_RUN_Set(LED_FLASH); } else{ AT_AIR720_DEBUG_F("AT_AIRE720_STATE_INIT!!!!,%d\r\n",uTemp32++); for(i=0;i<5;i++){ AT_AIR720_DEBUG_F(".%d\r\n",uTemp32++); IWDG_Feed(); //喂狗 delay_ms(1000); //LED_RUN_Set(LED_FLASH); } AT_AIR720_DEBUG_F("AT,%d\r\n",uTemp32++); if(air_send_cmd("AT\r\n", "OK", 200)) { AT_AIR720_DEBUG_F("AT ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT failed!!!!\r\n\r\n"); } AT_AIR720_DEBUG_F("ATTE0,%d\r\n",uTemp32++); if(air_send_cmd("ATTE0\r\n", "OK", 200)) { AT_AIR720_DEBUG_F("ATTE0 ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("ATTE0 failed!!!!\r\n\r\n"); } //AT_AIR720_DEBUG_F("设置为快发模式,AT+CIPQSEND=1,%d\r\n",uTemp32++); if(air_send_cmd("AT+CIPQSEND=1\r\n", "OK", 200)) // 设置为快发模式 { AT_AIR720_DEBUG_F("AT+CIPQSEND ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT+CIPQSEND failed!!!!\r\n\r\n"); } //AT_AIR720_DEBUG_F("启动任务,设置APN,AT+CSTT,%d\r\n",uTemp32++); if(air_send_cmd("AT+CSTT\r\n", "OK", 200)) // 启动任务,设置APN { AT_AIR720_DEBUG_F("AT+CSTT ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT+CSTT failed!!!!\r\n\r\n"); } //AT_AIR720_DEBUG_F("激活移动场景,获取IP地址,AT+CIICR%d\r\n",uTemp32++); if(air_send_cmd("AT+CIICR\r\n", "OK", 1000)) // 激活移动场景,获取IP地址 { AT_AIR720_DEBUG_F("AT+CIICR ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT+CSTT failed!!!!retry=%d\r\n\r\n",CIICR_retry_time); CIICR_retry_time++; if(CIICR_retry_time>5){ AT_aire720_State =AT_AIRE720_STATE_CONNECTING; CIICR_retry_time=0; } break; } //LED_RUN_Set(LED_FLASH); IWDG_Feed(); // 确保模块工作正常 AT_AIR720_DEBUG_F("查询分配的IP地址,AT+CIFSR,%d\r\n",uTemp32++); if(air_send_cmd("AT+CIFSR\r\n", ".", 200)) //查询分配的IP地址 { AT_AIR720_DEBUG_F("AT+CIFSR ok!!!!\r\n\r\n"); } else{ AT_AIR720_DEBUG_F("AT+CIFSR failed!!!!\r\n\r\n"); } //LED_RUN_Set(LED_FLASH); IWDG_Feed(); } AT_aire720_State =AT_AIRE720_STATE_CONNECTING; break; case AT_AIRE720_STATE_CONNECTING: /* 连接服务器 */ retryTimes = 0; while(retryTimes++ < UDP_CONNECT_RETRY_TIMES) { IWDG_Feed(); #if TEST_TEST_TEST //124.70.207.36 9084 //47.104.15.180 9082 // // cmd_len = sprintf((char *)cmd_str,"AT+CIPSTART=\"UDP\",\"124.70.207.36\",\"9084\"\r\n"); cmd_len = sprintf((char *)cmd_str,"AT+CIPSTART=\"UDP\",\"47.104.15.180\",\"9082\"\r\n"); AT_AIR720_DEBUG_F("%s,%d\r\n",cmd_str,uTemp32++); #else cmd_len = sprintf((char *)cmd_str,"AT+CIPSTART=\"UDP\",\"47.104.15.180\",\"9080\"\r\n"); AT_AIR720_DEBUG_F("%s,%d\r\n",cmd_str,uTemp32++); #endif if(air_send_cmd((char *)cmd_str, "OK", 100))/*建立UDP链接*/ { AT_aire720_State = AT_AIRE720_STATE_CONNECT_OK; AT_AIR720_DEBUG_F("UDP connect ok!!!!,%d\r\n",uTemp32++); //Air720_send(cmd_str,cmd_len); // Air720_send((uint8_t *)pchar,strlen((char *)pchar)); break; } //LED_RUN_Set(LED_FLASH); } if(AT_aire720_State != AT_AIRE720_STATE_CONNECT_OK) { AT_AIR720_DEBUG_F("ERROR:UDP connect fail!!!!,%d\r\n",uTemp32++); AT_AIR720_DEBUG_F("ERROR:UDP connect fail!!!!,%d\r\n",uTemp32++); AT_AIR720_DEBUG_F("ERROR:UDP connect fail!!!!,%d\r\n",uTemp32++); NVIC_SystemReset();// 复位 } else { IWDG_Feed(); //喂狗 delay_ms(200); AT_AIR720_DEBUG_F("%d\r\n",uTemp32++); if(air_send_IMEI_Cmd(10)) { AT_AIR720_DEBUG_F("read imei,%d\r\n",uTemp32++); } //LED_RUN_Set(LED_FLASH); AT_AIR720_DEBUG_F("%d\r\n",uTemp32++); if(air_send_ICCID_Cmd(10)) { AT_AIR720_DEBUG_F("read iccid,%d\r\n",uTemp32++); } //LED_RUN_Set(LED_FLASH); //联网之后先心跳 UDP_0C_frame(); //无服务器反馈指令时,设置强制复位时间1小时 time_gw_force_rst.timeOut=60*60*1000; } // for(i=0;i5){ // AT_aire720_State =AT_AIRE720_STATE_CONNECTING; // retry_time=0; // } // break; // } // else{ // AT_AIR720_DEBUG_F("尝试联网 OK\r\n"); // } // // AT_AIR720_DEBUG_F("关闭UDP或TCP,AT+CIPCLOSE!!!!,%d\r\n",uTemp32++); // if(air_send_cmd("AT+CIPCLOSE\r\n", "CLOSE OK", 200)) // { // AT_AIR720_DEBUG_F("AT+CIPCLOSE ok!!!!\r\n"); // } // else{ // AT_AIR720_DEBUG_F("AT+CIPCLOSE failed!!!!\r\n"); // } AT_aire720_State =AT_AIRE720_STATE_CONNECTING; break; default: AT_aire720_State = AT_AIRE720_STATE_IDLE; break; } return; } void set_at_aire720_workState(tAT_AIRE720_StateCodes mode){ AT_aire720_State = mode; return; }