📄 modemdriver.cpp
字号:
#include "globals.h"/*************************************************************************** CModemDriver.cpp - description ------------------- begin : Sun Apr 29 2001 copyright : (C) 2001 by Birdy57 (Stephane) email : birdy57@multimania.com ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include "modemdriver.h"#ifdef WITH_MODEM//#if defined(linux)#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <limits.h>#include <errno.h>#include <syslog.h>#include <signal.h>#include <sys/time.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>//#endif#include "string.h"CModemDriver::CModemDriver(){ m_sDEV = new char[30]; m_sInitString1 = new char[30]; m_sInitString2 = new char[30]; m_sPhoneNbr = new char[30]; m_sSpeed = new char[30]; m_sDialCommand = new char[30]; m_sCheckString = new char[30]; m_sConnectSpeed = new char[30]; m_sForceDetect = new char[30]; m_sFull = new char[30]; m_sAutoDev = new char[30]; m_sDevice = new char[30]; m_sUSR = new char[30]; m_sServerType = new char[30]; m_sServerLogin = new char[30]; m_sServerPass = new char[30]; m_cParam = new CParamConfig[17]; m_cParam[0].DriverClass = "CModemDriver"; m_cParam[0].Author = "Birdy57"; m_cParam[0].Msg = "Vers 0.5 Linux"; m_cParam[0].Guid = 0x1711; //xxyz y=systeme z=1 drivers in m_cParam[1].Request = "FullDuplex"; m_cParam[1].InitStr = m_sFull; m_cParam[1].Default = "No"; m_cParam[1].MaxBufferLen = 30; m_cParam[2].Request = "DeviceModem"; m_cParam[2].InitStr = m_sDEV; m_cParam[2].Default = "Auto"; m_cParam[2].MaxBufferLen = 30; m_cParam[3].Request = "InitStr1"; m_cParam[3].InitStr = m_sInitString1; m_cParam[3].Default = "AT&K3"; m_cParam[3].MaxBufferLen = 30; m_cParam[4].Request = "InitStr2"; m_cParam[4].InitStr = m_sInitString2; m_cParam[4].Default = "ATM0L0"; m_cParam[4].MaxBufferLen = 30; m_cParam[5].Request = "PhoneNbr"; m_cParam[5].InitStr = m_sPhoneNbr; m_cParam[5].Default = "0860880310"; m_cParam[5].MaxBufferLen = 30; m_cParam[6].Request = "ModemSpeed"; m_cParam[6].InitStr = m_sSpeed; m_cParam[6].Default = "Auto"; m_cParam[6].MaxBufferLen = 30; m_cParam[7].Request = "DialCommand"; m_cParam[7].InitStr = m_sDialCommand; m_cParam[7].Default = "ATDT"; m_cParam[7].MaxBufferLen = 30; m_cParam[8].Request = "CheckString"; m_cParam[8].InitStr = m_sCheckString; m_cParam[8].Default = SSTRING; m_cParam[8].MaxBufferLen = 30; m_cParam[9].Request = "*ConnectSpeed"; m_cParam[9].InitStr = m_sConnectSpeed; m_cParam[9].Default = "Unknow"; m_cParam[9].MaxBufferLen = 30; m_cParam[10].Request = "ForceDetect"; m_cParam[10].InitStr = m_sForceDetect; m_cParam[10].Default = "No"; m_cParam[10].MaxBufferLen = 30; m_cParam[11].Request = "AutoDetected"; m_cParam[11].InitStr = m_sAutoDev; m_cParam[11].Default = "/dev/ttyS0"; m_cParam[11].MaxBufferLen = 30; m_cParam[12].Request = "DialAt9600baud"; m_cParam[12].InitStr = m_sUSR; m_cParam[12].Default = "No"; m_cParam[12].MaxBufferLen = 30; m_cParam[13].Request = "ServerType"; m_cParam[13].InitStr = m_sServerType; m_cParam[13].Default = "French"; m_cParam[13].MaxBufferLen = 30; m_cParam[14].Request = "ServerLogin"; m_cParam[14].InitStr = m_sServerLogin; m_cParam[14].Default = "Auto"; m_cParam[14].MaxBufferLen = 30; m_cParam[15].Request = "ServerPass"; m_cParam[15].InitStr = m_sServerPass; m_cParam[15].Default = "Auto"; m_cParam[15].MaxBufferLen = 30; m_cParam[16].Request = NULL; //m_cParam[11].InitStr=NULL; m_cParam[16].Default = NULL; m_cParam[16].MaxBufferLen = 0; // on place dans des pointeurs utilisables m_bIsConnected = false; m_MutexR = false; m_MutexW = false; m_bAutoOk = false;}CModemDriver::~CModemDriver(){ delete m_sUSR; delete m_sDevice; delete m_sAutoDev; delete m_sFull; delete m_sDEV; delete m_sInitString1; delete m_sInitString2; delete m_sPhoneNbr; delete m_sSpeed; delete m_sDialCommand; delete m_sCheckString; delete m_sConnectSpeed; delete m_sForceDetect; delete m_sServerType; delete m_sServerLogin; delete m_sServerPass; delete[]m_cParam;}/** Demmarre la connection */bool CModemDriver::Connect(){ bool bRet = false; char ssLogin[200]; char ssPass[200]; char *sLogin; char *sPass; if (strstr(m_sServerType, "German") != NULL) { sLogin = "aolnet"; sPass = "A0L2aNet"; } else { sLogin = "aol"; sPass = "aol"; } if (strstr(m_sServerLogin, "Auto") == NULL) sLogin = m_sServerLogin; if (strstr(m_sServerPass, "Auto") == NULL) sLogin = m_sServerPass; sprintf((char *) &ssLogin, "%s\r", sLogin); sprintf((char *) &ssPass, "%s\r", sPass); // Determine si il est fullduplex ou non if (strstr(m_sFull, "Yes") != NULL) m_bFullDuplex = true; else m_bFullDuplex = false; // initialise le port if (InitPort()) // initialise le modem if (InitModem()) // Numerote if (Dial()) { m_cMsg->Printf("%C%M%t\n", 131); if (!WaitFor("ogin:", 8000, NULL, NULL)) { m_nErrorNbr = 13; } else if (write (m_nFdPort, (char *) &ssLogin, strlen((char *) &ssLogin)) < 0) { m_nErrorNbr = 14; } else if (!WaitFor("assword:", 8000, NULL, NULL)) { m_nErrorNbr = 13; } else if (write (m_nFdPort, (char *) &ssPass, strlen((char *) &ssPass)) < 0) { m_nErrorNbr = 14; } else if (!WaitFor("onnected", 8000, NULL, NULL)) { m_nErrorNbr = 13; } else { bRet = true; m_bIsConnected = true; if (strstr(m_sDevice, "ttyI") == NULL) { //tcdrain (m_nFdPort); //tcflush (m_nFdPort, TCIOFLUSH); fcntl(m_nFdPort, F_SETFL, 0); // modifie les param du modem t.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL); t.c_cflag |= CS8 | CREAD | HUPCL; t.c_iflag = IGNBRK | IGNPAR; t.c_oflag = 0; t.c_lflag = 0; t.c_cc[VMIN] = 1; t.c_cc[VTIME] = 0; t.c_cflag |= CRTSCTS; tcsetattr(m_nFdPort, TCSAFLUSH, &t); cfsetispeed(&t, m_nRealSpeed); // m_nRealSpeed auto-match to output speed cfsetospeed(&t, m_nRealSpeed); tcsetattr(m_nFdPort, TCSANOW, &t); tcdrain(m_nFdPort); tcsetattr(m_nFdPort, TCSANOW, &t); } else { fcntl(m_nFdPort, F_SETFL, 0); } } } if (!bRet) ClosePort(); return bRet;}/** Deconnection */bool CModemDriver::Disconnect(){ bool bRet = false; bRet = ClosePort(); m_bIsConnected = false; return bRet;}/** lecture */int CModemDriver::Read(char *pData, int nSize){ int nRet = ERROR;// Teste si mutex ou non while ((!m_bFullDuplex) && m_MutexR) usleep(1000); m_MutexR = true; if (!m_bIsConnected) { m_nErrorNbr = 15; } else if ((nRet = read(m_nFdPort, pData, (unsigned short) nSize)) < 0) { nRet = 0; } m_MutexR = false; return nRet;}/** ecriture sur le peripherique */int CModemDriver::Write(char *pData, int nSize){ int nRet = ERROR;// Teste si mutex ou non while ((!m_bFullDuplex) && m_MutexW) usleep(1000); m_MutexW = true; if (!m_bIsConnected) { m_nErrorNbr = 15; } else { nRet = write(m_nFdPort, pData, (unsigned short) nSize); } m_MutexW = false; return nRet;}/** Initialisation du Port */bool CModemDriver::InitPort(){ bool bRet = false; struct termios t, oldt; int i; FindAuto(); switch (nSpeed) { case 38400: m_nRealSpeed = B38400; break; case 57600: m_nRealSpeed = B57600; break; case 115200: m_nRealSpeed = B57600; break; default: m_nRealSpeed = B115200; break; } if ((m_sDEV == NULL) || (nSpeed == 0)) { m_nErrorNbr = 7; } else if ((m_nFdPort = open(m_sDevice, O_RDWR | O_NDELAY)) < 0) { m_nErrorNbr = 1; } else { m_bPortIsOpen = true; /* Lecture des parametres courants */ tcgetattr(m_nFdPort, &t); tcgetattr(m_nFdPort, &oldt);//kppp tcdrain(m_nFdPort); tcflush(m_nFdPort, TCIOFLUSH); if (strstr(m_sDevice, "ttyI") != NULL) t.c_cc[VMIN] = 1; // nonblocking else t.c_cc[VMIN] = 0; // nonblocking t.c_cc[VTIME] = 0; t.c_oflag = 0; t.c_lflag = 0; t.c_cflag &= ~(CSIZE | CSTOPB | PARENB); t.c_cflag |= CS8 | CREAD; t.c_cflag |= CLOCAL; // ignore modem status lines t.c_iflag = IGNBRK | IGNPAR /* | ISTRIP */ ; t.c_lflag &= ~ICANON; // non-canonical mode t.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHOKE); t.c_cflag |= CRTSCTS; cfgetispeed(&t); if (strstr(m_sUSR, "Yes") != NULL) { cfsetispeed(&t, B9600); // auto-match to output speed cfsetospeed(&t, B9600); } else { cfsetispeed(&t, m_nRealSpeed); // m_nRealSpeed auto-match to output speed cfsetospeed(&t, m_nRealSpeed); } tcsetattr(m_nFdPort, TCSANOW, &t);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -