/*************************** (C) COPYRIGHT 2017 CXHY **************************** * 文件名 :gsm_gprs.c * 描 述 :gsm_gprs驱动代码 * 版 本 :V1.0 * 作 者 :XuZhongPing * 日 期 :2017/06/12 *********************************************************************************/ #include "ec200x.h" #include "gsm_uart.h" #include "gsm_uart_conf.h" #include "delay.h" #include "led.h" #include "string.h" #include "stdio.h" #include "stdlib.h" #include "timer.h" #include "data_typedef.h" #include "message.h" #include "tcp_protocol.h" #include "at_proc.h" #include "netwer_appcall.h" #define RCC_PeriphClock RCC_APB2Periph_GPIOB #define GSM_POW_KEY_Port GPIOB #define GSM_POW_KEY_Pin GPIO_Pin_12 uint8_t GSM_isPowerON = 0x00; //GSM模块是否处于开机标志 uint8_t ConnectionStatus = OFFLINE; //连接状态(当有数据包发送成功后置位为在线状态) uint8_t connectionClosedMark = 0; //连接断开标志 uint16_t networkConnectionCount = 0; //建立网络连接次数 static uint8_t GSM_GPRS_Status = 0x00; //GSM_GPRS的工作状态 static uint8_t GSM_GPRS_initStatus = 0x00; //GSM模块加载时的工状态 static uint8_t GSM_GPRS_workingState = 0x00; //GSM模块TCP客户端的数据收发处理工作状态 static uint8_t errorStatus = 0x00; //GSM模块异常错误处理状态 static uint8_t errorProcessCount = 0; //错误处理次数 static uint8_t sendFailureCount = 0; //发送失败计数 static uint8_t seriousError = 0; //严重的错误 uint8_t lteLoadCompletedFlag = 0; //LTE模块加载完成标志 uint8_t lteLoadResetFlag = 0; //LTE模块加载过程复位 uint8_t lteCreateSocketOkFlag = 0; //创建Socket连接完成标志 uint8_t lteCreateSocketResetFlag = 0; //创建Socket连接过程复位标志 uint8_t lteHandlerResetFlag = 0; //数据收发过程复位标志 /* *********************************************************************** * 函 数 名: LTE_Init * 功能说明: LTE模组初始化 * 形 参: 无 * 返 回 值: 无 *********************************************************************** */ void LTE_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_PeriphClock, ENABLE); //使能PB端口时钟 //GSM开关机控制引脚初始化配置 GPIO_InitStructure.GPIO_Pin = GSM_POW_KEY_Pin; //开机键端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GSM_POW_KEY_Port, &GPIO_InitStructure); GPIO_ResetBits(GSM_POW_KEY_Port, GSM_POW_KEY_Pin); //默认输出低,相当于开机键处于没有按下状态 GSM_GPRS_Uart_Init(); gsm_msg.Running = 0; } /* *********************************************************************** * 函 数 名: LTE_StatusReset * 功能说明: LTE模块各工作状态复位 * 形 参:无 * 返 回 值: 无 *********************************************************************** */ void LTE_StatusReset(void) { lteLoadResetFlag = 1; lteCreateSocketResetFlag = 1; GSM_GPRS_Status = 0x00; errorStatus = 0x00; //GSM模块异常处理时的状态复位 } /* *********************************************************************** * 函 数 名: GSM_PowerON * 功能说明: GSM模块开机 * 形 参: 无 * 返 回 值: 开机完成输出1;正在开机输出0 *********************************************************************** */ uint8_t GSM_PowerON(void) { uint8_t returnData = 0; static timer pullDown_Time; static timer pullUp_Time; static uint8_t timer_ok = 0; static uint8_t powerOnStatus = 0x00; if(timer_ok == 0) { timer_ok = 1; timer_set(&pullDown_Time, CLOCK_SECOND*3); //创建1个定时器,用于计算下拉为低电平时间 timer_set(&pullUp_Time, CLOCK_SECOND*8); //创建1个定时器,用于计算上拉为高电平时间 } switch(powerOnStatus) { case 0x00: //最初进入状态 printf("\r\nGSM模块正在开机\r\n"); GPIO_SetBits(GSM_POW_KEY_Port, GSM_POW_KEY_Pin); // GPIO_ResetBits(GSM_POW_KEY_Port, GSM_POW_KEY_Pin); timer_restart(&pullDown_Time); powerOnStatus = 0x01; break; case 0x01: //大约等待2S钟的时间,power_key按键按下2S后松开启动模块 if(timer_expired(&pullDown_Time)) { // GPIO_SetBits(GSM_POW_KEY_Port, GSM_POW_KEY_Pin); GPIO_ResetBits(GSM_POW_KEY_Port, GSM_POW_KEY_Pin); timer_restart(&pullUp_Time); powerOnStatus = 0x02; break; } break; case 0x02: if(timer_expired(&pullUp_Time)) { returnData = 1; powerOnStatus = 0x00; } break; default:break; } return returnData; } /* *********************************************************************** * 函 数 名: GSM_PowerOFF * 功能说明: GSM模块关机 * 形 参: 无 * 返 回 值: 无 *********************************************************************** */ uint8_t GSM_PowerOFF(void) { uint8_t returnData = 0; return returnData; } /* *********************************************************************** * 函 数 名: GSM_SignalCheck * 功能说明: 查询信号质量 * 形 参:无 * 返 回 值: 无 *********************************************************************** */ void GSM_SignalCheck(void) { uint8_t cnt = 0; GSM_SendAtCmd("AT+CSQ", AT_CMD_CSQ_NO); while((at_cmd_table[AT_CMD_CSQ_NO-1].result != AT_CMD_SUCCESS) && (cnt < 10)) { delay_ms(1); cnt++; } if(at_cmd_table[AT_CMD_CSQ_NO-1].result == AT_CMD_SUCCESS) { if(signal > 0) { printf("\r\nGSM信号强度 = %d\r\n", signal); if(signal < 5) { printf("\r\nGSM信号弱,请检查天线连接是否正常\r\n"); } }else{ printf("\r\n无GSM信号!!!\r\n"); } } } /* *********************************************************************** * 函 数 名: GSM_GetHardInfo * 功能说明: 取得GSM模块的硬件信息(IMEI) * 形 参: msg:保存GSM模块信息结构体 * 返 回 值: 无 *********************************************************************** */ void GSM_GetHardInfo(_gsm_msg *msg) { } /* *********************************************************************** * 函 数 名: GPRS_OnlineCheck * 功能说明: GPRS与后台连接在线与否检查(发送心跳包来检测) * 形 参:无 * 返 回 值: 无 *********************************************************************** */ static void GPRS_OnlineCheck(void) { sendMsg.msgType = 1001; //心跳 MessageSend(MSG_FIFO_PROTOCOL, sendMsg); } uint8_t startSyncNTP_Mark = 0; //开启同步NTP服务器标志 uint8_t syncNTP_SuccessMark = 0; //同步NTP服务器成功标志 typedef enum { LTE_STA_NTP_INIT = 0, //LTE模块NTP时间同步初始状态 LTE_STA_NTP_QIACT, //激活PDP场景 LTE_STA_NTP_QIACT_ACK, //激活PDP场景应答 LTE_STA_NTP_QIDEACT, //反激活PDP场景 LTE_STA_NTP_QIDEACT_ACK, //反激活PDP场景应答 LTE_STA_QNTP, //同步NTP时间服务器 LTE_STA_QNTP_ACK, //同步NTP时间服务器应答 LTE_STA_GET_CLK, //获取日期时间 LTE_STA_GET_CLK_ACK, //获取日期时间应答 LTE_STA_NTP_OK, //LTE模块加载完成状态 LTE_STA_NTP_FAILURE, //LTE模块加载失败状态 }_LTE_NTP_Status; /* *********************************************************************** * 函 数 名: EC200X_NTP_SyncHandler * 功能说明: EC200X模块同步NTP时间服务器处理程序 * 形 参:无 * 返 回 值: 无(同步时间成功后全局变量syncNTP_SuccessMark = 1) *********************************************************************** */ void EC200X_NTP_SyncHandler(void) { static _LTE_NTP_Status currentStatus = LTE_STA_NTP_INIT; static _LTE_NTP_Status nextStatus = LTE_STA_NTP_INIT; static uint8_t GSM_GPRS_initStatus = 0; static uint8_t waitTimeOutCount = 0; static timer responseTimeout; static uint8_t timer_ok = 0; if(timer_ok == 0) { timer_ok = 1; timer_set(&responseTimeout, CLOCK_SECOND*10); //创建1个定时器,用于发送AT命令后等待应答的时间 } currentStatus = nextStatus; switch(currentStatus) { case LTE_STA_NTP_INIT: //初始状态 if(startSyncNTP_Mark == 1) { startSyncNTP_Mark = 0; syncNTP_SuccessMark = 0; printf("\r\n开始同步NTP服务器\r\n"); nextStatus = LTE_STA_NTP_QIACT; break; } break; case LTE_STA_NTP_QIACT: //激活PDP GSM_SendAtCmd("AT+QIACT=1", AT_CMD_QIACT_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_NTP_QIACT_ACK; break; case LTE_STA_NTP_QIACT_ACK: //等待激活PDP应答 if(at_cmd_table[AT_CMD_QIACT_NO-1].result == AT_CMD_SUCCESS) { printf("\r\n激活PDP OK\r\n"); nextStatus = LTE_STA_QNTP; break; } if(at_cmd_table[AT_CMD_QIACT_NO-1].result == AT_CMD_FAILED) { printf("\r\n激活PDP ERROR\r\n"); nextStatus = LTE_STA_NTP_FAILURE; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n应答超时,激活PDP失败\r\n"); nextStatus = LTE_STA_NTP_FAILURE; break; } break; case LTE_STA_QNTP: //同步NTP时间服务器 // printf("\r\n同步时间\r\n"); GSM_SendAtCmd("AT+QNTP=1,\"202.112.10.36\",123", AT_CMD_QNTP_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_QNTP_ACK; break; case LTE_STA_QNTP_ACK: //等待同步时间应答 if(at_cmd_table[AT_CMD_QNTP_NO-1].result == AT_CMD_SUCCESS) { printf("\r\n时间同步OK\r\n"); nextStatus = LTE_STA_GET_CLK; break; } if(at_cmd_table[AT_CMD_QNTP_NO-1].result == AT_CMD_FAILED) { printf("\r\n时间同步 ERROR\r\n"); nextStatus = LTE_STA_NTP_QIDEACT; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n应答超时,时间同步失败\r\n"); nextStatus = LTE_STA_NTP_QIDEACT; break; } break; case LTE_STA_GET_CLK: //获取日期时间 GSM_SendAtCmd("AT+CCLK?", AT_CMD_CCLK_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_GET_CLK_ACK; break; case LTE_STA_GET_CLK_ACK: //等待获取日期时间应答 if(at_cmd_table[AT_CMD_CCLK_NO-1].result == AT_CMD_SUCCESS) { GMT_To_Beijing(&GMT_Time); printf("\r\nTime:%s\r\n", systemTime); nextStatus = LTE_STA_NTP_QIDEACT; break; } if(at_cmd_table[AT_CMD_CCLK_NO-1].result == AT_CMD_FAILED) { printf("\r\nGet Time ERROR\r\n"); nextStatus = LTE_STA_NTP_QIDEACT; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n应答超时,Get Time失败\r\n"); nextStatus = LTE_STA_NTP_QIDEACT; break; } break; case LTE_STA_NTP_QIDEACT: //PDP去激活 GSM_SendAtCmd("AT+QIDEACT=1", AT_CMD_QIDEACT_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_NTP_QIDEACT_ACK; break; case LTE_STA_NTP_QIDEACT_ACK: //等待PDP去激活应答 if(at_cmd_table[AT_CMD_QIDEACT_NO-1].result == AT_CMD_SUCCESS) { printf("\r\nPDP去激活 OK\r\n"); nextStatus = LTE_STA_NTP_OK; break; } if(at_cmd_table[AT_CMD_QIDEACT_NO-1].result == AT_CMD_FAILED) { printf("\r\nPDP去激活 ERROR\r\n"); nextStatus = LTE_STA_NTP_FAILURE; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n应答超时,PDP去激活失败\r\n"); nextStatus = LTE_STA_NTP_FAILURE; break; } break; case LTE_STA_NTP_OK: startSyncNTP_Mark = 0; syncNTP_SuccessMark = 1; printf("\r\n同步NTP服务器完成!\r\n"); nextStatus = LTE_STA_NTP_INIT; break; case LTE_STA_NTP_FAILURE: startSyncNTP_Mark = 0; syncNTP_SuccessMark = 0; nextStatus = LTE_STA_NTP_INIT; break; } } typedef enum { LTE_STA_LOADING_INIT = 0, //LTE模块加载初始状态 LTE_STA_AT_TEST, //发送AT指令,检测LTE模块是否正常 LTE_STA_AT_TEST_ACK, //发送AT指令,检测LTE模块是否正常应答 LTE_STA_AT_ECHO, //设置AT指令回显模式 LTE_STA_AT_ECHO_ACK, //设置AT指令回显模式应答 LTE_STA_CHECK_IMEI, //查询IMEI号 LTE_STA_CHECK_IMEI_ACK, //查询IMEI号应答 LTE_STA_CHECK_SIM, //查询SIM卡状态 LTE_STA_CHECK_SIM_ACK, //查询SIM卡状态应答 LTE_STA_CHECK_ICCID, //查询SIM卡的ICCID卡号 LTE_STA_CHECK_ICCID_ACK, //查询SIM卡的ICCID卡号应答 LTE_STA_CHECK_CSQ, //查询信号强度 LTE_STA_CHECK_CSQ_ACK, //查询信号强度应答 LTE_STA_CHECK_CREG, //查询CS业务注册状态(是否注册网络) LTE_STA_CHECK_CREG_ACK, //查询CS业务注册状态应答 LTE_STA_CHECK_CGREG, //查询PS业务注册状态(是否附着GPRS业务) LTE_STA_CHECK_CGREG_ACK, //查询PS业务注册状态应答 LTE_STA_QUERY_OPERATOR, //查询网络运营商 LTE_STA_QUERY_OPERATOR_ACK, //查询网络运营商应答 LTE_STA_SYNC_NTP, //同步NTP时间服务器 LTE_STA_SYNC_NTP_ACK, //等待同步NTP时间服务器应答 LTE_STA_LOADING_OK, //LTE模块加载完成状态 LTE_STA_LOADING_FAILURE, //LTE模块加载失败状态 LTE_STA_LOADING_IDLE, //LTE模块进行空闲状态 }_LTE_LoadingStatus; /* *********************************************************************** * 函 数 名: EC200X_Loading * 功能说明: EC200X模块加载(开机、查询模块的网络状态) * 形 参:无 * 返 回 值: 无 *********************************************************************** */ void EC200X_Loading(void) { static _LTE_LoadingStatus currentStatus = LTE_STA_LOADING_INIT; static _LTE_LoadingStatus nextStatus = LTE_STA_LOADING_INIT; static uint8_t GSM_GPRS_initStatus = 0; static uint8_t waitTimeOutCount = 0; static timer responseTimeout; static timer queryTime; static uint8_t timer_ok = 0; if(timer_ok == 0) { timer_ok = 1; timer_set(&responseTimeout, CLOCK_SECOND*10); //创建1个定时器,用于发送AT命令后等待应答的时间 timer_set(&queryTime, CLOCK_SECOND*2); //创建1个定时器,用于查询网络注册情况 } currentStatus = nextStatus; switch(currentStatus) { case LTE_STA_LOADING_INIT: //初始状态 if(GSM_PowerON()) { lteLoadCompletedFlag = 0; signal = 0; gsm_msg.simCardStatus = 0; //未知状态 nextStatus = LTE_STA_AT_TEST; break; } break; case LTE_STA_AT_TEST: //检测模块是否正常启动 printf("\r\n检测模块\r\n"); GSM_SendAtCmd("AT", AT_CMD_AT_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_AT_TEST_ACK; break; case LTE_STA_AT_TEST_ACK: //等待模块应答“OK” if(at_cmd_table[AT_CMD_AT_NO-1].result == AT_CMD_SUCCESS) { printf("\r\n模块正常\r\n"); nextStatus = LTE_STA_AT_ECHO; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n超时未见模块应答\r\n"); nextStatus = LTE_STA_LOADING_FAILURE; break; } break; case LTE_STA_AT_ECHO: //关闭回显 printf("\r\n关闭回显\r\n"); GSM_SendAtCmd("ATE0", AT_CMD_ATE0_NO); timer_restart(&responseTimeout); //从当前时间重新开启定时器 nextStatus = LTE_STA_AT_ECHO_ACK; break; case LTE_STA_AT_ECHO_ACK: //等待模块应答“OK” if(at_cmd_table[AT_CMD_ATE0_NO-1].result == AT_CMD_SUCCESS) { // printf("\r\n关闭回显OK\r\n"); nextStatus = LTE_STA_CHECK_IMEI; //接收到应答,跳转到0x break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n关闭回显超时未应答\r\n"); nextStatus = LTE_STA_LOADING_FAILURE; break; } break; case LTE_STA_CHECK_IMEI: //获取模块IMEI号 GSM_SendAtCmd("AT+CGSN", AT_CMD_CGSN_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_CHECK_IMEI_ACK; break; case LTE_STA_CHECK_IMEI_ACK: //等待AT指令应答 if(at_cmd_table[AT_CMD_CGSN_NO-1].result == AT_CMD_SUCCESS) { printf("\r\nIMEI = %s\r\n", gsm_msg.IMEI); waitTimeOutCount = 0; gsm_msg.Running = 1; //标志模块已经连接上GPRS nextStatus = 0xFF; // nextStatus = LTE_STA_CHECK_SIM; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n获取硬件信息超时\r\n"); nextStatus = LTE_STA_LOADING_FAILURE; break; } break; case 0xFF: //空闲等待 break; case LTE_STA_CHECK_SIM: //查询SIM卡状态 if(waitTimeOutCount > 5) //超时还未查询到网络注册状态 { waitTimeOutCount = 0; gsm_msg.simCardStatus = 4; //没有检测到SIM卡 printf("\r\n查询SIM卡状态超时或SIM卡无效!!!\r\n"); nextStatus = LTE_STA_LOADING_FAILURE; //返回到初始状态 break; } GSM_SendAtCmd("AT+CPIN?", AT_CMD_CPIN_NO); nextStatus = LTE_STA_CHECK_SIM_ACK; timer_restart(&queryTime); break; case LTE_STA_CHECK_SIM_ACK: //等待查询SIM卡AT指令应答 if(at_cmd_table[AT_CMD_CPIN_NO-1].result == AT_CMD_SUCCESS) { printf("\r\nSIM卡已经就绪\r\n"); printf("\r\n查询ICCID号\r\n"); waitTimeOutCount = 0; nextStatus = LTE_STA_CHECK_ICCID; break; } if(timer_expired(&queryTime)) //超时还未接收到应答 { waitTimeOutCount++; //等待超时计数+1 nextStatus = LTE_STA_CHECK_SIM; break; } break; case LTE_STA_CHECK_ICCID: //查询SIM卡的ICCID卡号 GSM_SendAtCmd("AT+QCCID", AT_CMD_ICCID_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_CHECK_ICCID_ACK; break; case LTE_STA_CHECK_ICCID_ACK: //查询SIM卡的ICCID卡号应答 if(at_cmd_table[AT_CMD_ICCID_NO-1].result == AT_CMD_SUCCESS) { printf("\r\nICCID = %s\r\n", gsm_msg.ICCID); nextStatus = LTE_STA_CHECK_CSQ; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n获取SIM卡的ICCID超时\r\n"); nextStatus = LTE_STA_LOADING_FAILURE; break; } break; case LTE_STA_CHECK_CSQ: //查询网络信号强度 if(waitTimeOutCount > 10) //超时还未查询到网络注册状态 { waitTimeOutCount = 0; gsm_msg.simCardStatus = 2; //无法注册网络 printf("\r\n查询不到网络信号!!!\r\n"); nextStatus = LTE_STA_LOADING_FAILURE; break; } GSM_SendAtCmd("AT+CSQ", AT_CMD_CSQ_NO); timer_restart(&queryTime); //从当前时间重新开启定时器 nextStatus = LTE_STA_CHECK_CSQ_ACK; break; case LTE_STA_CHECK_CSQ_ACK: //等待网络信号应答正常 if(at_cmd_table[AT_CMD_CSQ_NO-1].result == AT_CMD_SUCCESS) { if((signal > 0) && (signal != 99)) { printf("\r\n信号强度正常 = %d\r\n", signal); printf("\r\n查询网络注册状态\r\n"); waitTimeOutCount = 0; //等待超时计数归零 nextStatus = LTE_STA_CHECK_CREG; break; } } if(timer_expired(&queryTime)) //超时还未接收到应答 { waitTimeOutCount++; //等待超时计数+1 nextStatus = LTE_STA_CHECK_CSQ; break; } break; case LTE_STA_CHECK_CREG: //查询网络注册状态 if(waitTimeOutCount > 20) //超时还未查询到网络注册状态 { waitTimeOutCount = 0; gsm_msg.simCardStatus = 2; //无法注册网络 printf("\r\n等待超时,尚未注册网络!!!\r\n"); nextStatus = LTE_STA_LOADING_FAILURE; break; } GSM_SendAtCmd("AT+CREG?", AT_CMD_CREG_NO); timer_restart(&queryTime); //从当前时间重新开启定时器 nextStatus = LTE_STA_CHECK_CREG_ACK; break; case LTE_STA_CHECK_CREG_ACK: //等待网络注册成功 if(at_cmd_table[AT_CMD_CREG_NO-1].result == AT_CMD_SUCCESS) { printf("\r\n已经注册网络\r\n"); printf("\r\n查询是否附着GPRS业务?\r\n"); waitTimeOutCount = 0; //等待超时计数归零 nextStatus = LTE_STA_CHECK_CGREG; break; } if(timer_expired(&queryTime)) //超时还未接收到应答 { waitTimeOutCount++; //等待超时计数+1 printf("\r\nCnt = %d\r\n", waitTimeOutCount); nextStatus = LTE_STA_CHECK_CREG; break; } break; case LTE_STA_CHECK_CGREG: //检查GPRS附着状态 if(waitTimeOutCount > 10) //超时还未查询到GPRS附着状态 { waitTimeOutCount = 0; gsm_msg.simCardStatus = 3; //SIM卡没有GPRS业务 printf("\r\n等待超时,尚未附着GPRS\r\n"); nextStatus = LTE_STA_LOADING_FAILURE; break; } GSM_SendAtCmd("AT+CGREG?", AT_CMD_CGREG_NO); //检查GPRS附着状态 timer_restart(&queryTime); //从当前时间重新开启定时器 nextStatus = LTE_STA_CHECK_CGREG_ACK; break; case LTE_STA_CHECK_CGREG_ACK: //等待附着GPRS业务 if(at_cmd_table[AT_CMD_CGREG_NO-1].result == AT_CMD_SUCCESS) { gsm_msg.simCardStatus = 1; //SIM卡正常 printf("\r\n已经附着GPRS业务\r\n"); nextStatus = LTE_STA_QUERY_OPERATOR; break; } if(timer_expired(&queryTime)) //超时还未接收到应答 { waitTimeOutCount++; //等待超时计数+1 printf("\r\nCnt = %d\r\n", waitTimeOutCount); nextStatus = LTE_STA_CHECK_CGREG; break; } break; case LTE_STA_QUERY_OPERATOR: //查询网络运营商 GSM_SendAtCmd("AT+COPS?", AT_CMD_COPS_NO); //查询运营商 timer_restart(&responseTimeout); nextStatus = LTE_STA_QUERY_OPERATOR_ACK; break; case LTE_STA_QUERY_OPERATOR_ACK: //查询网络运营商应答 if(at_cmd_table[AT_CMD_COPS_NO-1].result == AT_CMD_SUCCESS) { if(gsm_msg.OperatorType == 1) { printf("\r\n中国移动\r\n"); }else if(gsm_msg.OperatorType == 2){ printf("\r\n中国联通\r\n"); }else{} nextStatus = LTE_STA_SYNC_NTP; // nextStatus = LTE_STA_LOADING_OK; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n应答超时!\r\n"); nextStatus = LTE_STA_SYNC_NTP; // nextStatus = LTE_STA_LOADING_OK; break; } break; case LTE_STA_SYNC_NTP: //开启同步NTP服务器 startSyncNTP_Mark = 1; syncNTP_SuccessMark = 0; timer_restart(&responseTimeout); nextStatus = LTE_STA_SYNC_NTP_ACK; break; case LTE_STA_SYNC_NTP_ACK: //等待NTP同步本地时间完成 EC200X_NTP_SyncHandler(); if(syncNTP_SuccessMark == 1) { syncNTP_SuccessMark = 0; nextStatus = LTE_STA_LOADING_OK; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\nNTP 同步超时!\r\n"); nextStatus = LTE_STA_LOADING_OK; break; } break; case LTE_STA_LOADING_OK: //LTE模块启动加载成功 waitTimeOutCount = 0; //等待超时计数归零 lteLoadCompletedFlag = 1; //标志LTE模块已经启动加载完成 nextStatus = LTE_STA_LOADING_IDLE; break; case LTE_STA_LOADING_FAILURE: //LTE模块加载失败 printf("\r\n模块加载失败!\r\n"); nextStatus = LTE_STA_LOADING_INIT; break; case LTE_STA_LOADING_IDLE: //空闲状态 if(lteLoadResetFlag == 1) { lteLoadResetFlag = 0; lteLoadCompletedFlag = 0; printf("\r\n模块加载过程复位!\r\n"); nextStatus = LTE_STA_LOADING_INIT; break; } break; default: nextStatus = LTE_STA_LOADING_FAILURE; break; } //加载过程需要复位 if(lteLoadResetFlag == 1) { lteLoadResetFlag = 0; lteLoadCompletedFlag = 0; printf("\r\n模块加载过程复位!\r\n"); nextStatus = LTE_STA_LOADING_INIT; } } typedef enum { LTE_STA_TCP_CREATE_INIT = 0, //初始状态 LTE_STA_SET_PDP_CONTEXT, //配置TCP/IP场景参数 LTE_STA_SET_PDP_CONTEXT_ACK, //配置TCP/IP场景参数应答 LTE_STA_QIACT, //激活PDP场景 LTE_STA_QIACT_ACK, //激活PDP场景应答 LTE_STA_QIDEACT, //反激活PDP场景 LTE_STA_QIDEACT_ACK, //反激活PDP场景应答 LTE_STA_CHECK_QIACT, //查询PDP场景状态 LTE_STA_CHECK_QIACT_ACK, //查询PDP场景状态应答 LTE_STA_OPEN_SOCKET, //打开Socket服务 LTE_STA_OPEN_SOCKET_ACK, //打开Socket服务应答 // LTE_STA_CLOSE_SOCKET, //关闭Socket服务 // LTE_STA_CLOSE_SOCKET_ACK, //关闭Socket服务应答 LTE_STA_CREATE_OK, //Socket创建连接完成 LTE_STA_CREATE_FAILURE, //Socket创建连接失败 LTE_STA_CREATE_IDLE, //Socket创建连接过程空闲状态 }_LTE_TCP_CreateStatus; /* *********************************************************************** * 函 数 名: TCP_ClientCreate * 功能说明: 建立TCP客户端 * 形 参:无 * 返 回 值: 无 *********************************************************************** */ void TCP_ClientCreate(void) { static _LTE_TCP_CreateStatus currentStatus = LTE_STA_TCP_CREATE_INIT; static _LTE_TCP_CreateStatus nextStatus = LTE_STA_TCP_CREATE_INIT; static timer responseTimeout; static timer responseTimeout_3s; static timer registrationTime; static timer connectionWaitTime; static timer waitingTime_2s; static timer reconnectTimeout; static uint8_t timer_ok = 0; if(timer_ok == 0) { timer_ok = 1; timer_set(&responseTimeout, CLOCK_SECOND*3); //创建1个定时器,用于发送AT命令后等待应答的时间 timer_set(&responseTimeout_3s, CLOCK_SECOND*3); //创建1个定时器,用于发送AT命令后等待应答的时间 timer_set(&connectionWaitTime, CLOCK_SECOND*10); //创建1个定时器,用于建立连接等待的超时时间 timer_set(®istrationTime, CLOCK_SECOND*10); //创建1个定时器,用于检查网络注册情况的等待超时时间 timer_set(&waitingTime_2s, CLOCK_SECOND*2); timer_set(&reconnectTimeout, CLOCK_SECOND*20); } currentStatus = nextStatus; switch(currentStatus) { case LTE_STA_TCP_CREATE_INIT: //开始建立TCP连接 if(lteLoadCompletedFlag == 1) { printf("\r\n准备创建TCP/IP Socket!\r\n"); nextStatus = LTE_STA_SET_PDP_CONTEXT; break; } break; case LTE_STA_SET_PDP_CONTEXT: printf("\r\n开始任务,设置APN\r\n"); if(gsm_msg.OperatorType == 1) { GSM_SendAtCmd("AT+QICSGP=1,1,\"CMNET\","","",1", AT_CMD_QICSGP_NO); //设置APN,中国移动 }else if(gsm_msg.OperatorType == 2){ GSM_SendAtCmd("AT+QICSGP=1,1,\"UNINET\","","",1", AT_CMD_QICSGP_NO); //设置APN,中国联通 }else{ GSM_SendAtCmd("AT+QICSGP=1,1,\"CMNET\","","",1", AT_CMD_QICSGP_NO); //设置APN,中国移动 } timer_restart(&responseTimeout); //从当前时间重新开启2秒定时器 timer_restart(&reconnectTimeout); //开始建立链接先初始化定时器,如果超时了,则需要重新开机 nextStatus = LTE_STA_SET_PDP_CONTEXT_ACK; break; case LTE_STA_SET_PDP_CONTEXT_ACK: //等待应答 if(at_cmd_table[AT_CMD_QICSGP_NO-1].result == AT_CMD_SUCCESS) { printf("\r\n设置APN OK\r\n"); nextStatus = LTE_STA_QIDEACT; break; } if(at_cmd_table[AT_CMD_QICSGP_NO-1].result == AT_CMD_FAILED) { printf("\r\n设置APN ERROR\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n等待应答超时,设置APN错误\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } break; case LTE_STA_QIDEACT: printf("\r\n反激活\r\n"); GSM_SendAtCmd("AT+QIDEACT=1", AT_CMD_QIDEACT_NO); //设置PDP上下文,互联网接协议,接入点等信息 timer_restart(&responseTimeout); nextStatus = LTE_STA_QIDEACT_ACK; break; case LTE_STA_QIDEACT_ACK: if(at_cmd_table[AT_CMD_QIDEACT_NO-1].result == AT_CMD_SUCCESS) { printf("\r\n反激活OK\r\n"); nextStatus = LTE_STA_QIACT; break; } if(at_cmd_table[AT_CMD_QIACT_NO-1].result == AT_CMD_FAILED) { printf("\r\n建立无线链路 ERROR\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n应答OK超时,建立无线链路失败\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } break; case LTE_STA_QIACT: //激活PDP场景 printf("\r\n建立无线链路\r\n"); GSM_SendAtCmd("AT+QIACT=1", AT_CMD_QIACT_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_QIACT_ACK; break; case LTE_STA_QIACT_ACK: //等待应答 if(at_cmd_table[AT_CMD_QIACT_NO-1].result == AT_CMD_SUCCESS) { printf("\r\n建立无线链路OK\r\n"); nextStatus = LTE_STA_CHECK_QIACT; break; } if(at_cmd_table[AT_CMD_QIACT_NO-1].result == AT_CMD_FAILED) { printf("\r\n建立无线链路 ERROR\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n应答OK超时,建立无线链路失败\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } break; case LTE_STA_CHECK_QIACT: printf("\r\n获得本地IP\r\n"); GSM_SendAtCmd("AT+QIACT?", AT_CMD_CHECK_QIACT_NO); nextStatus = LTE_STA_CHECK_QIACT_ACK; timer_restart(&responseTimeout); break; case LTE_STA_CHECK_QIACT_ACK: if(at_cmd_table[AT_CMD_CHECK_QIACT_NO-1].result == AT_CMD_SUCCESS) { printf("\r\n已获得IP地址\r\n"); nextStatus = LTE_STA_OPEN_SOCKET; break; } if(at_cmd_table[AT_CMD_CHECK_QIACT_NO-1].result == AT_CMD_FAILED) { printf("\r\n获得本地IP失败 ERROR\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n应答OK超时,获得本地IP失败\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } break; case LTE_STA_OPEN_SOCKET: //开始链接远端服务器 printf("\r\n开始链接远端服务器\r\n"); GSM_SendAtCmd(TCP_IP_COM, AT_CMD_QIOPEN); nextStatus = LTE_STA_OPEN_SOCKET_ACK; timer_restart(&connectionWaitTime); break; case LTE_STA_OPEN_SOCKET_ACK: //等待应答“CONNECT OK” if(at_cmd_table[AT_CMD_QIOPEN-1].result == AT_CMD_SUCCESS) { printf("\r\n连接成功\r\n"); nextStatus = LTE_STA_CREATE_OK; break; } if(at_cmd_table[AT_CMD_QIOPEN-1].result == AT_CMD_FAILED) { printf("\r\n连接失败\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } if(timer_expired(&connectionWaitTime)) //超时还未接收到应答 { printf("\r\n连接超时!!!\r\n"); nextStatus = LTE_STA_CREATE_FAILURE; break; } break; case LTE_STA_CREATE_OK: //创建Socket完成 ConnectionStatus = ONLINE; lteCreateSocketOkFlag = 1; networkConnectionCount++; //网络建立成功后网络连接次数+1 if(networkConnectionCount >= 0xFFFF) { networkConnectionCount = 2; } printf("\r\nnetworkConnectionCount = %d\r\n", networkConnectionCount); //清除发送失败计数和重连接错误计数(为了防止在程序运行过程中出现错误处理而重新启动模块复位变量) sendFailureCount = 0; errorProcessCount = 0; gsm_msg.Running = 1; //标志模块已经连接上GPRS nextStatus = LTE_STA_CREATE_IDLE; break; case LTE_STA_CREATE_FAILURE: //创建Socket失败 printf("\r\n创建Socket失败!\r\n"); errorProcessCount++; printf("\r\n创建Socket失败次数 = %d\r\n", errorProcessCount); nextStatus = LTE_STA_TCP_CREATE_INIT; break; case LTE_STA_CREATE_IDLE: //创建Socket完成后进入空闲状态 if(lteCreateSocketResetFlag == 1) { lteCreateSocketResetFlag = 0; printf("\r\n创建Socket过程复位!\r\n"); ConnectionStatus = OFFLINE; lteCreateSocketOkFlag = 0; gsm_msg.Running = 0; //清除发送失败计数和重连接错误计数 sendFailureCount = 0; errorProcessCount = 0; nextStatus = LTE_STA_TCP_CREATE_INIT; break; } break; default: //其它状态 printf("\r\n未知状态,重启模块!!!\r\n"); LTE_StatusReset(); //GSM模块复位,重启 break; } if(lteCreateSocketResetFlag == 1) { lteCreateSocketResetFlag = 0; printf("\r\n创建Socket过程复位!\r\n"); ConnectionStatus = OFFLINE; lteCreateSocketOkFlag = 0; gsm_msg.Running = 0; //清除发送失败计数和重连接错误计数 sendFailureCount = 0; errorProcessCount = 0; nextStatus = LTE_STA_TCP_CREATE_INIT; } } typedef enum { LTE_STA_Handler_INIT = 0, //初始状态 LTE_STA_SEND_DATA, //TCP发送数据 LTE_STA_LOAD_DATA_READY, //等待模块应答">",准备加载数据 LTE_STA_LOAD_DATA, //加载要发送的数据 LTE_STA_SEND_DATA_ACK, //TCP发送数据应答 LTE_STA_WAITING_SEND_TIME, //等待发送时间 LTE_STA_CHECK_SEND_DATA, //检测TCP发送数据是否已经到达服务器 LTE_STA_CHECK_SEND_DATA_ACK, //检测TCP发送数据是否已经到达服务器应答 LTE_STA_REPEAT_CHECK_SEND_DATA, //重新检测TCP发送数据是否已经到达服务器 LTE_STA_CLOSE_SOCKET, //关闭Socket服务 LTE_STA_CLOSE_SOCKET_ACK, //关闭Socket服务应答 LTE_STA_WQITING_RECEIVE_DATA, //等待服务器回复数据 LTE_STA_READ_DATA, //TCP读取接收到的数据 LTE_STA_READ_DATA_ACK, //TCP读取接收到的数据应答 LTE_STA_SEND_DATA_OK, //发送成功 LTE_STA_HANDLER_FAILURE, //发送失败 LTE_STA_HANDLER_RESTART, //数据发送任务复位 LTE_STA_GET_SIGNAL, //获取信号 LTE_STA_GET_SIGNAL_ACK, //获取信号应答 LTE_STA_GET_DATE_TIME, //获取日期时间 LTE_STA_GET_DATE_TIME_ACK, //获取日期时间应答 }_LTE_TCP_HandlerStatus; /* *********************************************************************** * 函 数 名: TCP_ClientHandler * 功能说明: TCP客户端的数据收发处理 * 形 参:无 * 返 回 值: 无 *********************************************************************** */ void TCP_ClientHandler(void) { static _LTE_TCP_HandlerStatus currentStatus = LTE_STA_Handler_INIT; static _LTE_TCP_HandlerStatus nextStatus = LTE_STA_Handler_INIT; char atCmdBuf[32]; //AT指令缓存 static uint8_t waitTimeOutCount = 0; static timer getSignalTime; //获取信号间隔时间 static timer getDateTime; //获取日期时间间隔时间 static timer responseTimeout; //应答超时时间间隔 static timer sendTimeout; //发送超时时间间隔 static timer checkSendAckTimer; static timer receiveTimer; static timer waitingTimer; static uint8_t timer_ok = 0; if(timer_ok == 0) { timer_ok = 1; timer_set(&getSignalTime, CLOCK_SECOND*60); timer_set(&getDateTime, CLOCK_SECOND*60); timer_set(&responseTimeout, CLOCK_SECOND*3); timer_set(&sendTimeout, CLOCK_SECOND*10); timer_set(&receiveTimer, CLOCK_SECOND*20); timer_set(&checkSendAckTimer, CLOCK_SECOND*5); timer_set(&waitingTimer, CLOCK_SECOND*1); } currentStatus = nextStatus; switch(currentStatus) { case LTE_STA_Handler_INIT: //当前处于连接正常,检查是否有数据要发送,有就对数据进行发送 if((isSendDataMark == 1) && (ConnectionStatus == ONLINE)) { isSendDataMark = 0; isReceiveDataMark = 0; nextStatus = LTE_STA_SEND_DATA; break; } if(ConnectionStatus == ONLINE) { //获取日期时间 if(timer_expired(&getDateTime)) { // printf("\r\n获取日期时间!\r\n"); timer_restart(&getDateTime); nextStatus = LTE_STA_GET_DATE_TIME; break; } //获取信号强度 if(timer_expired(&getSignalTime)) { timer_restart(&getSignalTime); nextStatus = LTE_STA_GET_SIGNAL; break; } } break; case LTE_STA_SEND_DATA: //发送数据 sprintf(atCmdBuf, "AT+QISEND=0,%d", sendDataLen); // printf("\r\n%s\r\n", atCmdBuf); GSM_SendAtCmd(atCmdBuf, AT_CMD_QISEND); timer_restart(&responseTimeout); nextStatus = LTE_STA_LOAD_DATA_READY; break; case LTE_STA_LOAD_DATA_READY: //等待返回应答“>” if(at_cmd_table[AT_CMD_QISEND-1].result == AT_CMD_CIPSEND_READY) { printf("\r\n应答 > OK\r\n"); nextStatus = LTE_STA_LOAD_DATA; //接收到应答 break; } if(at_cmd_table[AT_CMD_QISEND-1].result == AT_CMD_SEND_FAIL) { printf("\r\n应答> ERROR\r\n"); seriousError = 1; // errorProcessCount ++; //发送失败+1 printf("\r\n发送ERROR次数 = %d\r\n", errorProcessCount); nextStatus = LTE_STA_HANDLER_FAILURE; break; } if(at_cmd_table[AT_CMD_QISEND-1].result == TCP_STATUS_CLOSED) { printf("\r\n连接已经关闭,发送失败\r\n"); seriousError = 1; // errorProcessCount ++; //发送失败+1 printf("\r\n发送ERROR次数 = %d\r\n", errorProcessCount); nextStatus = LTE_STA_HANDLER_FAILURE; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n超时未应答>取消发送\r\n"); errorProcessCount ++; //发送失败+1 printf("\r\n发送ERROR次数 = %d\r\n", errorProcessCount); nextStatus = LTE_STA_HANDLER_FAILURE; break; } break; case LTE_STA_LOAD_DATA: //通过串口向模块发送要发送的数据 receiveDataMark = 0; memcpy(GPRS_TX_BUF, GPRS_DATA_BUF, sendDataLen); GSM_GPRS_SendOne(GPRS_TX_BUF, sendDataLen); printf("\r\n正在发送数据......\r\n"); // printf("\r\nStartTime = %d\r\n", time_value); timer_restart(&sendTimeout); nextStatus = LTE_STA_SEND_DATA_ACK; break; case LTE_STA_SEND_DATA_ACK: //等待返回应答“SEND OK” if(at_cmd_table[AT_CMD_QISEND-1].result == AT_CMD_CIPSEND_OK) { // printf("\r\nEndTime = %d\r\n", time_value); printf("\r\n发送加载成功!\r\n"); timer_restart(&waitingTimer); nextStatus = LTE_STA_WAITING_SEND_TIME; break; } if(at_cmd_table[AT_CMD_QISEND-1].result == AT_CMD_SEND_FAIL) { printf("\r\nEndTime = %d\r\n", time_value); printf("\r\n发送加载失败\r\n"); sendFailureCount ++; //发送失败+1 printf("\r\n发送失败次数 = %d\r\n", sendFailureCount); nextStatus = LTE_STA_HANDLER_FAILURE; break; } if(timer_expired(&sendTimeout)) //超时还未接收到应答 { printf("\r\nEndTime = %d\r\n", time_value); printf("\r\n超时数据尚未发出,发送失败\r\n"); sendFailureCount ++; //发送失败+1 printf("\r\n发送失败次数 = %d\r\n", sendFailureCount); nextStatus = LTE_STA_HANDLER_FAILURE; break; } break; case LTE_STA_WAITING_SEND_TIME: //等待一小段时间再查询数据是否已经成功发送给对方 //如果收到后台的应答数据,则转到读取内容 if(receiveDataMark == 1) { receiveDataMark = 0; printf("\r\n收到server数据!\r\n"); nextStatus = LTE_STA_SEND_DATA_OK; break; } if(timer_expired(&waitingTimer)) //超时还未接收到应答 { waitTimeOutCount = 0; nextStatus = LTE_STA_CHECK_SEND_DATA; break; } break; case LTE_STA_CHECK_SEND_DATA: //查询数据是否已发送到对方 printf("\r\n查询数据是否已发送成功?\r\n"); if(waitTimeOutCount > 6) { printf("\r\n超出发送时间数据尚未能发出!\r\n"); sendFailureCount ++; //发送失败+1 printf("\r\n发送失败次数 = %d\r\n", sendFailureCount); nextStatus = LTE_STA_HANDLER_FAILURE; break; } total_send_length = 0; ackedBytes = 0; GSM_SendAtCmd("AT+QISEND=0,0", AT_CMD_CHECK_QISEND_NO); timer_restart(&checkSendAckTimer); nextStatus = LTE_STA_CHECK_SEND_DATA_ACK; break; case LTE_STA_CHECK_SEND_DATA_ACK: if(at_cmd_table[AT_CMD_CHECK_QISEND_NO-1].result == AT_CMD_SUCCESS) { at_cmd_table[AT_CMD_CHECK_QISEND_NO-1].result = AT_CMD_UNKNOWN; printf("\r\nBytes: tx = %d, ack = %d\r\n", total_send_length, ackedBytes); if(total_send_length == ackedBytes) { printf("\r\n数据已成功发送到对方!\r\n"); timer_restart(&receiveTimer); nextStatus = LTE_STA_WQITING_RECEIVE_DATA; break; } } //如果收到后台的应答数据,则转到读取内容 if(receiveDataMark == 1) { receiveDataMark = 0; printf("\r\n收到server数据!\r\n"); nextStatus = LTE_STA_SEND_DATA_OK; break; } if(timer_expired(&checkSendAckTimer)) //超时还未接收到应答 { printf("\r\n查询数据发送超时!\r\n"); waitTimeOutCount++; nextStatus = LTE_STA_CHECK_SEND_DATA; //返回到连接成功状态 break; } break; case LTE_STA_WQITING_RECEIVE_DATA: //等待服务器回复数据 if(receiveDataMark == 1) { receiveDataMark = 0; printf("\r\n收到server数据!\r\n"); nextStatus = LTE_STA_SEND_DATA_OK; break; } if(timer_expired(&receiveTimer)) { dataSendOkButNoAckMark = 1; printf("\r\n数据已经发送,但没有收到回复!\r\n"); sendFailureCount ++; //发送失败+1 printf("\r\n发送失败次数 = %d\r\n", sendFailureCount); nextStatus = LTE_STA_Handler_INIT; break; } break; case LTE_STA_SEND_DATA_OK: //数据发送成功 isReceiveDataMark = 1; //标志接收到数据 errorProcessCount = 0; sendFailureCount = 0; nextStatus = LTE_STA_Handler_INIT; break; case LTE_STA_GET_SIGNAL: //查询网络信号强度 GSM_SendAtCmd("AT+CSQ", AT_CMD_CSQ_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_GET_SIGNAL_ACK; break; case LTE_STA_GET_SIGNAL_ACK: //等待网络信号应答正常 if(at_cmd_table[AT_CMD_CSQ_NO-1].result == AT_CMD_SUCCESS) { if((signal > 0) && (signal != 99)) { printf("\r\n信号强度 = %d\r\n", signal); nextStatus = LTE_STA_Handler_INIT; break; } } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { nextStatus = LTE_STA_Handler_INIT; break; } break; case LTE_STA_GET_DATE_TIME: //获取日期时间 GSM_SendAtCmd("AT+CCLK?", AT_CMD_CCLK_NO); timer_restart(&responseTimeout); nextStatus = LTE_STA_GET_DATE_TIME_ACK; break; case LTE_STA_GET_DATE_TIME_ACK: //获取日期时间应答 if(at_cmd_table[AT_CMD_CCLK_NO-1].result == AT_CMD_SUCCESS) { getDateTimeMark = 1; GMT_To_Beijing(&GMT_Time); printf("\r\nTime:%s\r\n", systemTime); nextStatus = LTE_STA_Handler_INIT; break; } if(at_cmd_table[AT_CMD_CCLK_NO-1].result == AT_CMD_FAILED) { printf("\r\nGet Time ERROR\r\n"); nextStatus = LTE_STA_Handler_INIT; break; } if(timer_expired(&responseTimeout)) //超时还未接收到应答 { printf("\r\n应答超时,Get Time失败\r\n"); nextStatus = LTE_STA_Handler_INIT; break; } break; case LTE_STA_HANDLER_FAILURE: //数据发送失败 printf("\r\n数据发送失败返回!\r\n"); dataSendFailureMark = 1; //标志数据发送失败 nextStatus = LTE_STA_Handler_INIT; break; default: //未知状态 printf("\r\nException_未知状态,重启模块!!!\r\n"); nextStatus = LTE_STA_Handler_INIT; break; } if(lteHandlerResetFlag == 1) { lteHandlerResetFlag = 0; printf("\r\n数据收发过程复位!\r\n"); dataSendFailureMark = 1; //标志数据发送失败 nextStatus = LTE_STA_Handler_INIT; } } /* *********************************************************************** * 函 数 名: LTE_WorkingStatusReset * 功能说明: LTE通信模块工作状态复位 * 形 参:无 * 返 回 值: 无 *********************************************************************** */ static void LTE_WorkingStatusReset(void) { //模块工作过程复位 lteLoadResetFlag = 1; //标志模块加载过程要重新复位 lteCreateSocketResetFlag = 1; //标志Socket创建过程要重新复位 lteLoadCompletedFlag = 0; //模块加载完成标志清零 lteCreateSocketOkFlag = 0; //模块创建Socket完成标志清零 lteHandlerResetFlag = 1; //标志数据收发过程复位 //模块运行状态标志复位 ConnectionStatus = OFFLINE; gsm_msg.Running = 0; //过程变量清零 seriousError = 0; sendFailureCount = 0; errorProcessCount = 0; connectionClosedMark = 0; } typedef enum { LTE_ER_STA_INIT = 0, //LTE模块异常处理初始状态 LTE_ER_STA_HANDLER, //LTE模块异常处理状态 LTE_ER_STA_IDLE, //LTE模块异常处理空闲状态 }_LTE_ErrorStatus; /* *********************************************************************** * 函 数 名: LTE_ErrorHandler * 功能说明: LTE通信模块异常处理任务 * 形 参:无 * 返 回 值: 无 *********************************************************************** */ void LTE_ErrorHandler(void) { static _LTE_ErrorStatus currentStatus = LTE_ER_STA_INIT; static _LTE_ErrorStatus nextStatus = LTE_ER_STA_INIT; static timer responseTimeout; //应答超时时间间隔 static timer sendTimeout; //发送超时时间间隔 static timer waitingTimer; static uint8_t timer_ok = 0; if(timer_ok == 0) { timer_ok = 1; timer_set(&responseTimeout, CLOCK_SECOND*3); timer_set(&sendTimeout, CLOCK_SECOND*10); timer_set(&waitingTimer, CLOCK_SECOND*1); } if(seriousError == 1) { seriousError = 0; printf("\r\n出现严重错误-->重启!\r\n"); LTE_WorkingStatusReset(); } if(sendFailureCount >= 3) //发送失败超出3次,则重启通讯模块 { sendFailureCount = 0; printf("\r\n发送失败次数超出预设值-->重启!\r\n"); LTE_WorkingStatusReset(); } if(errorProcessCount >= 3) //发送失败超出3次,则重启通讯模块 { errorProcessCount = 0; printf("\r\n运行过程ERROR次数超出预设值-->重启!\r\n"); LTE_WorkingStatusReset(); } if(connectionClosedMark == 1) //连接已断开 { connectionClosedMark = 0; printf("\r\n连接已断开!\r\n"); LTE_WorkingStatusReset(); } } /* *********************************************************************** * 函 数 名: GSM_GPRS_Task * 功能说明: GSM_GPRS通讯任务 * 形 参:无 * 返 回 值: 无 *********************************************************************** */ void GSM_GPRS_Task(void) { EC200X_Loading(); TCP_ClientCreate(); TCP_ClientHandler(); LTE_ErrorHandler(); } /******************** (C) COPYRIGHT 2017 CXHY *****END OF FILE*******************/