Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

bluelink.cpp

00001 /*! 00002 @class BlueLink 00003 @brief Stellt die Verbindung zum Telephon bereit. 00004 @author Thomas Gemperli, <bluephone@gemperli.net> 00005 @version 1.0 00006 @date 2004-08-03 00007 @par This program is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU General Public License. 00009 @file bluelink.cpp 00010 */ 00011 00012 00013 #include "bluelink.h" 00014 00015 //FORTESTNG 00016 #include <unistd.h> 00017 #include <sys/types.h> 00018 #include <sys/wait.h> 00019 00020 00021 /** 00022 * BlueLink Konstruktor 00023 * Erstellt ein BlueLink Objekt. 00024 */ 00025 BlueLink::BlueLink() 00026 { 00027 m_port = NULL; 00028 m_communicate = false; 00029 m_connected = false; 00030 00031 } 00032 00033 00034 /** 00035 * BlueLink Destruktor 00036 */ 00037 BlueLink::~BlueLink() 00038 { 00039 } 00040 00041 00042 /** 00043 * Diese Methode liefet einen Pointer auf einen v24_port_t zurueck. 00044 * Siehe http://ezv24.sourceforge.net/api-html fuer weitere Informationen. 00045 */ 00046 v24_port_t* BlueLink::getPort() 00047 { 00048 return m_port; 00049 } 00050 00051 00052 /** 00053 * Diese Methode liefert den Status des Links zum Telephon zurueck. 00054 * Rueckgabewert: bool Status 00055 */ 00056 bool BlueLink::getState() 00057 { 00058 return m_connected; 00059 } 00060 00061 00062 /** 00063 * Diese Methode verbindet das rfcomm Device mit dem entfernten Bluetooth Device (dem Telephon). 00064 * Parameter: const QString& comDevice, btAddr 00065 */ 00066 int BlueLink::connectRfcomm(const QString& comDevice, const QString& btAddr) 00067 { 00068 /* setze das rfcomm Kommando zusammen. */ 00069 m_rfcommCommand = "/usr/bin/rfcomm connect "; 00070 m_rfcommCommand.append(comDevice); 00071 m_rfcommCommand.append(" "); 00072 m_rfcommCommand.append(btAddr); 00073 m_rfcommCommand.append(" 1"); 00074 00075 /* execve will Char Arrays sehen, keine QStrings. Deshalb die Umwandlung hier. */ 00076 const char *commandChar = m_rfcommCommand.latin1(); 00077 00078 pid_t child_pid; 00079 int child_status; 00080 00081 child_pid = fork(); 00082 00083 if(child_pid == 0) 00084 { 00085 /* Dieser Teil wird vom Kind Prozess ausgefuehrt. */ 00086 00087 execl("/bin/sh", "sh", "-c", commandChar, 0); 00088 00089 /* Falls execve zurueckkommt, ist etwas schiefgegangen. */ 00090 printf("Unknown command\n"); 00091 exit(0); 00092 } 00093 else 00094 { 00095 /* Dieser Teil wird vom Vater Prozess (BluePhone) ausgefuehrt. */ 00096 00097 return child_status; 00098 } 00099 } 00100 00101 00102 /** 00103 * Diese Methode trennt die rfcomm Verbindung mit dem Telephon. 00104 * Parameter: const QString& comDevice 00105 */ 00106 int BlueLink::disconnectRfcomm(const QString &comDevice) 00107 { 00108 /* setze das rfcomm Kommando zusammen. */ 00109 m_rfcommCommand = "/usr/bin/rfcomm release "; 00110 m_rfcommCommand.append(comDevice); 00111 00112 /* execve will Char Arrays sehen, keine QStrings. Deshalb die Umwandlung hier. */ 00113 const char *commandChar = m_rfcommCommand.latin1(); 00114 00115 pid_t child_pid; 00116 int child_status; 00117 00118 child_pid = fork(); 00119 00120 if(child_pid == 0) 00121 { 00122 /* Dieser Teil wird vom Kind Prozess ausgefuehrt. */ 00123 00124 execl("/bin/sh", "sh", "-c", commandChar, 0); 00125 00126 /* Falls execve zurueckkommt, ist etwas schiefgegangen. */ 00127 printf("Unknown command\n"); 00128 exit(0); 00129 } 00130 else 00131 { 00132 /* Dieser Teil wird vom Vater Prozess (BluePhone) ausgefuehrt. */ 00133 00134 return child_status; 00135 } 00136 } 00137 00138 00139 /** 00140 * Diese Methode erstellt die Verbindung zum Telephon. 00141 * Parameter: QString mit dem zu verwendenden Device, diese sind unter Linux normalerweise: 00142 * /dev/rfcomm0 fuer bluetooth, /dev/ircomm0 fuer IrDA oder /dev/ttyS0 fuer ein serielles Kabel 00143 */ 00144 void BlueLink::connecttoPhone(const QString &comDevice) 00145 { 00146 m_communicate = false; 00147 m_connected = false; 00148 00149 00150 m_communicate = true; 00151 /* ezv24 Port oeffnen. Siehe http://ezv24.sourceforge.net/api-html */ 00152 m_port = v24OpenPort(comDevice, V24_RTS_CTS); 00153 m_communicate = false; 00154 00155 /* Konnte der Port geoeffnet werden? */ 00156 if (m_port==NULL) 00157 { 00158 m_connected = false; 00159 } 00160 else 00161 { 00162 m_connected = true; 00163 00164 /* "New SMS Benachrichtigungs Modus" des Telephons abfragen. 00165 * Siehe AT Kommando Referenz Seite 93ff. 00166 */ 00167 m_phoneAnswer = talktoPhone(m_port, "at+cnmi=?\r"); 00168 m_phoneMode = m_phoneAnswer.join(":"); 00169 m_phoneMode = m_phoneMode.section(':',2,2); 00170 m_phoneMode = m_phoneMode.section('(',1,1); 00171 m_phoneMode = m_phoneMode.section(')',0,0); 00172 00173 /* Setze einen passenden Modus. T68/T610 sind gleich (2) */ 00174 if (m_phoneMode == "2") 00175 { 00176 m_phoneAnswer = talktoPhone(m_port, "at+cnmi=2,1,0,0\r"); 00177 } 00178 else if (m_phoneMode == "3") 00179 { 00180 m_phoneAnswer = talktoPhone(m_port, "at+cnmi=3,1,0,0\r"); 00181 } 00182 } 00183 } 00184 00185 00186 /** 00187 * Diese Methode trennt die Verbindung zum Telephon. 00188 */ 00189 void BlueLink::disconnectPhone() 00190 { 00191 00192 v24ClosePort(m_port); 00193 m_port = NULL; 00194 m_communicate = false; 00195 m_connected = false; 00196 00197 } 00198 00199 00200 /** 00201 * Diese Methode tauscht Informationen mit dem Telephon aus. 00202 * Parameter: v24_port_t* v24_port, QString Befehl . 00203 * Rueckgabewert: QStringList mit allen Antworten des Telephons. 00204 */ 00205 QStringList BlueLink::talktoPhone(v24_port_t *m_port, const QString &m_command) 00206 { 00207 /* 00208 * Beinhaltet die Antwort des Telephons. 00209 * Kann nicht im Header stehen, da wir den ersten Wert nicht zuweisen, sondern "hineinstreamen" (<<) 00210 * Wo genau der Fehler ist, weiss ich nicht (QT, Compiler?), auf alle Faelle bestaetigt der Debugger obriges. 00211 */ 00212 QStringList m_phoneTalk; 00213 /* Dasselbe gilt fuer die hier. */ 00214 QString m_phoneTmp; 00215 00216 /* Um die Ubersicht zu behalten, ist auch diese Variable nicht im Header definiert. 00217 * -> Alle Variablen dieser Methode sind hier im .cpp deklariert. 00218 */ 00219 int m_v24Value = 0; 00220 00221 /* Ein 80 Byte grosser Char Array, der den Rueckgabestring von v24Gets enthalten wird. */ 00222 char ansChar[80]; 00223 00224 /* ezV24 will Char Arrays sehen, keine QStrings. Deshalb die Umwandlung hier. */ 00225 const char *cmdChar = m_command.latin1(); 00226 00227 00228 /* Wir beginnen zu kommunizieren */ 00229 m_communicate = true; 00230 00231 /* Sende den Command String */ 00232 m_v24Value = v24Puts(m_port, cmdChar); 00233 00234 /* Wenn der Rueckgabewert von v24Puts kleiner ist, als die Laenge des uebergebenen Kommandos, ist etwas schiefgegangen. */ 00235 if (m_v24Value < strlen(cmdChar)) 00236 { 00237 m_communicate = false; 00238 m_phoneTalk << "ezv24Error"; 00239 return m_phoneTalk; 00240 } 00241 else 00242 { 00243 while((strncmp(ansChar, "OK", 2) != 0) && (strncmp(ansChar, "ERROR", 5) != 0)) 00244 { 00245 /* Empfange einen String. */ 00246 m_v24Value = v24Gets(m_port, ansChar, sizeof(ansChar)-1); 00247 00248 /* v24Gets liefert -1 zurueck, wenn etwas schiefgegangen ist. */ 00249 if (m_v24Value == -1) 00250 { 00251 m_communicate = false; 00252 m_phoneTalk << "ezv24Error"; 00253 return m_phoneTalk; 00254 } 00255 else 00256 { 00257 /* Durchsuche die Antwort nach 0en. Diese werden von Telephonen (GSM) als @ verwendet. Siehe AT Kommando Referenz. */ 00258 for (int i = 0; i < m_v24Value; i++) 00259 if (!ansChar[i]) 00260 { 00261 ansChar[i] = 0x80; 00262 } 00263 00264 m_phoneTmp.append(ansChar); 00265 00266 if (m_phoneTmp.right(1) == "\n") 00267 { 00268 m_phoneTalk << m_phoneTmp; 00269 m_phoneTmp = ""; 00270 } 00271 } 00272 } 00273 00274 m_communicate = false; 00275 return m_phoneTalk; 00276 } 00277 00278 } 00279 00280

Generated on Tue Aug 17 14:42:25 2004 for BluePhone by doxygen 1.3.7