/* * Dial.cpp * * Created on: 2023年6月13日 * Author: chaos */ #include #include #include #include #include #include #include "../common/SH_CommonFunc.hpp" #include "Dial.h" Dial::Dial() { // TODO Auto-generated constructor stub m_fd = 0; m_curState = CPIN; m_dial = 0; m_APN = 0; } Dial::~Dial() { // TODO Auto-generated destructor stub } int Dial::openPort(const char* pPort) { m_fd = config_uart(pPort,115200); print_info("m_fd = %d\n",m_fd); return m_fd; } int Dial::parseData(Event event,const char* pData) { print_info("m_curState = %d,event = %d\n",m_curState,event); string signal; string ret; std::string str; int pos = 0; switch(event){ case Event_CPIN: if(!strncmp(pData,"READY",5)){ m_curState = QCFGNET; }else if(!strncmp(pData,"NOT READY",9)){ m_curState = CPIN; GlobalConfig::NetStatus = "\"LIMSRV\""; } break; case Event_QCFGNET: case Event_QCFGSMS: /*ret = GetOneContent(pData,1,","); if(ret == "0") { m_curState = QICSGPAPN; }*/ break; case Event_QICSGPAPN: //if(!strcmp(pData,"OK")) { m_curState = QNETDEVCTL; } break; case Event_QENG: GlobalConfig::NetStatus = GetOneContent(pData,1,","); GlobalConfig::NetType = GetOneContent(pData,2,","); signal = GetOneContent(pData,12,","); GlobalConfig::NetSignal = atoi(signal.c_str()); print_info("NetStatus = %s,NetSignal = %d\n",GlobalConfig::NetStatus.c_str(),GlobalConfig::NetSignal); break; case Event_QNETDEVCTL: print_info("m_curState Event_QNETDEVCTL = %d\n",m_curState); if(m_dial == 1){ m_curState = QNETDEVSTATUS; } break; case Event_QNETDEVSTATUS: ret = GetOneContent(pData,3,","); if(ret == "0" || ret == "") m_curState = QDCHPC; else m_curState = QNETDEVSTATUS; break; case Event_OK: if(m_curState == QNETDEVCTL && m_dial == 1) { m_dial = 0; m_curState = QNETDEVSTATUS; } if(m_curState == Event_QCFGNET){ m_curState = QNETDEVCTL; } if(m_curState == QICSGPAPN && m_APN == 1) { m_APN = 0; m_curState = QNETDEVCTL; } break; case Event_ERROR: if(m_curState == CPIN && !strcmp(pData,"3")){ m_curState = CPIN; GlobalConfig::NetStatus = "\"LIMSRV\""; } if(m_curState == QNETDEVCTL){ m_curState = QNETDEVSTATUS; } break; case Event_TEMP: str = string(pData); pos = str.find("soc-thermal"); if(pos > 0){ std::string socTmp = str.substr(pos+14,2); GlobalConfig::NR5GTemp = socTmp; print_info("NR5GTemp = %s\n",GlobalConfig::NR5GTemp.c_str()); } break; default: break; } } int Dial::recvData() { char szbuffer[200]={0x00}; int offSize = 0; int timeoutflag = 0; while(1) { char buff[1024]={0x00}; int ret = read_data(m_fd, buff, 1024, 10); if(ret <= 0){ timeoutflag ++; if(timeoutflag > 5) { timeoutflag = 0; const char *strQENG = "+QENG: "; const char *strQNETDEVCTL = "+QNETDEVCTL: "; const char *strQICSGP = "+QICSGP: "; const char *strQNETDEVSTATUS= "+QNETDEVSTATUS: "; const char *strQCFG= "+QCFG: "; const char *strCPIN= "+CPIN: "; const char *strERROR= "+CME ERROR: "; const char *strQTEMP= "+QTEMP: "; const char *strOK= "OK"; char data[128] = {0}; char *pdata = strstr((char*)szbuffer, strQENG); if(pdata){ strncpy(data, pdata+7, sizeof(data)); print_purple("strQENG = %s\n",data); parseData(Event_QENG,data); } pdata = strstr((char*)szbuffer, strQNETDEVCTL); if(pdata){ strncpy(data, pdata+13, sizeof(data)); print_purple("strQNETDEVCTL = %s\n",data); parseData(Event_QNETDEVCTL,data); } pdata = strstr((char*)szbuffer, strQICSGP); if(pdata){ strncpy(data, pdata+9, sizeof(data)); print_purple("strQICSGP = %s\n",data); parseData(Event_QICSGPAPN,data); } pdata = strstr((char*)szbuffer, strQNETDEVSTATUS); if(pdata){ strncpy(data, pdata+16, sizeof(data)); print_purple("strQNETDEVSTATUS = %s\n",data); parseData(Event_QNETDEVSTATUS,data); } pdata = strstr((char*)szbuffer, strQCFG); if(pdata){ strncpy(data, pdata+7, sizeof(data)); print_purple("strQCFG = %s\n",data); parseData(Event_QCFGNET,data); } pdata = strstr((char*)szbuffer, strCPIN); if(pdata){ strncpy(data, pdata+7, sizeof(data)); print_purple("strCPIN = %s\n",data); parseData(Event_CPIN,data); } pdata = strstr((char*)szbuffer, strQTEMP); if(pdata){ strncpy(data, pdata+8, sizeof(data)); print_purple("strQTEMP = %s\n",data); parseData(Event_TEMP,data); } pdata = strstr((char*)szbuffer, strERROR); if(pdata){ strncpy(data, pdata+12, sizeof(data)); print_purple("strERROR = %s\n",data); parseData(Event_ERROR,data); } pdata = strstr((char*)szbuffer, strOK); if(pdata){ parseData(Event_OK,data); } memset(szbuffer,0x00,sizeof(szbuffer)); offSize = 0; } usleep(100); }else if(ret > 0){ print_info("ret = %d,buff = %s\n",ret,buff); memcpy(szbuffer + offSize,buff,ret); offSize = offSize + ret; print_info("szbuffer = %s\n",szbuffer); continue; } usleep(500000); } } int Dial::queryPin() { int iRet = write_data(m_fd,"AT+CPIN?\r\n",12); } int Dial::configNet() { write_data(m_fd,"AT+QCFG=\"NAT\"\r\n",19); } int Dial::configApn() { m_APN = 1; std::string strAPN = ReadStrByOpt(SERVERCONFIG, "Server", "APN"); char szCmd[100]={0x00}; sprintf(szCmd,"AT+QICSGP=1,1,\"%s\",\"\",\"\",1\r\n",strAPN.c_str()); int iRet = write_data(m_fd,szCmd,strlen(strAPN.c_str()) + 34); print_info("configApn = %d,data = %s\n",iRet,szCmd); } int Dial::getCsq() { write_data(m_fd,"AT+QENG=\"servingcell\"\r\n",27); } int Dial::getTemp() { write_data(m_fd,"AT+QTEMP\r\n",12); } int Dial::conncectUSB() { int iRet = write_data(m_fd,"AT+QNETDEVCTL=1,1,1\r\n",23); print_info("conncectUSB = %d\n",iRet); } int Dial::dial5G() { while(1){ if(m_curState == CPIN){ queryPin(); } if(m_curState == QCFGNET){ configNet(); //configims(); } if(m_curState == QICSGPAPN){ configApn(); } if(m_curState == QENG){ getCsq(); } if(m_curState == QNETDEVCTL){ conncectUSB(); m_dial = 1; } if(m_curState == QNETDEVSTATUS){ write_data(m_fd,"AT+QNETDEVSTATUS=1\r\n",22); } if(m_curState == QDCHPC){ configdhcp(); m_curState = QENG; } sleep(5); getTemp(); sleep(15); } } int Dial::configims() { write_data(m_fd,"AT+QCFG=\"ims\",0\r\n",21); } int Dial::configdhcp() { system("busybox udhcpc -f -n -q -t 5 -i usb0"); } int Dial::setState() { m_curState = CPIN; } int Dial::closePort() { close(m_fd); }