|
@@ -16,9 +16,16 @@
|
|
|
#include <sys/timeb.h>
|
|
|
#include <netinet/in.h>
|
|
|
#include <unistd.h>
|
|
|
-#include "../../define.h"
|
|
|
+#include "define.h"
|
|
|
+
|
|
|
+//#define debug
|
|
|
+#define CheckModemInterval 30 //sec
|
|
|
+#define CheckSimInterval 10 //sec
|
|
|
+#define CheckConnectionInterval 5 //sec
|
|
|
+#define DisconnInterval 60 //sec
|
|
|
+
|
|
|
+
|
|
|
|
|
|
-//#define debug
|
|
|
|
|
|
struct SysConfigAndInfo *ShmSysConfigAndInfo;
|
|
|
struct StatusCodeData *ShmStatusCodeData;
|
|
@@ -178,6 +185,134 @@ int InitComPort(unsigned char ModemModel)
|
|
|
|
|
|
}
|
|
|
|
|
|
+void GetModelName(int Fd, unsigned char *ModelName)
|
|
|
+{
|
|
|
+ //AT command processing
|
|
|
+}
|
|
|
+
|
|
|
+void GetModelVersion(int Fd, unsigned char *ModelVersion)
|
|
|
+{
|
|
|
+ //AT command processing
|
|
|
+}
|
|
|
+
|
|
|
+void GetModelImei(int Fd, unsigned char *ModelImei)
|
|
|
+{
|
|
|
+ //AT command processing
|
|
|
+}
|
|
|
+
|
|
|
+void GetSimImsi(int Fd, unsigned char *SimImsi)
|
|
|
+{
|
|
|
+ //AT command processing
|
|
|
+}
|
|
|
+
|
|
|
+unsigned char GetModemMode(int Fd)
|
|
|
+{
|
|
|
+ int Mode;
|
|
|
+ //AT command processing
|
|
|
+ return Mode;
|
|
|
+}
|
|
|
+
|
|
|
+int GetSignalRssi(int Fd)
|
|
|
+{
|
|
|
+ int RssiValue;
|
|
|
+ //AT command processing
|
|
|
+ return RssiValue;
|
|
|
+}
|
|
|
+
|
|
|
+int GetPPP0Info(unsigned char *IPaddress)
|
|
|
+{
|
|
|
+ int fd,rd=0;
|
|
|
+ unsigned int address;
|
|
|
+ char buf[128],addr[32],*sptr,*eptr;
|
|
|
+
|
|
|
+
|
|
|
+ system("ifconfig ppp0 | grep \"inet addr:\" > /mnt/GetPPP0Info");
|
|
|
+ fd = open("/mnt/GetPPP0Info", O_RDONLY);
|
|
|
+ if(fd<0)
|
|
|
+ {
|
|
|
+ system("rm -f /mnt/GetPPP0Info");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(addr,0,sizeof(addr));
|
|
|
+ memset(buf,0,sizeof(buf));
|
|
|
+ rd=read(fd,buf,sizeof(buf));
|
|
|
+ if(rd<=0)
|
|
|
+ {
|
|
|
+ close(fd);
|
|
|
+ system("rm -f /mnt/GetPPP0Info");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ close(fd);
|
|
|
+ if((sptr=strstr(buf,"inet addr:"))==NULL)
|
|
|
+ {
|
|
|
+ close(fd);
|
|
|
+ system("rm -f /mnt/GetPPP0Info");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ sptr+=strlen("inet addr:");
|
|
|
+ if((eptr=strstr(buf," P-t-P:"))==NULL)
|
|
|
+ {
|
|
|
+ close(fd);
|
|
|
+ system("rm -f /mnt/GetPPP0Info");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ memset(IPaddress,0,strlen(IPaddress));
|
|
|
+ strncpy(IPaddress,sptr,eptr-sptr);
|
|
|
+ #ifdef SystemLogMessage
|
|
|
+ {
|
|
|
+ unsigned char Buffer[128];
|
|
|
+ memset(Buffer,0,sizeof(Buffer));
|
|
|
+ sprintf(Buffer,"[4gModem]GetPPP0Info: 4G IP Address = %s",IPaddress);
|
|
|
+ StoreLogMsg(Buffer);
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+int Load4gConfiguration()
|
|
|
+{
|
|
|
+ unsigned char CopyTmp[128];
|
|
|
+
|
|
|
+ if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomApn)<=0)
|
|
|
+ return 0;
|
|
|
+ system("cat /dev/null > /root/ppp/auto-apn.conf");
|
|
|
+ system("chmod 777 /root/ppp/auto-apn.conf");
|
|
|
+ system("cat /dev/null > /etc/ppp/options");
|
|
|
+ system("chmod 777 /etc/ppp/options");
|
|
|
+ system("cat /dev/null > /etc/ppp/pap-secrets");
|
|
|
+ system("chmod 777 /etc/ppp/pap-secrets");
|
|
|
+ system("cat /dev/null > /etc/ppp/chap-secrets");
|
|
|
+ system("chmod 777 /etc/ppp/chap-secrets");
|
|
|
+ memset(CopyTmp,0,sizeof(CopyTmp));
|
|
|
+ sprintf(CopyTmp,"echo \"APN=\"%s\"\" > /root/ppp/auto-apn.conf",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomApn);
|
|
|
+ system(CopyTmp);
|
|
|
+ system("echo \"ACCOUNT=\" >> /root/ppp/auto-apn.conf");
|
|
|
+ system("echo \"PASSWORD=\" >> /root/ppp/auto-apn.conf");
|
|
|
+
|
|
|
+ if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapId)>0)
|
|
|
+ {
|
|
|
+ memset(CopyTmp,0,sizeof(CopyTmp));
|
|
|
+ sprintf(CopyTmp,"echo \"name %s \" > /etc/ppp/options",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapId);
|
|
|
+ system(CopyTmp);
|
|
|
+
|
|
|
+ memset(CopyTmp,0,sizeof(CopyTmp));
|
|
|
+ sprintf(CopyTmp,"echo \"%s * %s \" > /etc/ppp/pap-secrets",
|
|
|
+ ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapId,
|
|
|
+ ((strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapPwd)>0)?ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapPwd : " "));
|
|
|
+ system(CopyTmp);
|
|
|
+
|
|
|
+ memset(CopyTmp,0,sizeof(CopyTmp));
|
|
|
+ sprintf(CopyTmp,"echo \"%s * %s \" > /etc/ppp/chap-secrets",
|
|
|
+ ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapId,
|
|
|
+ ((strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapPwd)>0)?ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapPwd : " "));
|
|
|
+ system(CopyTmp);
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+void ResetModem()
|
|
|
+{
|
|
|
+ //power cycle modem by GPIO
|
|
|
+}
|
|
|
/**************************************************************/
|
|
|
/************** main function********************************/
|
|
|
/*************************************************************/
|
|
@@ -185,6 +320,8 @@ int main(int argc,char *argv[])
|
|
|
{
|
|
|
unsigned char ModuleModel=0;//0: None, 1: Qutel, 2: ublox SARA-U201
|
|
|
int UsbFd=-1;
|
|
|
+ unsigned int StartTime,EndTime,Tmp;
|
|
|
+ unsigned char TmpIpAddr[16];
|
|
|
|
|
|
//Initialization
|
|
|
if(InitShareMemory()==0)
|
|
@@ -199,13 +336,20 @@ int main(int argc,char *argv[])
|
|
|
sleep(5);
|
|
|
return 0;
|
|
|
}
|
|
|
-
|
|
|
+ ResetModem();
|
|
|
+
|
|
|
+ReCheckModem:
|
|
|
+ //ResetModem();
|
|
|
+ UsbFd=-1;
|
|
|
+ ModuleModel=0;
|
|
|
+ Load4gConfiguration();
|
|
|
+
|
|
|
while(1)
|
|
|
{
|
|
|
ModuleModel=Check4GModem();
|
|
|
if(ModuleModel<=0)
|
|
|
{
|
|
|
- sleep(30);
|
|
|
+ sleep(CheckModemInterval);
|
|
|
continue;
|
|
|
}
|
|
|
if(UsbFd>0)
|
|
@@ -213,11 +357,110 @@ int main(int argc,char *argv[])
|
|
|
UsbFd=InitComPort(ModuleModel);
|
|
|
if(UsbFd<0)
|
|
|
{
|
|
|
- sleep(30);
|
|
|
+ sleep(CheckModemInterval);
|
|
|
continue;
|
|
|
}
|
|
|
- //processing...
|
|
|
-
|
|
|
+ /**** Record some modem information and dial up if SIM card ready ****/
|
|
|
+ memset(&ShmSysConfigAndInfo->SysConfig.TelecomInterface,0,sizeof(struct TeleConfigData));
|
|
|
+ while(1)
|
|
|
+ {
|
|
|
+ if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModelName)<=0)
|
|
|
+ GetModelName(UsbFd,ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModelName);
|
|
|
+ if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer)<=0)
|
|
|
+ GetModelVersion(UsbFd,ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer);
|
|
|
+ if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemImei)<=0)
|
|
|
+ GetModelImei(UsbFd,ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemImei);
|
|
|
+ GetSimImsi(UsbFd,ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi);
|
|
|
+ if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi)<=0)
|
|
|
+ {
|
|
|
+ ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimStatus=0;
|
|
|
+ sleep(CheckSimInterval);
|
|
|
+ if(Check4GModem()<=0)
|
|
|
+ goto ReCheckModem;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimStatus=1;
|
|
|
+ if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomApn)<=0)
|
|
|
+ {
|
|
|
+ sleep(DisconnInterval);
|
|
|
+ goto ReCheckModem;
|
|
|
+ }
|
|
|
+ system("killall 4GDetection");
|
|
|
+ sleep(2);
|
|
|
+ if(ModuleModel==1)
|
|
|
+ system("/root/ppp/4GDetection /dev/ttyUSB0 &");
|
|
|
+ else if(ModuleModel==2)
|
|
|
+ system("/root/ppp/4GDetection /dev/ttyACM0 &");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /***** Periodically check RSSI and connection*****/
|
|
|
+ StartTime=time((time_t*)NULL);
|
|
|
+ EndTime=time((time_t*)NULL);
|
|
|
+ while(1)
|
|
|
+ {
|
|
|
+ if((time((time_t*)NULL)-StartTime)>=CheckConnectionInterval)
|
|
|
+ {
|
|
|
+ //check IP address
|
|
|
+ memset(TmpIpAddr,0,sizeof(TmpIpAddr));
|
|
|
+ if(GetPPP0Info(TmpIpAddr)<=0)
|
|
|
+ {
|
|
|
+ ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn=0;
|
|
|
+ if((time((time_t*)NULL)-EndTime)>=DisconnInterval)
|
|
|
+ goto ReCheckModem;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn=1;
|
|
|
+ if(strstr(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress,TmpIpAddr)==NULL)
|
|
|
+ {
|
|
|
+ #ifdef SystemLogMessage
|
|
|
+ {
|
|
|
+ unsigned char Buffer[128];
|
|
|
+ memset(Buffer,0,sizeof(Buffer));
|
|
|
+ sprintf(Buffer,"[4gModem]main: 4G IP Address changed from %s to %s",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress,TmpIpAddr);
|
|
|
+ StoreLogMsg(Buffer);
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+ memset(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress,0,sizeof(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress));
|
|
|
+ strcpy(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress,TmpIpAddr);
|
|
|
+ system("route del default");
|
|
|
+ system("route add default dev ppp0");
|
|
|
+ }
|
|
|
+ EndTime=time((time_t*)NULL);
|
|
|
+ }
|
|
|
+ //check RSSI
|
|
|
+ Tmp=GetSignalRssi(UsbFd);
|
|
|
+ if(abs(Tmp-ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi)>=5)
|
|
|
+ {
|
|
|
+ #ifdef SystemLogMessage
|
|
|
+ {
|
|
|
+ unsigned char Buffer[128];
|
|
|
+ memset(Buffer,0,sizeof(Buffer));
|
|
|
+ sprintf(Buffer,"[4gModem]main: RSSI changed from %d to %d",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi,Tmp);
|
|
|
+ StoreLogMsg(Buffer);
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+ ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi=Tmp;
|
|
|
+ }
|
|
|
+ //check Mode
|
|
|
+ Tmp=GetModemMode(UsbFd);
|
|
|
+ if(Tmp!=ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemMode)
|
|
|
+ {
|
|
|
+ #ifdef SystemLogMessage
|
|
|
+ {
|
|
|
+ unsigned char Buffer[128];
|
|
|
+ memset(Buffer,0,sizeof(Buffer));
|
|
|
+ sprintf(Buffer,"[4gModem]main: Modem mode changed from %d to %d",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemMode,Tmp);
|
|
|
+ StoreLogMsg(Buffer);
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+ ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemMode=Tmp;
|
|
|
+ }
|
|
|
+ StartTime=time((time_t*)NULL);
|
|
|
+ }
|
|
|
+ }
|
|
|
}//main while loop
|
|
|
}
|
|
|
|