/[projects]/smsdaemon/ModemTransceiver.cpp
ViewVC logotype

Diff of /smsdaemon/ModemTransceiver.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

smsdaemon/GsmModem.cpp revision 67 by torben, Thu Jun 12 15:23:11 2008 UTC smsdaemon/ModemTransceiver.cpp revision 178 by torben, Fri Dec 12 12:13:05 2008 UTC
# Line 2  Line 2 
2   */   */
3    
4  #include <iostream>  #include <iostream>
   
5  #include <string>  #include <string>
6  #include <stdexcept>  #include <stdexcept>
7    
 #include <sys/time.h>  
8  #include <time.h>  #include <time.h>
9    
10    
11  #include "SerialPort.h"  #include "serialport/SerialPort.h"
12    
13  #include "GsmModem.h"  #include "ModemTransceiver.h"
14    
15  #include "util.h"  #include "Util.h"
16  #include "common.h"  #include "Common.h"
17    #include "Logger.h"
18    #include "ConfigFile.h"
19    
20  #include "SmsPdu.h"  #include "SmsPdu.h"
21    #include "SmsHelper.h"
22    #include "Exceptions.h"
23    
24  using namespace std;  using namespace std;
25    
26    
27    
28  GsmModem::GsmModem(SerialPort& serialport)  ModemTransceiver::ModemTransceiver(SerialPort& serialport)
29  : m_port(serialport)  : m_port(serialport)
30  {  {
31  }  }
32    
33    
34    
35  string GsmModem::GetResponse()  string ModemTransceiver::GetResponse()
36  {  {
37    
38          SerialPort::DataBuffer buf;          SerialPort::DataBuffer buf;
# Line 44  string GsmModem::GetResponse() Line 46  string GsmModem::GetResponse()
46  }  }
47    
48    
49  string GsmModem::Command(string command, string term)  string ModemTransceiver::Command(string command, string term)
50  {  {
51          time_t  start,now;          time_t  start,now;
52          start = time(0);          start = time(0);
# Line 73  string GsmModem::Command(string command, Line 75  string GsmModem::Command(string command,
75          now = time(0);          now = time(0);
76          if ( (now-start) > 10 )          if ( (now-start) > 10 )
77          {          {
78                  Common::instance()->logMessage( string("GsmModem::Command time out --") + command);                  Logger::logMessage( string("ModemTransceiver::Command time out --") + command);
79                            Logger::logMessage( string("Modem responded: ") + Util::str_trim(response) );
80                          _timeout = true;                          _timeout = true;
81              break;              break;
82          }          }
# Line 81  string GsmModem::Command(string command, Line 84  string GsmModem::Command(string command,
84    
85          Util::Sleep(5);          Util::Sleep(5);
86    
 //      cout  << response.length() << ":" << response << endl;  
 //      DumpString(response);  
87    
88          return response;          return response;
89  }  }
90    
91  vector<SMS> GsmModem::ReadSms(bool readAll)  vector<SMS> ModemTransceiver::ReadSms(bool readAll)
92  {  {
93    
94          Command( "AT+CMGF=1" ); //Set SMS format to text          Command( "AT+CMGF=0" ); //Set SMS format to PDU
95    
96          const string search = "+CMGL: ";          const string search = "+CMGL: ";
97          std::string cmd = "AT+CMGL";          std::string cmd = "AT+CMGL";
98          if (readAll)          if (readAll)
99                  cmd.append("=ALL");                  cmd.append("=4");
100    
101          string result = Command(cmd);          string result = Command(cmd);
102                                    
# Line 112  vector<SMS> GsmModem::ReadSms(bool readA Line 113  vector<SMS> GsmModem::ReadSms(bool readA
113    
114                                    
115                  string sms_entry = result.substr(0,endpos);                  string sms_entry = result.substr(0,endpos);
116                  retval.push_back( SMS::FromRawString(sms_entry) );;  
117                    try
118                    {
119                            SMS sms = SmsHelper::FromPduString(sms_entry);
120            
121                            retval.push_back( sms );
122                    }
123                    catch (smsnotfoundexception& e) //do nothing
124                    {
125                    }
126    
127                  if (endpos == string::npos)                  if (endpos == string::npos)
128                          break;                          break;
# Line 124  vector<SMS> GsmModem::ReadSms(bool readA Line 134  vector<SMS> GsmModem::ReadSms(bool readA
134  }  }
135    
136    
137  void GsmModem::SendSmsPdu(std::string pdu, int len) //pdu inclussive leading "00"  void ModemTransceiver::SendSmsPdu(std::string pdu, int len) //pdu inclussive leading "00"
138  {  {
139          Common::instance()->logMessage( string("SMS pdu send") );          Logger::logMessage( string("SMS pdu send") );
140    
141          Command("AT+CMGF=0");          Command("AT+CMGF=0");
142          Util::Sleep(2);          Util::Sleep(2);
# Line 144  void GsmModem::SendSmsPdu(std::string pd Line 154  void GsmModem::SendSmsPdu(std::string pd
154          Common::instance()->smsCounter.outgoing++;          Common::instance()->smsCounter.outgoing++;
155  }  }
156    
157  void GsmModem::SendSms(string to, string message, bool allowMultipart)  void ModemTransceiver::SendSms(string to, string message, bool allowMultipart)
158  {  {
159          Common::instance()->logMessage( string("SMS send to ") + to);          Logger::logMessage( string("SMS send to ") + to);
160    
161          if (to.at(0) == '+')          if (to.at(0) == '+')
162                  to.erase(0,0);                  to.erase(0,0);
163    
164          vector<PduInfo> pdu_vec = SmsPdu::CreateSmsPdu(to, message, allowMultipart);          vector<PduInfo> pdu_vec = SmsPdu::CreateSmsPdu(to, Util::str_latin2gsm(message), allowMultipart);
165    
166          for (unsigned i=0; i<pdu_vec.size(); ++i)          for (unsigned i=0; i<pdu_vec.size(); ++i)
167          {          {
# Line 159  void GsmModem::SendSms(string to, string Line 169  void GsmModem::SendSms(string to, string
169    
170                  SendSmsPdu(pdu.pdu, pdu.len);                  SendSmsPdu(pdu.pdu, pdu.len);
171          }          }
172            Logger::logMessage( "All PDU's send");
173    
174  }  }
175    
176  void GsmModem::DeleteSms(std::string smsIndex)  void ModemTransceiver::DeleteSms(std::string smsIndex)
177  {  {
178          string cmd = "AT+CMGD=";          string cmd = "AT+CMGD=";
179          cmd.append(smsIndex);          cmd.append(smsIndex);
180          Command(cmd);          Command(cmd);
181  }  }
182    
183  int  GsmModem::DeleteAllSms()  int  ModemTransceiver::DeleteAllSms()
184  {  {
185          vector<SMS> sms = ReadSms(true);          vector<SMS> sms = ReadSms(true);
186    
187          for (unsigned int i= 0; i<sms.size(); ++i)          for (unsigned int i= 0; i<sms.size(); ++i)
188          {          {
189                  DeleteSms( sms[i].sms_index);                  DeleteSms( sms[i].GetIndex() );
190          }          }
191          return sms.size();          return sms.size();
192  }  }
193    
194    
195    
196  void GsmModem::Init()  void ModemTransceiver::WaitForSimcard()
197    {
198            int start = time(0);
199            string result;
200    
201    
202            while (result != "^SSIM READY")
203            {
204                    result += GetResponse();
205                    result = Util::str_trim(result);
206    
207                    if ( (time(0) - start) > 10)
208                            throw std::runtime_error("Sim card timed out:");
209                    Util::Sleep(100);
210            }
211    
212    }
213    
214    void ModemTransceiver::HandlePincode()
215    {
216            string pin = Common::instance()->GetConfigfile()->GetValue("gsmmodem","pin");
217    
218            string result = Command("AT+CPIN?");
219            result = Util::str_trim(result);
220            result.erase(result.length() -2, 2); //remove trailing ok
221            result = Util::str_trim(result);
222            if (result != "+CPIN: READY")
223            {
224                    if (result == "+CPIN: SIM PIN")
225                    {
226                            Command("AT^SSET=1");
227                            result = Command( string("AT+CPIN=")+pin  );
228                            if ( result.substr(result.length()-4, 4) != "OK\r\n")
229                                    throw std::runtime_error(string("Illegal pincode: ") + result);
230                            
231                            WaitForSimcard();
232                    }
233                    else
234                    {
235                            throw std::runtime_error(string("AT+CPIN? returned unhandled code: ") + result);
236                    }
237    
238            }
239    }
240    
241    void ModemTransceiver::Init()
242  {  {
243          Command( "AT" );          Command( "AT" );
244          if (_timeout)          if (_timeout)
# Line 196  void GsmModem::Init() Line 252  void GsmModem::Init()
252    
253          Command ("AT^SM20=0,0" ); //No SM20 compability          Command ("AT^SM20=0,0" ); //No SM20 compability
254    
255          //Set RealTimeClock ??          //Command("AT+CGATT=1"); //GPRS Attach
           
         //Enter pin code ??  
 }  
   
   
256    
257            //Command("AT+CGSMS=2"); //SMS over GPRS preferred
258    
259  void DebugGsmModem::SendSms(std::string to, std::string message, bool allowMultipart)          HandlePincode();
 {  
         _to=to;  
         _message = message;  
         _multipart = allowMultipart;  
   
         if (_print)  
         {  
                 cout << "DebugGsmModem::SendSms --------------" << endl;  
                 cout << "To:        " << to << endl;;  
                 cout << "Message:   " << message << endl;  
                 cout << "Multipart: " << allowMultipart << endl;  
   
         }  
260  }  }
261    
262    

Legend:
Removed from v.67  
changed lines
  Added in v.178

  ViewVC Help
Powered by ViewVC 1.1.20