uint8_t SendSMS(const uint8_t *recipient, const uint8_t *data) { uint8_t buf[32]; uint8_t i; DelayMs(100); MODEM_FlushBuffer(); MODEM_Info("\r\nGSM->SMS SEND TO %s...\r\n", recipient); MODEM_Info("\r\nGSM->DATA:"); sprintf((char *)buf, "AT+CMGS=\"%s\"\r", recipient); COMM_Puts(buf); if(MODEM_CheckResponse("> ", 20000)) { MODEM_Info("\r\nGSM->SMS SEND FAILS\r\n"); return 0xff; } for(i = 0;i < 160;i++) { if(data[i] == '\0') break; //DbgCfgPutChar(data[i]); COMM_Putc(data[i]); } COMM_Putc(0x1A); if(MODEM_CheckResponse("OK", 10000)){ MODEM_Info("\r\nGSM->SMS SEND FAILS\r\n"); return 0xff; } MODEM_Info("\r\n"); MODEM_Info("\r\nOK\r\n"); return 0; }
/** * * @param fileHandle * @param buf * @param len * @return * TODO Expand this function */ int _write(int fileHandle, char *buf, int len) { int i; for (i=0; i<len; i++) { COMM_Putc((uint8_t)buf[i]); } return len; }
/** * * @param fileHandle * @param buf * @param len * @return */ int _write(int fileHandle, char *buf, int len) { // send all data to COMM module for (int i = 0; i < len; i++) { COMM_Putc(buf[i]); } return len; }
uint8_t MODEM_GprsSendData(uint8_t socket,uint8_t *data,uint32_t length) { COMPARE_TYPE cmp1; Timeout_Type tOut; uint8_t buf[32],c; uint32_t i; uint32_t tryNum = 5; MODEM_FlushBuffer(); sprintf((char *)buf, "AT+USOWR=%d,%d\r",socketMask[socket],length); for(;;) { DelayMs(100); COMM_Puts(buf); InitTimeout(&tOut,TIME_MS(5000)); InitFindData(&cmp1,"@"); while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { break; } } } if(CheckTimeout(&tOut) == TIMEOUT) { tryNum --; if(tryNum == 0) { tcpSocketStatus[socket] = SOCKET_CLOSE; return 0xff; } continue; } i = length; for(i = 0; i < length ;i++) { COMM_Putc(data[i]); } InitTimeout(&tOut,TIME_MS(5000)); InitFindData(&cmp1,"OK"); while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { MODEM_Info("\r\nGSM->%s OK\r\n",buf); DelayMs(100); return 0; } } } MODEM_Info("\r\nGSM->%s FAILS\r\n",buf); tryNum --; if(tryNum == 0) { tcpSocketStatus[socket] = SOCKET_CLOSE; return 0xff; } } }
void Gprs_Task(void) { uint16_t i,j; GPRS_PHASE_TYPE gprs_TaskPhaseOld = gprs_TaskPhase; if(GsmTask_GetPhase() == MODEM_TURN_ON) { gprs_TaskPhase = GPRS_TASK_IDLE; return; } if(GsmTask_GetPhase() != MODEM_SYS_COVERAGE_OK) { memset(gprsSocketStatus,0x00,sizeof(gprsSocketStatus)); memset(gprsSocketMask,0x00,sizeof(gprsSocketMask)); return; } if(modemIsBusy == 1 && modemIsBusySource != AT_U_BLOX_GPRS_TASK) return; switch(gprs_TaskPhase) { case GPRS_TASK_LOCATION_SEND_CMD: if(ModemCmdTask_SendCmd(NULL,NULL,500, modemOk, modemError, 5000, 0, "AT+ULOC=2,2,0,100,5000\r") == MODEM_RES_OK) { gprs_TaskPhase = TASK_GPRS_GET_CELL_LOCATION; } break; case TASK_GPRS_GET_CELL_LOCATION: if (ModemCmdTask_IsIdle()) { gprs_TaskPhase = GPRS_TASK_IDLE; } break; case GPRS_TASK_CLOSE_BEFORE_CREATE_SOCKET: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} gprsSocketStatus[tcpIpConn->socketId] = SOCKET_CLOSE; GPRS_CheckSocketFree(tcpIpConn->socketId); createSocketNow = tcpIpConn->socketId; if(ModemCmdTask_SendCmd(NULL,NULL,100, modemOk, modemError, 3000, 2, "AT+USOCL=%d\r", gprsSocketMask[tcpIpConn->socketId]) == MODEM_RES_OK) { tcpIpConn->socketStatus = SOCKET_DISCONNECTED; gprs_TaskPhase = GPRS_TASK_CREATE_SOCKET; } else if( ModemCmdTask_GetPhase() == MODEM_CMD_ERROR) { gprs_TaskPhase = GPRS_TASK_CREATE_SOCKET; } break; case GPRS_TASK_CREATE_SOCKET: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} if(gprsEnableFlag == 0) { gprs_TaskPhase = GPRS_TASK_IDLE; break; } if(gprsSocketStatus[tcpIpConn->socketId] == SOCKET_OPEN) { COMM_Putc(0x1B); gprs_TaskPhase = GPRS_TASK_CLOSE_BEFORE_CREATE_SOCKET; break; } if(ModemCmdTask_IsIdle()) { COMM_Putc(0x1B); createSocketNow = tcpIpConn->socketId; ModemCmdTask_SendCmd(GPRS_TCPCreateSocket,"+USOCR: ",100, modemOk, modemError, 5000, 1, "AT+USOCR=6\r"); gprs_TaskPhase = GPRS_TASK_CREATE_SOCKET_1; } break; case GPRS_TASK_CREATE_SOCKET_1: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} tcpIpConn->socketStatus = SOCKET_DISCONNECTED; if(ModemCmdTask_GetPhase() == MODEM_CMD_OK) { if(Domain_IpCheck(tcpIpConn->ip) == IS_IP) { ModemCmdTask_SendCmd(NULL,NULL,100, modemOk, modemError, 15000, 0, "AT+USOCO=%d,\"%s\",%d\r",gprsSocketMask[tcpIpConn->socketId],tcpIpConn->ip,tcpIpConn->port); gprs_TaskPhase = GPRS_TASK_CREATE_SOCKET_3; } else { DNS_serverIp[0] = 0; ModemCmdTask_SendCmd(GPRS_GetIpFromDNS,"+UDNSRN: \"",100, modemOk, modemError, 60000, 0, "AT+UDNSRN=0,\"%s\"\r", tcpIpConn->ip); gprs_TaskPhase = GPRS_TASK_CREATE_SOCKET_2; } } else if( ModemCmdTask_GetPhase() == MODEM_CMD_ERROR) { if(tcpIpConn->tryNum++ >= 3) { GsmTask_Init(); gprs_TaskPhase = GPRS_TASK_IDLE; tcpIpConn->error = CONN_OPEN_SOCKET_FAIL; tcpIpConn->cmd = CONN_CMD_EMPTY; break; } COMM_Putc(0x1B); gprs_TaskPhase = GPRS_TASK_CLOSE_BEFORE_CREATE_SOCKET; } break; case GPRS_TASK_CREATE_SOCKET_2: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} if(ModemCmdTask_GetPhase() == MODEM_CMD_OK) { ModemCmdTask_SendCmd(NULL,NULL,100, modemOk, modemError, 15000, 0,"AT+USOCO=%d,\"%s\",%d\r",gprsSocketMask[tcpIpConn->socketId],DNS_serverIp,tcpIpConn->port); gprs_TaskPhase = GPRS_TASK_CREATE_SOCKET_3; } else if( ModemCmdTask_GetPhase() == MODEM_CMD_ERROR) { gprsDisable = 1; tcpIpConn = list_item_next(tcpIpConn); gprs_TaskPhase = GPRS_TASK_IDLE; } break; case GPRS_TASK_CREATE_SOCKET_3: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} if(ModemCmdTask_GetPhase() == MODEM_CMD_OK) { tcpIpConn->tryNum = 1; gprsSocketStatus[tcpIpConn->socketId] = SOCKET_OPEN; tcpIpConn->socketStatus = SOCKET_CONNECTED; tcpIpConn->cmd = CONN_CMD_EMPTY; gprs_TaskPhase = GPRS_TASK_IDLE; tcpIpConn = list_item_next(tcpIpConn); } else if( ModemCmdTask_GetPhase() == MODEM_CMD_ERROR) { if(tcpIpConn->tryNum != 0) { tcpIpConn->tryNum--; tcpIpConn = list_item_next(tcpIpConn); gprs_TaskPhase = GPRS_TASK_IDLE; break; } else { tcpIpConn->error = CONN_CREATE_TCP_CONNECTION_FAIL; tcpIpConn->cmd = CONN_CMD_EMPTY; tcpIpConn = list_item_next(tcpIpConn); gprs_TaskPhase = GPRS_TASK_IDLE; break; } COMM_Putc(0x1B); gprs_TaskPhase = GPRS_TASK_CLOSE_BEFORE_CREATE_SOCKET; } break; case GPRS_TASK_READ_DATA: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} if(ModemCmdTask_SendCmd(NULL,NULL,100, modemOk, modemError, 1000, 0, "AT+USORD=%d,%d\r",gprsSocketMask[tcpIpConn->socketId],TCP_IP_BUF_SIZE-32) == MODEM_RES_OK) { tcpIpConn->cmd = CONN_CMD_EMPTY; gprs_TaskPhase = GPRS_TASK_GET_DATA; } break; case GPRS_TASK_GET_DATA: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} if(ModemCmdTask_GetPhase() == MODEM_CMD_OK) { gprs_TaskPhase = GPRS_TASK_IDLE; } else if( ModemCmdTask_GetPhase() == MODEM_CMD_ERROR) { if(tcpIpConn->tryNum != 0) { tcpIpConn->tryNum--; tcpIpConn = list_item_next(tcpIpConn); gprs_TaskPhase = GPRS_TASK_IDLE; } else { tcpIpConn->error = CONN_CREATE_TCP_CONNECTION_FAIL; tcpIpConn->socketStatus = SOCKET_DISCONNECTED; tcpIpConn->cmd = CONN_CMD_EMPTY; tcpIpConn = list_item_next(tcpIpConn); gprs_TaskPhase = GPRS_TASK_IDLE; break; } } break; case GPRS_TASK_SEND_DATA: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} if(ModemCmdTask_SendCmd(NULL,NULL,500, "@", modemError, 5000, 0, "AT+USOWR=%d,%d\r", gprsSocketMask[tcpIpConn->socketId], tcpIpConn->dataOutLen) == MODEM_RES_OK) { gprs_TaskPhase = GPRS_TASK_SEND_OUT_DATA; } else if( ModemCmdTask_GetPhase() == MODEM_CMD_ERROR) { gprs_TaskPhase = GPRS_TASK_SEND_OUT_DATA; } break; case GPRS_TASK_SEND_OUT_DATA: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} if(ModemCmdTask_GetPhase() == MODEM_CMD_OK) { for(i = 0;i < tcpIpConn->dataOutLen;i ++) { COMM_Putc(tcpIpConn->dataOutPt[i]); } ModemCmdTask_SendCmd(NULL,NULL,100,modemOk, modemError, 2000, 0,NULL); gprs_TaskPhase = GPRS_TASK_CHECK_DATA_SENT; gprsCheckDataCnt = 0; } else if( ModemCmdTask_GetPhase() == MODEM_CMD_ERROR) { COMM_Putc(0x1A); tcpIpBuf.flag = TCPIP_NO_DATA; tcpIpConn->cmd = CONN_CMD_EMPTY; gprs_TaskPhase = GPRS_TASK_IDLE; } break; case GPRS_TASK_CHECK_DATA_SENT: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} if(ModemCmdTask_GetPhase() == MODEM_CMD_OK) { ModemCmdTask_SendCmd(GPRS_TcpSocketControl,"+USOCTL: ",100, modemOk, modemError, 1000, 0, "AT+USOCTL=%d,11\r",gprsSocketMask[tcpIpConn->socketId]); InitTimeout(&tGprsTaskPhaseTimeOut, SYSTICK_TIME_SEC(1)); gprs_TaskPhase = GPRS_TASK_CHECK_DATA_SENT1; } else if( ModemCmdTask_GetPhase() == MODEM_CMD_ERROR) { tcpIpBuf.flag = TCPIP_NO_DATA; tcpIpConn->cmd = CONN_CMD_EMPTY; gprs_TaskPhase = GPRS_TASK_IDLE; } break; case GPRS_TASK_CHECK_DATA_SENT1: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} if(ModemCmdTask_GetPhase() == MODEM_CMD_OK) { if(GPRS_dataUnackLength == 0) { tcpIpBuf.flag = TCPIP_NO_DATA; tcpIpConn->cmd = CONN_CMD_EMPTY; tcpIpConn->error = CONN_NO_ERROR; tcpIpConn->sentDataFlag = 1; gprs_TaskPhase = GPRS_TASK_IDLE; } else if(GPRS_dataUnackLength >= 2000) { gprsDisable = 1; tcpIpConn = list_item_next(tcpIpConn); gprs_TaskPhase = GPRS_TASK_IDLE; } else { if(CheckTimeout(&tGprsTaskPhaseTimeOut) == SYSTICK_TIMEOUT) { gprs_TaskPhase = GPRS_TASK_CHECK_DATA_SENT; if(gprsCheckDataCnt++ > 3) { tcpIpConn->error = CONN_SEND_DATA_FAIL; tcpIpBuf.flag = TCPIP_NO_DATA; tcpIpConn->cmd = CONN_CMD_EMPTY; gprsCheckDataCnt = 0; gprs_TaskPhase = GPRS_TASK_IDLE; } } } } else if( ModemCmdTask_GetPhase() == MODEM_CMD_ERROR) { tcpIpConn->error = CONN_SEND_DATA_FAIL; tcpIpBuf.flag = TCPIP_NO_DATA; tcpIpConn->cmd = CONN_CMD_EMPTY; gprs_TaskPhase = GPRS_TASK_IDLE; } break; case GPRS_TASK_CLOSE_CONNECTION: if(tcpIpConn == NULL){gprs_TaskPhase = GPRS_TASK_IDLE; break;} gprsSocketStatus[tcpIpConn->socketId] = SOCKET_CLOSE; GPRS_CheckSocketFree(tcpIpConn->socketId); createSocketNow = tcpIpConn->socketId; if(ModemCmdTask_SendCmd(NULL,NULL,100, modemOk, modemError, 3000, 0, "AT+USOCL=%d\r", gprsSocketMask[tcpIpConn->socketId]) == MODEM_RES_OK) { tcpIpConn->socketStatus = SOCKET_DISCONNECTED; gprs_TaskPhase = GPRS_TASK_WAIT_CONNECTION_CLOSE; } break; case GPRS_TASK_WAIT_CONNECTION_CLOSE: if(ModemCmdTask_IsIdle()) { tcpIpConn->cmd = CONN_CMD_EMPTY; gprs_TaskPhase = GPRS_TASK_IDLE; } break; case GPRS_TASK_IDLE: if(gprsEnableFlag == 0) { memset(gprsSocketStatus,0x00,sizeof(gprsSocketStatus)); memset(gprsSocketMask,0x00,sizeof(gprsSocketMask)); tcpIpBuf.flag = TCPIP_NO_DATA; } for(i = 0;i < GPRS_MAX_SOCKET_NUM;i++) { if(tcpIpBuf.dataUnReadLen[i] && tcpIpBuf.flag == TCPIP_NO_DATA) { tcpIpConn = list_head(gprsConnList); for(j = 0; j < GPRS_MAX_SOCKET_NUM;j++) { if(tcpIpConn != NULL) if(tcpIpConn->socketId == i ) { if(tcpIpConn->socketStatus == SOCKET_DISCONNECTED) { tcpIpBuf.dataUnReadLen[i] = 0; } else break; } tcpIpConn = list_item_next(tcpIpConn); } if(tcpIpConn != NULL) gprs_TaskPhase = GPRS_TASK_READ_DATA; break; } else if(tcpIpBuf.flag == TCPIP_NEW_DATA_RECV && i == tcpIpBuf.socket) { tcpIpConn = list_head(gprsConnList); for(j = 0; j < GPRS_MAX_SOCKET_NUM;j++) { if(tcpIpConn != NULL) if(tcpIpConn->socketId == i) { if(tcpIpConn->socketStatus == SOCKET_DISCONNECTED) { tcpIpBuf.flag = TCPIP_NO_DATA; } else break; } tcpIpConn = list_item_next(tcpIpConn); } if(tcpIpConn != NULL) { if(tcpIpConn->echo) { tcpIpBuf.flag = TCPIP_NO_DATA; tcpIpConn->newDataFlag = 0; tcpIpConn->dataOutPt = tcpIpBuf.data; tcpIpConn->dataOutLen = tcpIpBuf.len; gprs_TaskPhase = GPRS_TASK_SEND_DATA; tcpIpBuf.len = 0; break; } else tcpIpConn->newDataFlag = 1; } } } if(gprs_TaskPhase != GPRS_TASK_IDLE) break; if(tcpIpConn != NULL) { if(tcpIpConn->cmd == CONN_CMD_EMPTY) { tcpIpBuf.flag = TCPIP_NO_DATA; } if(gprs_TaskPhase == GPRS_TASK_IDLE) { if(tcpIpConn->socketStatus == SOCKET_CONNECTED) { if(gprsSocketStatus[tcpIpConn->socketId] == SOCKET_CLOSE) tcpIpConn->socketStatus = SOCKET_DISCONNECTED; } if(tcpIpConn->socketStatus == SOCKET_CONNECTED) { if(tcpIpBuf.flag == TCPIP_NO_DATA && CheckTimeout(&tcpIpConn->periodDataRecvCheck) == SYSTICK_TIMEOUT && tcpIpBuf.dataUnReadLen[tcpIpConn->socketId] == 0) { InitTimeout(&tcpIpConn->periodDataRecvCheck,tcpIpConn->periodDataRecvValue); gprs_TaskPhase = GPRS_TASK_READ_DATA; break; } } else { InitTimeout(&tcpIpConn->periodDataRecvCheck,tcpIpConn->periodDataRecvValue); } switch(tcpIpConn->cmd) { case CONN_CMD_START: if(tcpIpConn->tryNum) { tryOpenSocketNum = 0; gprsCheckDataCnt = 0; socketTryToConnectCnt = 0; tryToCreateSocketCnt = 0; gprs_TaskPhase = GPRS_TASK_CREATE_SOCKET; if(gprsEnableFlag == 0) { gprsEnableCmd = 1; } } else tcpIpConn->cmd = CONN_CMD_EMPTY; break; case CONN_CMD_STOP: break; case CONN_SEND_DATA: gprs_TaskPhase = GPRS_TASK_SEND_DATA; break; case CONN_READ_DATA: gprs_TaskPhase = GPRS_TASK_READ_DATA; break; case CONN_CMD_PAUSE: break; case CONN_CMD_EMPTY: break; case CONN_CMD_CLOSE: gprs_TaskPhase = GPRS_TASK_CLOSE_CONNECTION; break; default: break; } if(gprs_TaskPhase == GPRS_TASK_IDLE) { tcpIpConn = list_item_next(tcpIpConn); } } } else { tcpIpConn = list_head(gprsConnList); } break; default: // re-init modem gprs_TaskPhase = GPRS_TASK_IDLE; break; } if(gprs_TaskPhase != GPRS_TASK_IDLE) { modemIsBusy = 1; modemIsBusySource = AT_U_BLOX_GPRS_TASK; } else if(modemIsBusy && modemIsBusySource == AT_U_BLOX_GPRS_TASK) { modemIsBusy = 0; } if(gprs_TaskPhaseOld != GPRS_TASK_IDLE && gprs_TaskPhase == GPRS_TASK_IDLE) modemIsBusy = 0; if((atCmdCallParser.incomingCall || VoiceCallTask_GetPhase() != CALL_IDLE) && modemIsBusy) { modemIsBusy = 0; memset(gprsSocketStatus,NULL,sizeof(gprsSocketStatus)); memset(gprsSocketMask,NULL,sizeof(gprsSocketMask)); tcpIpBuf.flag = TCPIP_NO_DATA; tcpIpBuf.socket = 0; tcpIpBuf.len = 0; gprs_TaskPhase = GPRS_TASK_IDLE; } }