/[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 57 by torben, Wed Jun 11 16:08:37 2008 UTC smsdaemon/ModemTransceiver.cpp revision 158 by torben, Mon Dec 8 21:49:49 2008 UTC
# Line 2  Line 2 
2   */   */
3    
4  #include <iostream>  #include <iostream>
   
5  #include <string>  #include <string>
 #include <cstring>  
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    
19    #include "SmsPdu.h"
20    #include "SmsHelper.h"
21    
22  using namespace std;  using namespace std;
23    
24    
25    
26  GsmModem::GsmModem(SerialPort& serialport)  ModemTransceiver::ModemTransceiver(SerialPort& serialport)
27  : m_port(serialport)  : m_port(serialport)
28  {  {
29  }  }
30    
31    
32    
33  string GsmModem::GetResponse()  string ModemTransceiver::GetResponse()
34  {  {
35    
36          SerialPort::DataBuffer buf;          SerialPort::DataBuffer buf;
# Line 44  string GsmModem::GetResponse() Line 44  string GsmModem::GetResponse()
44  }  }
45    
46    
47  string GsmModem::Command(string command, string term)  string ModemTransceiver::Command(string command, string term)
48  {  {
49          time_t  start,now;          time_t  start,now;
50          start = time(0);          start = time(0);
# Line 73  string GsmModem::Command(string command, Line 73  string GsmModem::Command(string command,
73          now = time(0);          now = time(0);
74          if ( (now-start) > 10 )          if ( (now-start) > 10 )
75          {          {
76                  Common::instance()->logMessage( string("GsmModem::Command time out --") + command);                  Logger::logMessage( string("ModemTransceiver::Command time out --") + command);
77                            Logger::logMessage( string("Modem responded: ") + Util::str_trim(response) );
78                          _timeout = true;                          _timeout = true;
79              break;              break;
80          }          }
# Line 81  string GsmModem::Command(string command, Line 82  string GsmModem::Command(string command,
82    
83          Util::Sleep(5);          Util::Sleep(5);
84    
 //      cout  << response.length() << ":" << response << endl;  
 //      DumpString(response);  
85    
86          return response;          return response;
87  }  }
88    
89  vector<SMS> GsmModem::ReadSms(bool readAll)  vector<SMS> ModemTransceiver::ReadSms(bool readAll)
90  {  {
91    
92            Command( "AT+CMGF=0" ); //Set SMS format to PDU
93    
94          const string search = "+CMGL: ";          const string search = "+CMGL: ";
95          std::string cmd = "AT+CMGL";          std::string cmd = "AT+CMGL";
96          if (readAll)          if (readAll)
97                  cmd.append("=ALL");                  cmd.append("=4");
98    
99          string result = Command(cmd);          string result = Command(cmd);
100                                    
# Line 109  vector<SMS> GsmModem::ReadSms(bool readA Line 111  vector<SMS> GsmModem::ReadSms(bool readA
111    
112                                    
113                  string sms_entry = result.substr(0,endpos);                  string sms_entry = result.substr(0,endpos);
114                  retval.push_back( SMS::FromRawString(sms_entry) );;                  retval.push_back( SmsHelper::FromPduString(sms_entry) );;
115    
116                  if (endpos == string::npos)                  if (endpos == string::npos)
117                          break;                          break;
# Line 120  vector<SMS> GsmModem::ReadSms(bool readA Line 122  vector<SMS> GsmModem::ReadSms(bool readA
122          return retval;          return retval;
123  }  }
124    
125  void GsmModem::SendSms(string to, string message)  
126    void ModemTransceiver::SendSmsPdu(std::string pdu, int len) //pdu inclussive leading "00"
127  {  {
128          Common::instance()->logMessage( string("SMS send to ") + to);          Logger::logMessage( string("SMS pdu send") );
129    
130          Command("AT+CMGF=1");///Allways telling the format makes the application more stable          Command("AT+CMGF=0");
131          Util::Sleep(2);          Util::Sleep(2);
132    
133          string line1 = "AT+CMGS=";          string line1 = "AT+CMGS=";
134          line1.append(to);          line1.append( Util::str_formatint(len) );
135          line1.append("\r");          line1.append("\r");
136    
137    
138          Command(line1,"> ");          Command(line1,"> ");
139    
140          if (message.length() > 160)          pdu.append("\032"); // \032 == Ctrl+Z
141          {          Command( pdu );
142                  message = message.substr(0,160);          Util::Sleep( 50 );
143                  Common::instance()->logMessage( "Trunkating message! ");          Common::instance()->smsCounter.outgoing++;
144          }  }
145    
146          message.append("\032"); // \032 == Ctrl+Z  void ModemTransceiver::SendSms(string to, string message, bool allowMultipart)
147    {
148            Logger::logMessage( string("SMS send to ") + to);
149    
150          Command( message ); //In textmode limit to 160 bytes          if (to.at(0) == '+')
151                    to.erase(0,0);
152    
153            vector<PduInfo> pdu_vec = SmsPdu::CreateSmsPdu(to, Util::str_latin2gsm(message), allowMultipart);
154    
155            for (unsigned i=0; i<pdu_vec.size(); ++i)
156            {
157                    PduInfo& pdu = pdu_vec[i];
158    
159                    SendSmsPdu(pdu.pdu, pdu.len);
160            }
161            Logger::logMessage( "All PDU's send");
162    
         Util::Sleep(50); //Give the modem some time to send the sms and be ready again  
         Common::instance()->smsCounter.outgoing++;  
163  }  }
164    
165  void GsmModem::DeleteSms(std::string smsIndex)  void ModemTransceiver::DeleteSms(std::string smsIndex)
166  {  {
167          string cmd = "AT+CMGD=";          string cmd = "AT+CMGD=";
168          cmd.append(smsIndex);          cmd.append(smsIndex);
169          Command(cmd);          Command(cmd);
170  }  }
171    
172  int  GsmModem::DeleteAllSms()  int  ModemTransceiver::DeleteAllSms()
173  {  {
174          vector<SMS> sms = ReadSms(true);          vector<SMS> sms = ReadSms(true);
175    
176          for (unsigned int i= 0; i<sms.size(); ++i)          for (unsigned int i= 0; i<sms.size(); ++i)
177          {          {
178                  DeleteSms( sms[i].sms_index);                  DeleteSms( sms[i].GetIndex() );
179          }          }
180          return sms.size();          return sms.size();
181  }  }
182    
183    
184    
185  void GsmModem::Init()  void ModemTransceiver::WaitForSimcard()
186  {  {
187          Command( "ATZ" ); //Reset any previous setup          int start = time(0);
188            string result;
189    
190    
191            while (result != "^SSIM READY")
192            {
193                    result += GetResponse();
194                    result = Util::str_trim(result);
195    
196                    if ( (time(0) - start) > 10)
197                            throw std::runtime_error("Sim card timed out:");
198                    Util::Sleep(100);
199            }
200    
201    }
202    
203    void ModemTransceiver::HandlePincode()
204    {
205            string result = Command("AT+CPIN?");
206            result = Util::str_trim(result);
207            result.erase(result.length() -2, 2); //remove trailing ok
208            result = Util::str_trim(result);
209            if (result != "+CPIN: READY")
210            {
211                    if (result == "+CPIN: SIM PIN")
212                    {
213                            Command("AT^SSET=1");
214                            result = Command("AT+CPIN=0067");
215                            if ( result.substr(result.length()-4, 4) != "OK\r\n")
216                                    throw std::runtime_error(string("Illegal pincode: ") + result);
217                            
218                            WaitForSimcard();
219                    }
220                    else
221                    {
222                            throw std::runtime_error(string("AT+CPIN? returned unhandled code: ") + result);
223                    }
224    
225            }
226    }
227    
228    void ModemTransceiver::Init()
229    {
230            Command( "AT" );
231          if (_timeout)          if (_timeout)
232                  throw std::runtime_error("Modem did not respond!");                  throw std::runtime_error("Modem did not respond!");
233    
234            Command( "ATZ" ); //Reset any previous setup
235    
236          Command( "AT\\Q3" ); //Hardware flow control          Command( "AT\\Q3" ); //Hardware flow control
237    
238          Command( "ATE0" ); //Disable echo          Command( "ATE0" ); //Disable echo
239    
         Command( "AT+CMGF=1" ); //Set SMS format to text  
   
240          Command ("AT^SM20=0,0" ); //No SM20 compability          Command ("AT^SM20=0,0" ); //No SM20 compability
241    
242          //Set RealTimeClock ??          //Command("AT+CGATT=1"); //GPRS Attach
243            
244          //Enter pin code ??          //Command("AT+CGSMS=2"); //SMS over GPRS preferred
245    
246            HandlePincode();
247  }  }
248    
249    

Legend:
Removed from v.57  
changed lines
  Added in v.158

  ViewVC Help
Powered by ViewVC 1.1.20