/* using http://sourceforge.net/projects/libserial/ */ #include #include #include #include #include #include "SerialPort.h" #include "GsmModem.h" #include "util.h" #include "common.h" #include "SmsPdu.h" using namespace std; GsmModem::GsmModem(SerialPort& serialport) : m_port(serialport) { } string GsmModem::GetResponse() { SerialPort::DataBuffer buf; m_port.Read(buf); buf.push_back(0); std::string str((char*) &buf[0]); return str; } string GsmModem::Command(string command, string term) { time_t start,now; start = time(0); _timeout = false; if (term != "> ") command.append("\r"); //Dont append CarriageReturn if sending SMS m_port.Write(command); Util::Sleep(1); string response = GetResponse(); unsigned int tlen = term.length(); while ( 1 ) { if (response.length() >= tlen) { if (response.substr(response.length()-tlen,tlen) == term) break; } response += GetResponse(); Util::Sleep(1); now = time(0); if ( (now-start) > 10 ) { Common::instance()->logMessage( string("GsmModem::Command time out --") + command); Common::instance()->logMessage( string("Modem responded: ") + Util::str_trim(response) ); _timeout = true; break; } } Util::Sleep(5); return response; } vector GsmModem::ReadSms(bool readAll) { Command( "AT+CMGF=0" ); //Set SMS format to PDU const string search = "+CMGL: "; std::string cmd = "AT+CMGL"; if (readAll) cmd.append("=4"); string result = Command(cmd); vector retval; if (result.find(search) == string::npos) return retval; result = result.substr(2, result.length() - 8); //remove trailing "\r\nOK\r\n" and initial "\r\n" while ( 1 ) { unsigned int endpos = result.find(search,5); string sms_entry = result.substr(0,endpos); retval.push_back( SMS::FromPduString(sms_entry) );; if (endpos == string::npos) break; result = result.substr(endpos, result.length() - endpos); } return retval; } void GsmModem::SendSmsPdu(std::string pdu, int len) //pdu inclussive leading "00" { Common::instance()->logMessage( string("SMS pdu send") ); Command("AT+CMGF=0"); Util::Sleep(2); string line1 = "AT+CMGS="; line1.append( Util::str_formatint(len) ); line1.append("\r"); Command(line1,"> "); pdu.append("\032"); // \032 == Ctrl+Z Command( pdu ); Util::Sleep( 50 ); Common::instance()->smsCounter.outgoing++; } void GsmModem::SendSms(string to, string message, bool allowMultipart) { Common::instance()->logMessage( string("SMS send to ") + to); if (to.at(0) == '+') to.erase(0,0); vector pdu_vec = SmsPdu::CreateSmsPdu(to, message, allowMultipart); for (unsigned i=0; i sms = ReadSms(true); for (unsigned int i= 0; i