Knowledge Base Nr: 00236 sendsms.cpp - http://www.swe-kaiser.de

Downloads:

sms über gsm-modem (handy) verschicken

  
//weitere nützliche befehle und tools:
// - pduspy von www.nobbi.com
// - doku siehe www.nobbi.com
// - s35explorer
// - at+cmgl=4 'auflisten der gespeicherten sms
// - siemens s25: com1:19200,n,8,1 no handshake

int CHandySupport::SendPredefinedSMS(int nIndex)
{
//die sms müssen vorher im handy abgelegt werden (incl. nummer an die die sms verschickt wird)
m_com.Purge(); //klare verhältnisse schaffen

char szSend[MAXTELELEN] = {0};

sprintf(szSend, "at+cmss=%d\r", nIndex);
int nErr = m_com.Write(szSend, strlen(szSend));
if (nErr)
{
TRACE("LOGERR: Fehler (%d) beim Schreiben von '%s'!", nErr, szSend);
return HS_SEND_WRITE_ERROR;
}

char szRecv[MAX_RESPONSE_LEN] = {0};
char szAnswer[MAX_RESPONSE_LEN] = {0};
int nRecvLen = MAX_RESPONSE_LEN;

nErr = m_com.Read(szRecv, &nRecvLen, 10000, "\r\n");

nRecvLen = MAX_RESPONSE_LEN;
nErr = m_com.Read(szRecv, &nRecvLen, 5000, "\r\n");
if (nErr)
{
TRACE("LOGERR: Fehler (%d) beim Warten auf Antwort!", nErr);
return HS_SEND_READ_ERROR;
}
strcpy(szAnswer, "+CMSS:");
if (strstr(szRecv, szAnswer) == 0)
{
TRACE("LOGERR: Falsche Antwort <%s> statt <%s>", szRecv, szAnswer);
return HS_SEND_READ_ERROR;
}

nRecvLen = MAX_RESPONSE_LEN;
nErr = m_com.Read(szRecv, &nRecvLen, 5000, "\r\n");
nRecvLen = MAX_RESPONSE_LEN;
nErr = m_com.Read(szRecv, &nRecvLen, 5000, "\r\n");

return HS_OK;
}

//(doku siehe z.b. www.nobbi.com)
//(sonderzeichen werden nicht richtig dargestellt)
int CHandySupport::SendSMS(const char* lpszTelNr, const char* lpszText)
{
// tel: 01707723834 text: "Hallo Handy-Welt!"
// pdu: 0001000B811007773238F4000011C8309BFD0621C36E72BE752DB3E921

CString strPDU, strPDUNr, strTextPDU;

int nErr = ConvertTELNRtoPDU(lpszTelNr, strPDUNr.GetBuffer(1000));
strPDUNr.ReleaseBuffer();

nErr = ConvertASCIItoPDU(lpszText, strTextPDU.GetBuffer(1000));
strTextPDU.ReleaseBuffer();

m_com.Purge(); //klare verhältnisse schaffen

strPDU = strPDUNr + strTextPDU;

char szSend[MAXTELELEN] = {0};

sprintf(szSend, "at+cmgs=%d\r", strPDU.GetLength());
nErr = m_com.Write(szSend, strlen(szSend));
if (nErr)
{
TRACE("LOGERR: Fehler (%d) beim Schreiben von '%s'!", nErr, szSend);
return HS_SEND_WRITE_ERROR;
}

char szRecv[MAX_RESPONSE_LEN] = {0};
char szAnswer[MAX_RESPONSE_LEN] = {0};
int nRecvLen = MAX_RESPONSE_LEN;

nRecvLen = MAX_RESPONSE_LEN;
nErr = m_com.Read(szRecv, &nRecvLen, 5000, "\r\n");
if (nErr)
{
TRACE("LOGERR: Fehler (%d) beim Warten auf Antwort!", nErr);
return HS_SEND_READ_ERROR;
}
strcpy(szAnswer, "at+cmgs=");
if (strstr(szRecv, szAnswer) == 0)
{
TRACE("LOGERR: Falsche Antwort <%s> statt <%s>", szRecv, szAnswer);
return HS_SEND_READ_ERROR;
}

sprintf(szSend, "%s%c\r", (const char*)strPDU, 0x1a); //ctrl-z
nErr = m_com.Write(szSend, strlen(szSend));
if (nErr)
{
TRACE("LOGERR: Fehler (%d) beim Schreiben von '%s'!", nErr, szSend);
return HS_SEND_WRITE_ERROR;
}

nRecvLen = MAX_RESPONSE_LEN;
nErr = m_com.Read(szRecv, &nRecvLen, 5000, "\r\n");

nRecvLen = MAX_RESPONSE_LEN;
nErr = m_com.Read(szRecv, &nRecvLen, 5000, "\r\n");
strcpy(szAnswer, "+CMGS:");
if (strstr(szRecv, szAnswer) == 0)
{
TRACE("LOGERR: Falsche Antwort <%s> statt <%s>", szRecv, szAnswer);
return HS_SEND_READ_ERROR;
}

//leerzeile überlesen
nRecvLen = MAX_RESPONSE_LEN;
nErr = m_com.Read(szRecv, &nRecvLen, 5000, "\r\n");

return HS_OK;
}

