297 lines
6.6 KiB
C++
297 lines
6.6 KiB
C++
/*
|
|
* Dial.cpp
|
|
*
|
|
* Created on: 2023年6月13日
|
|
* Author: chaos
|
|
*/
|
|
#include <stdio.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <termios.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#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);
|
|
}
|