char CHandySupport::ISOtoASCII(unsigned char cISO)
{
switch (cISO)
{
case 0x00: return '@';
case 0x02: return '$';
case 0x7b: return 'ä';
case 0x7c: return 'ö';
case 0x7e: return 'ü';
case 0x5b: return 'Ä';
case 0x5c: return 'Ö';
case 0x5e: return 'Ü';
}

return cISO;
}

unsigned char CHandySupport::ASCIItoISO(char cASCII)
{
//test: ABC 01234567890 äöüÄÖÜ@$!?"%&/()=<>,.-;:_ ende
switch (cASCII)
{
case '@': return 0x00;
case '$': return 0x02;
case 'ä': return 0x7b;
case 'ö': return 0x7c;
case 'ü': return 0x7e;
case 'Ä': return 0x5b;
case 'Ö': return 0x5c;
case 'Ü': return 0x5e;
}

return cASCII;
}

int CHandySupport::ConvertTELNRtoPDU(const char* lpszTelnr, char* szPDU)
{
//ascii: 01707723834
//pdu: 0001000B811007773238F40000

CString strTELNR(lpszTelnr), strPDU, strPDUNr;

for (int i=0; i<strTELNR.GetLength(); i+=2)
{
if (i+1<strTELNR.GetLength())
strPDUNr += strTELNR[i+1];
else
strPDUNr += 'F';
strPDUNr += strTELNR[i];
}

strPDU.Format("000100%02X81%s0000", strTELNR.GetLength(), (const char*)strPDUNr);

strcpy(szPDU, strPDU);
return HS_OK;
}

int CHandySupport::ConvertASCIItoPDU(const char* lpszAscii, char* szPDU)
{
*szPDU = 0;
CString strAscii(lpszAscii), strPDU, strBit;

//ascii: Das ist der test obs funzt 1234567890
//pdu: 25C4F01C949ED341E4B21C442FCFE9A0B7780E32D7DD7A3A28269BD16AB61B2E0703

//ascii -> pdu
//'A' -> '41'
//'AB' -> '4121'
//'ABC' -> '41E110'

//string umdrehen und nur septets (7 bit) verwenden
for (int i=strAscii.GetLength()-1; i>=0; i--)
{
strBit += ByteToSeptetBitString(ASCIItoISO(strAscii[i]));
}

int nSeptetsCount = strBit.GetLength() / 7;

//mit '0' füllen
int nFill = 8 - strBit.GetLength() % 8;
for (int n=nFill; n; n--)
strBit.Insert(0, '0');

CString strHex;

//wieder nach octets (8 bit) und hex-ascii wandeln
while (strBit.GetLength() > 0)
{
int nByte = 0;
if (strBit[0] == '1') nByte |= 0x80;
if (strBit[1] == '1') nByte |= 0x40;
if (strBit[2] == '1') nByte |= 0x20;
if (strBit[3] == '1') nByte |= 0x10;
if (strBit[4] == '1') nByte |= 0x08;
if (strBit[5] == '1') nByte |= 0x04;
if (strBit[6] == '1') nByte |= 0x02;
if (strBit[7] == '1') nByte |= 0x01;

strHex.Format("%02X", nByte);
strPDU.Insert(0, strHex);

strBit = strBit.Mid(8);
}

strHex.Format("%02X", nSeptetsCount);
strPDU.Insert(0, strHex);

strcpy(szPDU, strPDU);
return HS_OK;
}